diff --git a/APIDefinition/openapi.json b/APIDefinition/openapi.json new file mode 100644 index 0000000..92b9541 --- /dev/null +++ b/APIDefinition/openapi.json @@ -0,0 +1,156662 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Solution API", + "description": "The user-centered Solution API makes it possible to build customised energy applications.", + "version": "2.0.0", + "license": { + "name": "All rights reserved.", + "url": "https://www.gridx.ai/" + }, + "x-api-id": "ba9d6a25-ae1a-4ac8-af7a-70b76db17021", + "x-audience": "company-internal" + }, + "servers": [ + { + "url": "https://api.gridx.de" + }, + { + "description": "Production", + "url": "http://backend-internal.default.svc.cluster.local" + } + ], + "tags": [ + { + "name": "Accounts", + "x-displayName": "Accounts" + }, + { + "name": "Scan Configuration", + "x-displayName": "Scan Configuration" + }, + { + "name": "Account", + "x-displayName": "Account" + }, + { + "name": "Market Prices", + "x-displayName": "Market Prices" + }, + { + "name": "Token", + "x-displayName": "Token" + }, + { + "name": "System", + "x-displayName": "System" + }, + { + "name": "Group", + "x-displayName": "Group" + }, + { + "name": "User", + "x-displayName": "User" + }, + { + "name": "Notification", + "x-displayName": "Notification" + }, + { + "name": "Energy Tariff", + "x-displayName": "Energy Tariff" + }, + { + "name": "Asset", + "x-displayName": "Asset" + }, + { + "name": "Customer", + "x-displayName": "Customer" + }, + { + "name": "Gateway", + "x-displayName": "Gateway" + }, + { + "name": "GSP", + "x-displayName": "GSP" + }, + { + "name": "Import Power Limit", + "x-displayName": "Import Power Limit" + }, + { + "name": "Appliance", + "x-displayName": "Appliance" + }, + { + "name": "EV Charging Schedule", + "x-displayName": "EV Charging Schedule" + }, + { + "name": "EV Configuration", + "x-displayName": "EV Configuration" + }, + { + "name": "EV Profile", + "x-displayName": "EV Profile" + }, + { + "name": "Scan", + "x-displayName": "Scan" + }, + { + "name": "Job", + "x-displayName": "Job" + }, + { + "name": "TariffV2", + "x-displayName": "TariffV2" + }, + { + "name": "TimeOfUse", + "x-displayName": "TimeOfUse" + }, + { + "name": "Tag", + "x-displayName": "Tag" + }, + { + "name": "Power Limit Schedule", + "x-displayName": "Power Limit Schedule" + }, + { + "name": "Cluster", + "x-displayName": "Cluster" + }, + { + "name": "Policy", + "x-displayName": "Policy" + }, + { + "name": "Product Functionality", + "x-displayName": "Product Functionality" + }, + { + "name": "Product Option", + "x-displayName": "Product Option" + }, + { + "name": "Power Sequence", + "x-displayName": "Power Sequence" + }, + { + "name": "Star", + "x-displayName": "Star" + } + ], + "paths": { + "/accounts/{accountID}/scanconfiguration": { + "get": { + "summary": "Retrieve Scan Configuration", + "tags": [ + "Scan Configuration" + ], + "security": [ + { + "BearerAuth": [ + "ScanConfigurationRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "200": { + "description": "Scan configuration returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "The account ID the configuration belongs to.", + "readOnly": true + }, + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was updated the last time." + } + }, + "x-readme-ref-name": "ScanConfiguration" + } + } + } + }, + "404": { + "description": "Scan configuration not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/scanconfiguration \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/scanconfiguration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/scanconfiguration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create a Scan Configuration", + "tags": [ + "Scan Configuration" + ], + "security": [ + { + "BearerAuth": [ + "ScanConfigurationWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Creates a scan configuration.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "x-readme-ref-name": "ScanConfigurationSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ScanConfigurationSetStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Scan configuration created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "The account ID the configuration belongs to.", + "readOnly": true + }, + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was updated the last time." + } + }, + "x-readme-ref-name": "ScanConfiguration" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/accounts/accountID/scanconfiguration \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/scanconfiguration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/scanconfiguration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update a Scan Configuration", + "tags": [ + "Scan Configuration" + ], + "security": [ + { + "BearerAuth": [ + "ScanConfigurationWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Updates a scan configuration.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "x-readme-ref-name": "ScanConfigurationSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ScanConfigurationSetStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Scan configuration updated.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "The account ID the configuration belongs to.", + "readOnly": true + }, + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was updated the last time." + } + }, + "x-readme-ref-name": "ScanConfiguration" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/accounts/accountID/scanconfiguration \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/scanconfiguration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/scanconfiguration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete a Scan Configuration", + "tags": [ + "Scan Configuration" + ], + "security": [ + { + "BearerAuth": [ + "ScanConfigurationWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "204": { + "description": "Scan configuration deleted successfully." + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/accounts/accountID/scanconfiguration \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/scanconfiguration\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/scanconfiguration\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/scanconfiguration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/scanconfiguration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/account": { + "get": { + "summary": "Retrieve the authenticated Account", + "description": "Get the account that is currently logged in.", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountRead" + ] + } + ], + "responses": { + "200": { + "description": "Account returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/account \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update the authenticated Account", + "description": "Update the user data of the authenticated account.", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountWrite" + ] + } + ], + "requestBody": { + "description": "Updates an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AccountUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Account updated.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/account \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/account/market-prices/{platform}": { + "get": { + "summary": "Retrieve energy market prices for the authenticated account", + "deprecated": true, + "description": "List energy market prices for the given interval. Prices are fetched from an external energy market\nplatform.\nFor the given interval, the hourly prices of the second to last day and for the last day are returned in a 60M resolution.\nFor all the other days in the interval, the average daily price is returned.\nFor example, in order to get hourly prices for the current day and the day before, set the **end** of the interval to the current day.\n\n**Deprecated** - Use `/systems/{systemID}/tariff/prices` instead.\n", + "tags": [ + "Market Prices" + ], + "security": [ + { + "BearerAuth": [ + "MarketPricesRead" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "platform", + "required": true, + "schema": { + "type": "string" + }, + "example": "entso-e", + "description": "Specifies an external platform to receive the energy market prices from (currently only one supported).\n- \"entso-e\": Fetch prices from ENTSO-E Transparency Platform.\n" + }, + { + "in": "query", + "name": "domain", + "required": false, + "schema": { + "type": "string" + }, + "description": "Specifies an Area-Code which is currently in use of the European markets.\n\nIf set, the default bidding zone set in the account is ignored.\nMore details about the bidding zones, can be found [here](https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html#_areas).\n", + "example": "10Y1001A1001A82H" + }, + { + "in": "query", + "name": "interval", + "description": "Requested time interval for fetching prices in UTC.", + "required": true, + "example": "2020-09-21T00:00:00Z/2022-09-23T00:00:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + }, + { + "in": "query", + "name": "timezone", + "description": "Timezone in which all related times should be loaded before being returned.", + "required": true, + "schema": { + "type": "string" + }, + "example": "Europe/Berlin" + } + ], + "responses": { + "200": { + "description": "Energy market prices returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Energy Market Data", + "type": "object", + "properties": { + "priceUnit": { + "type": "string", + "description": "Currency unit which the prices are (ct/kWh).", + "example": "EUR/MWh" + }, + "averagePriceDay": { + "type": "number", + "format": "double", + "description": "Average price of the second to last day in EUR/MWh.", + "example": 33.6 + }, + "periodStart": { + "type": "string", + "description": "Starting date at which the prices are fetched in RFC3339 format.", + "example": "2020-09-24T00:00:00Z" + }, + "periodEnd": { + "type": "string", + "description": "Ending date at which the prices are fetched in RFC3339 format.", + "example": "2022-09-27T00:00:00Z" + }, + "totalPrices": { + "description": "Contains an array of arrays in the format [time, price].\n\nThe fetched prices are in the following order:\n* Average prices for each day between [PeriodStart, SecondToLastDay].\n* Prices for the second to last day from the given interval with resolution 1h.\n* Price for the last day of the given interval with resolution 1h.\n", + "type": "array", + "items": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "example": [ + [ + "2022-09-25T22:00:00Z", + 2.5 + ], + [ + "2022-09-25T23:00:00Z", + 1 + ], + [ + "2022-09-26T00:00:00Z", + 2 + ], + [ + "2022-09-26T01:00:00Z", + 3 + ], + [ + "2022-09-26T02:00:00Z", + 4 + ], + [ + "2022-09-26T23:00:00Z", + 1 + ], + [ + "2022-09-27T00:00:00Z", + 2 + ], + [ + "2022-09-27T01:00:00Z", + 3 + ], + [ + "2022-09-27T02:00:00Z", + 4 + ] + ] + } + }, + "x-readme-ref-name": "EnergyMarketData" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/market-prices/platform\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/account/market-prices/platform \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/market-prices/platform\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/market-prices/platform\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/market-prices/platform\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/market-prices/platform\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/market-prices/platform\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/account/tokens": { + "get": { + "summary": "Get API tokens", + "description": "Retrieve all the organizational API tokens for the currently authenticated account.", + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "GetAPITokens" + ] + } + ], + "parameters": [ + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "sort", + "description": "Sort results based on a key.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "created_at" + } + ], + "responses": { + "200": { + "description": "All the organizational API tokens of the current account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + } + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found." + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tokens\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/account/tokens \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tokens\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tokens\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tokens\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tokens\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tokens\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create an organizational API token", + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "APITokenWrite" + ] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "OrganizationalAPITokenCreation", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + } + ], + "x-readme-ref-name": "APITokenCreation" + }, + { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Used to specify the email address associated with the user responsible for the organizational token upon its creation (account email is used by default).", + "example": "john@doe.com" + }, + "groups": { + "type": "array", + "description": "Used to specify the permissions assigned to the organizational token.", + "items": { + "type": "string", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + } + } + } + ], + "x-readme-ref-name": "OrganizationalAPITokenCreation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "OrganizationalAPITokenCreationStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Organizational API token created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "OrganizationalAPITokenWithSecret", + "allOf": [ + { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + }, + { + "properties": { + "token": { + "type": "string", + "description": "This token can be used for authenticating further requests as an alternative to Bearer Authentication.\n\nExample: Set the header field `Authorization` to `Token gxo_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0`. \nTo set the permissions of it, you can assign a group to the newly created associated organizational user, see `userID`.\n\n**ATTENTION**: Please keep the token secret and treat it like a password! The token is only available immediately after creation and can not be retrieved again afterwards.\n", + "example": "gxo_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0" + } + }, + "required": [ + "token" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPITokenWithSecret" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tokens\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/account/tokens \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tokens\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tokens\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tokens\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tokens\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tokens\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/account/tokens/{tokenID}": { + "get": { + "summary": "Get an organizational API token", + "description": "Retrieve the given organizational API token for the currently authenticated account.", + "parameters": [ + { + "name": "tokenID", + "in": "path", + "description": "Identifier of the token.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "218e8795-2442-42d7-901b-1588373e527f" + } + ], + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "GetAPIToken" + ] + } + ], + "responses": { + "200": { + "description": "API token", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tokens/tokenID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/account/tokens/tokenID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tokens/tokenID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tokens/tokenID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tokens/tokenID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Partially update an organizational API token", + "description": "Partially update the organizational API token of the currently authenticated account.", + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "UpdateAPIToken" + ] + } + ], + "parameters": [ + { + "name": "tokenID", + "in": "path", + "description": "Identifier of the token to be updated.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "218e8795-2442-42d7-901b-1588373e527f" + } + ], + "requestBody": { + "description": "The new API token", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "OrganizationalAPITokenStrict" + } + } + } + }, + "responses": { + "200": { + "description": "The full representation of the token after the partial update on success.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tokens/tokenID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/account/tokens/tokenID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tokens/tokenID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tokens/tokenID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tokens/tokenID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete organizational API token", + "description": "Remove a given organizational API token from the currently authenticated account.", + "tags": [ + "Token" + ], + "parameters": [ + { + "name": "tokenID", + "in": "path", + "description": "Identifier of the token.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "218e8795-2442-42d7-901b-1588373e527f" + } + ], + "security": [ + { + "BearerAuth": [ + "DeleteAPIToken" + ] + } + ], + "responses": { + "204": { + "description": "API token deleted successfully" + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tokens/tokenID\"\n\nresponse = requests.delete(url)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/account/tokens/tokenID" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tokens/tokenID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID\")\n .delete(null)\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID\")\n .delete(null)\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tokens/tokenID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tokens/tokenID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/account/tokens/{tokenID}/rotate": { + "post": { + "summary": "Rotate an existing organizational API token", + "description": "Rotates a non-expired organizational API token for the given token ID.\nThe current expiry date is extended by the value specified in the `lifetime` parameter (if specified).\nThe token's permissions remain unchanged.\n", + "parameters": [ + { + "name": "tokenID", + "in": "path", + "description": "Identifier of the token.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "218e8795-2442-42d7-901b-1588373e527f" + }, + { + "name": "lifetime", + "description": "Life time to add to the current expiry date.", + "required": false, + "in": "query", + "example": "1D", + "schema": { + "type": "string", + "enum": [ + "1D", + "1W", + "1M", + "1Y" + ] + } + } + ], + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "RotateAPIToken" + ] + } + ], + "responses": { + "201": { + "description": "New API token", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "OrganizationalAPITokenWithSecret", + "allOf": [ + { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + }, + { + "properties": { + "token": { + "type": "string", + "description": "This token can be used for authenticating further requests as an alternative to Bearer Authentication.\n\nExample: Set the header field `Authorization` to `Token gxo_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0`. \nTo set the permissions of it, you can assign a group to the newly created associated organizational user, see `userID`.\n\n**ATTENTION**: Please keep the token secret and treat it like a password! The token is only available immediately after creation and can not be retrieved again afterwards.\n", + "example": "gxo_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0" + } + }, + "required": [ + "token" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPITokenWithSecret" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "API token not found" + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tokens/tokenID/rotate\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/account/tokens/tokenID/rotate \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tokens/tokenID/rotate\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID/rotate\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tokens/tokenID/rotate\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tokens/tokenID/rotate\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tokens/tokenID/rotate\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts": { + "get": { + "summary": "List all Accounts", + "description": "List accounts that are accessible to the authenticated user.", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountsRead" + ] + } + ], + "parameters": [ + { + "name": "kind", + "description": "Account kind.", + "in": "query", + "example": "b2b", + "schema": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ] + } + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + } + ], + "responses": { + "200": { + "description": "Accounts returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create an Account", + "description": "Create a new account for the authenticated user. The child account will inherit the authenticated accounts information.", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountsWrite" + ] + } + ], + "requestBody": { + "description": "Creates an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. If not set, defaults to the authenticated account." + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "default": "b2b", + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKindWithDefault" + }, + "groups": { + "type": "array", + "description": "the IDs of the policy groups that the account should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AccountCreateStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Account created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/accounts \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}": { + "get": { + "summary": "Retrieve an Account", + "description": "Get an Account by its ID. Make sure you have the necessary permissions.", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountsRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "200": { + "description": "Account returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update an Account", + "description": "Update an Account's information. Make sure you have the necessary permissions.", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountsWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Updates an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AccountUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Account updated.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/accounts/accountID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete an Account", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountsWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "204": { + "description": "Account deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/accounts/accountID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/parent": { + "patch": { + "summary": "Move account to different parent.", + "description": "Moves a b2b account (and all its resources) into a target b2b account that is accessible to the authenticated user. \nA b2b account is an account with `kind=\"b2b\"`\n", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "MoveAccountsWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Move an account into the target account with the provided targetID.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Move Account", + "type": "object", + "required": [ + "targetID" + ], + "properties": { + "targetID": { + "description": "AccountID of the target account that the account should be moved into.", + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + } + }, + "x-readme-ref-name": "MoveAccount" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "MoveAccountStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Moved account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "400": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/parent\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/accounts/accountID/parent \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/parent\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/parent\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/parent\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/parent\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/parent\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/accounts": { + "get": { + "summary": "List all nested Accounts", + "description": "List all child accounts of the given account that are accessible to the authenticated user.", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "NestedAccountsRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "kind", + "description": "Account kind.", + "in": "query", + "example": "b2b", + "schema": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ] + } + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + } + ], + "responses": { + "200": { + "description": "Accounts returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/accounts\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/accounts \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/accounts\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/accounts\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/accounts\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/accounts\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/accounts\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/systems": { + "get": { + "summary": "List Account's Systems", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemsRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "embed", + "description": "Describes which embedded fields of the system should be populated.", + "deprecated": true, + "in": "query", + "schema": { + "type": "string", + "enum": [ + "user" + ] + } + } + ], + "responses": { + "200": { + "description": "Systems returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + }, + { + "properties": { + "users": { + "description": "The users belonging to this system.\nOnly set if `embed` query parameter includes `user`.\n", + "type": "array", + "readOnly": true, + "items": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + } + } + } + } + ], + "x-readme-ref-name": "SystemWithUsers" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/systems\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/systems \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/systems\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/systems\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/systems\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/systems\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/systems\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Assign a System to an Account", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "AccountsWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Assign a system (and its customers) to an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "System-Account assignment", + "type": "object", + "required": [ + "uuids" + ], + "properties": { + "moveSystemsAndCustomers": { + "description": "- `true`: Moves the system from the origin account to the target account (accountID parameter) and its parent accounts. The customers that belong to that account are also moved to the target account.\n- `false`: Assigns the system to the target account (accountID parameter) and its parent accounts.\n", + "type": "boolean" + }, + "moveVendorID": { + "description": "`true` by default when moveSystemsAndCustomers is `true`.\n - `true`: Updates the vendorID of the gateway of the specified system to the target accountID.\n - `false`: Does not update the vendorID of the gateway of the specified system.\n", + "type": "boolean" + }, + "uuids": { + "description": "System IDs that will be moved to the target account.", + "type": "array", + "items": { + "type": "string", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + } + }, + "x-readme-ref-name": "SystemAccountAssignment" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemAccountAssignmentStrict" + } + } + } + }, + "responses": { + "200": { + "description": "System assigned to account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/systems\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/accounts/accountID/systems \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/systems\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/systems\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/systems\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/systems\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/systems\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Unassign a System from an Account", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "AccountsWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Unassings a system (and its customers) from an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "title": "System-Account unassignment", + "type": "object", + "required": [ + "uuids" + ], + "properties": { + "moveSystemsAndCustomers": { + "description": "- `true`: Unassigns the system from the given account (accountID parameter). Moves the customer account to the parent account of the account the system is unassigned from (accountID parameter).\n- `false`: Unassigns the system from the given account (accountID parameter).\n", + "type": "boolean" + }, + "moveVendorID": { + "description": "`true` by default when moveSystemsAndCustomers is `true`.\n\n - `true`: Updates the vendorID of the gateway of the specified system to the target accounts' parentID.\n - `false`: Does not update the vendorID of the gateway of the specified system.\n", + "type": "boolean" + }, + "uuids": { + "description": "System IDs that will be removed from the target account.", + "type": "array", + "items": { + "type": "string", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + } + }, + "x-readme-ref-name": "SystemAccountUnAssignment" + } + } + } + }, + "responses": { + "200": { + "description": "System unassigned from account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/systems\"\n\npayload = {\n \"moveSystemsAndCustomers\": True,\n \"moveVendorID\": True,\n \"uuids\": [\"aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc\"]\n}\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.delete(url, json=payload, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/accounts/accountID/systems \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"moveSystemsAndCustomers\": true,\n \"moveVendorID\": true,\n \"uuids\": [\n \"aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc\"\n ]\n}\n'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/systems\"\n\n\tpayload := strings.NewReader(\"{\\\"moveSystemsAndCustomers\\\":true,\\\"moveVendorID\\\":true,\\\"uuids\\\":[\\\"aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc\\\"]}\")\n\n\treq, _ := http.NewRequest(\"DELETE\", url, payload)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nMediaType mediaType = MediaType.parse(\"application/json\");\nRequestBody body = RequestBody.create(mediaType, \"{\\\"moveSystemsAndCustomers\\\":true,\\\"moveVendorID\\\":true,\\\"uuids\\\":[\\\"aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc\\\"]}\");\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/systems\")\n .delete(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval mediaType = MediaType.parse(\"application/json\")\nval body = RequestBody.create(mediaType, \"{\\\"moveSystemsAndCustomers\\\":true,\\\"moveVendorID\\\":true,\\\"uuids\\\":[\\\"aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc\\\"]}\")\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/systems\")\n .delete(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet parameters = [\n \"moveSystemsAndCustomers\": true,\n \"moveVendorID\": true,\n \"uuids\": [\"aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc\"]\n] as [String : Any?]\n\nlet postData = try JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/systems\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\nrequest.httpBody = postData\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/systems\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddJsonBody(\"{\\\"moveSystemsAndCustomers\\\":true,\\\"moveVendorID\\\":true,\\\"uuids\\\":[\\\"aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc\\\"]}\", false);\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/groups": { + "get": { + "summary": "List all Groups", + "tags": [ + "Group" + ], + "security": [ + { + "BearerAuth": [ + "GroupsRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "200": { + "description": "Policy groups of the account returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/groups\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/groups \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/groups\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/groups\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/groups\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create a Group", + "tags": [ + "Group" + ], + "security": [ + { + "BearerAuth": [ + "GroupsWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Creates a policy group and related documents.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "policies": { + "type": "array", + "description": "the ID's of the policy documents that the group should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + } + }, + "required": [ + "name" + ] + } + ], + "x-readme-ref-name": "PolicyGroupCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyGroupCreateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Policy group created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/groups\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/accounts/accountID/groups \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/groups\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/groups\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/groups\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/groups/{groupID}": { + "get": { + "summary": "Retrieve a Group", + "tags": [ + "Group" + ], + "security": [ + { + "BearerAuth": [ + "GroupsRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "groupID", + "description": "Unique identifier that can be used to access policy groups.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "200": { + "description": "Policy group returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + }, + { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "properties": { + "deliveryAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customerID": { + "type": "string", + "description": "Uniquely identifies the customer." + }, + "meterID": { + "type": "string" + }, + "wizardCompleted": { + "type": "boolean", + "description": "True if the wizard has been completed." + }, + "lastRequestAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the last request has been made by the customer. This field might not be always up-to-date and it might take some time for changes to be propagated.", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "AbstractCustomer" + } + ], + "x-readme-ref-name": "CustomerWithoutAuth" + } + } + } + } + ], + "x-readme-ref-name": "PolicyGroupWithCustomers" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/groups/groupID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/groups/groupID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/groups/groupID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups/groupID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups/groupID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/groups/groupID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/groups/groupID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "tags": [ + "Group" + ], + "summary": "Delete a Group", + "security": [ + { + "BearerAuth": [ + "GroupsWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "groupID", + "description": "Unique identifier that can be used to access policy groups.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "204": { + "description": "Policy group deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/groups/groupID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/accounts/accountID/groups/groupID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/groups/groupID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups/groupID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups/groupID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/groups/groupID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/groups/groupID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/groups/{groupID}/policies": { + "get": { + "summary": "Get Policy Documents in a Group", + "tags": [ + "Group" + ], + "security": [ + { + "BearerAuth": [ + "GroupsRead", + "PoliciesRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "groupID", + "description": "Unique identifier that can be used to access policy groups.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "200": { + "description": "Policy documents returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/groups/groupID/policies\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/groups/groupID/policies \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/groups/groupID/policies\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups/groupID/policies\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/groups/groupID/policies\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/groups/groupID/policies\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/groups/groupID/policies\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/users/{userID}": { + "delete": { + "summary": "Delete User", + "description": "Delete a user given its ID.", + "tags": [ + "User" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "delete-auth0", + "description": "If set to `false`, it does not delete the user from Auth0.\n", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true + }, + "example": false + } + ], + "responses": { + "204": { + "description": "User deleted." + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/accounts/accountID/users/userID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/users/{userID}/notifications": { + "get": { + "summary": "List all Notifications", + "description": "Lists all notification for a user.\n\nUser ID may be explicitly specified as a path parameter,\notherwise the authenticated user will be used.\n", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "unread", + "description": "List only unread notifications.", + "in": "query", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Notifications returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID/notifications\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/users/userID/notifications \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID/notifications\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID/notifications\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID/notifications\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/users/{userID}/notifications/{notificationID}": { + "get": { + "summary": "Retrieve a Notification", + "description": "Returns a notification by its ID.\n", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "notificationID", + "description": "Unique identifier that can be used to access notifications.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "200": { + "description": "Notification returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID/notifications/notificationID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/users/userID/notifications/notificationID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID/notifications/notificationID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/notificationID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/notificationID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID/notifications/notificationID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/notificationID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/users/{userID}/notifications/rules": { + "get": { + "summary": "List all Rules", + "description": "Lists all rules for the user.\n\nThe user and account may be specified explicitly via path parameters or implicitly via the authentication context. Explicitly specified values take precedence.\n", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "200": { + "description": "Notification rules returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "NotificationsRule" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/users/userID/notifications/rules \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create a Rule", + "description": "Creates a new rule.\n\nThe user and account may be specified explicitly via path parameters or implicitly via the authentication context. Explicitly specified values take precedence.\n", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "requestBody": { + "description": "Creates a notification rule.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationsRuleSetStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Notifications rule returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "NotificationsRule" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/accounts/accountID/users/userID/notifications/rules \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/users/{userID}/notifications/rules/{ruleID}": { + "get": { + "summary": "Retrieve a Rule", + "description": "Returns a rule specified by its ID.\n\nThe user and account may be specified explicitly via path parameters or implicitly via the authentication context. Explicitly specified values take precedence.\n", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "ruleID", + "description": "Unique identifier that can be used to access notification rules.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "200": { + "description": "Notifications rule returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "NotificationsRule" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "put": { + "summary": "Update a Rule", + "description": "Updates a rule specified by its ID.\n\nThe user and account may be specified explicitly via path parameters or implicitly via the authentication context. Explicitly specified values take precedence.\n", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "ruleID", + "description": "Unique identifier that can be used to access notification rules.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "requestBody": { + "description": "Updates a notification rule.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationsRuleSetStrict" + } + } + } + }, + "responses": { + "204": { + "description": "Notification rule updated successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.put(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PUT \\\n --url https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\"\n\n\treq, _ := http.NewRequest(\"PUT\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")\n .put(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")\n .put(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PUT\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PutAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete a Rule", + "description": "Deletes a rule specified by its ID.\n\nThe user and account may be specified explicitly via path parameters or implicitly via the authentication context. Explicitly specified values take precedence.\n", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "AccountsUsersWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "ruleID", + "description": "Unique identifier that can be used to access notification rules.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "204": { + "description": "Notification rule deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/users/userID/notifications/rules/ruleID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/parents": { + "get": { + "summary": "List all parent accounts", + "description": "Lists all parent accounts starting at the passed account until root.\n", + "tags": [ + "Account" + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "200": { + "description": "Account parents sorted hierarchical.\nThe first item is the parent of the passed account. \nThe next is the parent of the parent of the passed account. \n", + "content": { + "application/json": { + "example": [ + { + "accountID": "parent" + }, + { + "accountID": "parent-parent", + "audience": "my-audience" + }, + { + "accountID": "root" + } + ], + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "accountID": { + "type": "string" + }, + "audience": { + "type": "string" + } + }, + "required": [ + "accountID" + ] + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "security": [], + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/parents\"\n\nheaders = {\"accept\": \"application/json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/parents \\\n --header 'accept: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/parents\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/parents\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/parents\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/parents\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/parents\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/bidding-zone": { + "get": { + "summary": "Get bidding zone", + "description": "Get the electricity market bidding zone of the given accountID.\n", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "200": { + "description": "Bidding zone of the account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "type": "object", + "description": "The bidding zone determines from which electricity market bidding zone the raw market prices for\nmarket data tariffs are used.\n\nThe bidding zone is the ENTSOE-E Area EIC codes (Y).\nSee https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/ & https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/\nfor available codes.\n", + "properties": { + "biddingZone": { + "example": "10Y1001A1001A44P", + "type": "string" + } + }, + "required": [ + "biddingZone" + ], + "x-readme-ref-name": "AbstractBiddingZone" + }, + { + "type": "object", + "properties": { + "biddingZone": { + "nullable": true + } + } + } + ], + "x-readme-ref-name": "BiddingZone" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/bidding-zone\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/bidding-zone \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/bidding-zone\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/bidding-zone\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/bidding-zone\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/bidding-zone\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/bidding-zone\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "put": { + "summary": "Set bidding zone", + "description": "Set the electricity market bidding zone of the given accountID.\n", + "tags": [ + "Account" + ], + "security": [ + { + "BearerAuth": [ + "AccountWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "required": true, + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "type": "object", + "description": "The bidding zone determines from which electricity market bidding zone the raw market prices for\nmarket data tariffs are used.\n\nThe bidding zone is the ENTSOE-E Area EIC codes (Y).\nSee https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/ & https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/\nfor available codes.\n", + "properties": { + "biddingZone": { + "example": "10Y1001A1001A44P", + "type": "string" + } + }, + "required": [ + "biddingZone" + ], + "x-readme-ref-name": "AbstractBiddingZone" + }, + { + "type": "object", + "properties": { + "biddingZone": { + "nullable": false + } + } + } + ], + "x-readme-ref-name": "BiddingZoneSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "BiddingZoneSetStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Bidding zone of the account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "type": "object", + "description": "The bidding zone determines from which electricity market bidding zone the raw market prices for\nmarket data tariffs are used.\n\nThe bidding zone is the ENTSOE-E Area EIC codes (Y).\nSee https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/ & https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/\nfor available codes.\n", + "properties": { + "biddingZone": { + "example": "10Y1001A1001A44P", + "type": "string" + } + }, + "required": [ + "biddingZone" + ], + "x-readme-ref-name": "AbstractBiddingZone" + }, + { + "type": "object", + "properties": { + "biddingZone": { + "nullable": true + } + } + } + ], + "x-readme-ref-name": "BiddingZone" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/bidding-zone\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/vnd.gridx.v2+json\"\n}\n\nresponse = requests.put(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PUT \\\n --url https://api.gridx.de/accounts/accountID/bidding-zone \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/bidding-zone\"\n\n\treq, _ := http.NewRequest(\"PUT\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/bidding-zone\")\n .put(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/bidding-zone\")\n .put(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/bidding-zone\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PUT\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/vnd.gridx.v2+json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/bidding-zone\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/vnd.gridx.v2+json\");\nvar response = await client.PutAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/account/tariffs": { + "get": { + "summary": "List Energy Tariffs", + "deprecated": true, + "description": "List all available energy tariffs of the account.\n\n**Deprecated** - Use TariffV2 instead.\n", + "tags": [ + "Energy Tariff" + ], + "security": [ + { + "BearerAuth": [ + "AccountTariffRead" + ] + } + ], + "responses": { + "200": { + "description": "All available energy tariffs.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "Energy Tariff", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID to identify the energy tariff.", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829d33", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom" + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "periods": { + "type": "array", + "items": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + } + } + }, + "x-readme-ref-name": "EnergyTariff" + } + ] + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tariffs\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/account/tariffs \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tariffs\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tariffs\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tariffs\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create Energy Tariff", + "deprecated": true, + "description": "Create an energy tariff for the account.\n\n**Deprecated** - Use TariffV2 instead.\n", + "tags": [ + "Energy Tariff" + ], + "security": [ + { + "BearerAuth": [ + "AccountTariffWrite" + ] + } + ], + "requestBody": { + "description": "Energy tariff to be created for the account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Energy Tariff", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID to identify the energy tariff.", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829d33", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom" + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "periods": { + "type": "array", + "items": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + } + } + }, + "x-readme-ref-name": "EnergyTariff" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EnergyTariffStrict" + } + } + } + }, + "responses": { + "201": { + "description": "The created tariff.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Energy Tariff", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID to identify the energy tariff.", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829d33", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom" + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "periods": { + "type": "array", + "items": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + } + } + }, + "x-readme-ref-name": "EnergyTariff" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tariffs\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/account/tariffs \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tariffs\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tariffs\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tariffs\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/account/tariffs/{tariffID}": { + "get": { + "summary": "Get Energy Tariff", + "deprecated": true, + "description": "Get the specified energy tariff of the account.\n\n**Deprecated** - Use TariffV2 instead.\n", + "parameters": [ + { + "name": "tariffID", + "description": "Unique identifier for the energy tariff.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "tags": [ + "Energy Tariff" + ], + "security": [ + { + "BearerAuth": [ + "AccountTariffRead" + ] + } + ], + "responses": { + "200": { + "description": "The specified energy tariff.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Energy Tariff", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID to identify the energy tariff.", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829d33", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom" + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "periods": { + "type": "array", + "items": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + } + } + }, + "x-readme-ref-name": "EnergyTariff" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Tariff not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tariffs/tariffID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/account/tariffs/tariffID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tariffs/tariffID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs/tariffID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs/tariffID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tariffs/tariffID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tariffs/tariffID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update Energy Tariff", + "deprecated": true, + "description": "Update the specified energy tariff of the account.\n\n**Deprecated** - Use TariffV2 instead.\n", + "parameters": [ + { + "name": "tariffID", + "description": "Unique identifier for the energy tariff.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "tags": [ + "Energy Tariff" + ], + "security": [ + { + "BearerAuth": [ + "AccountTariffWrite" + ] + } + ], + "responses": { + "200": { + "description": "The updated energy tariff.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Energy Tariff", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID to identify the energy tariff.", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829d33", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom" + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "periods": { + "type": "array", + "items": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + } + } + }, + "x-readme-ref-name": "EnergyTariff" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Tariff not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tariffs/tariffID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/account/tariffs/tariffID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tariffs/tariffID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs/tariffID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs/tariffID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tariffs/tariffID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tariffs/tariffID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete Energy Tariff", + "deprecated": true, + "description": "Delete the specified energy tariff of the account.\n\n**Deprecated** - Use TariffV2 instead.\n", + "parameters": [ + { + "name": "tariffID", + "description": "Unique identifier for the energy tariff.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "tags": [ + "Energy Tariff" + ], + "security": [ + { + "BearerAuth": [ + "AccountTariffWrite" + ] + } + ], + "responses": { + "204": { + "description": "Tariff has been deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Tariff not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/account/tariffs/tariffID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/account/tariffs/tariffID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/account/tariffs/tariffID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs/tariffID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/account/tariffs/tariffID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/account/tariffs/tariffID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/account/tariffs/tariffID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/customers": { + "get": { + "summary": "List all Customers", + "tags": [ + "Customer" + ], + "security": [ + { + "BearerAuth": [ + "CustomersRead" + ] + } + ], + "parameters": [ + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "sort", + "description": "Sort results based on a key.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "created_at" + }, + { + "name": "order", + "description": "Order direction of the results, to be used in combination with `sort` parameter.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "desc" + } + ], + "responses": { + "200": { + "description": "Customers returned", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Customer Account", + "description": "Represents an end-customer account.", + "type": "object", + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + { + "properties": { + "kind": { + "example": "end-user" + } + } + } + ], + "x-readme-ref-name": "CustomerAccount" + } + } + } + } + }, + "401": { + "description": "Unauthorized.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Unauthorized", + "description": "The client isn't authorized to access the requested resource.", + "example": { + "message": "Unauthorized" + } + } + ], + "x-readme-ref-name": "UnauthorizedException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/customers\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/customers \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/customers\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/customers\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/customers\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/customers\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/customers\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/customers/{accountID}": { + "get": { + "summary": "Get Customer", + "description": "Get a single customer given its account ID.", + "tags": [ + "Customer" + ], + "security": [ + { + "BearerAuth": [ + "CustomersRead" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "200": { + "description": "Customer returned", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Customer Account", + "description": "Represents an end-customer account.", + "type": "object", + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + { + "properties": { + "kind": { + "example": "end-user" + } + } + } + ], + "x-readme-ref-name": "CustomerAccount" + } + } + } + }, + "400": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/customers/accountID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/customers/accountID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/customers/accountID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/customers/accountID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/customers/accountID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/customers/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/customers/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Edit a single customer", + "tags": [ + "Customer" + ], + "security": [ + { + "BearerAuth": [ + "CustomersWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "requestBody": { + "description": "Updates an end-customer account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "CustomerAccountUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "CustomerAccountUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Customers updated", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Customer Account", + "description": "Represents an end-customer account.", + "type": "object", + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + { + "properties": { + "kind": { + "example": "end-user" + } + } + } + ], + "x-readme-ref-name": "CustomerAccount" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/customers/accountID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/customers/accountID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/customers/accountID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/customers/accountID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/customers/accountID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/customers/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/customers/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete Customer", + "description": "Delete a customer given its ID.", + "tags": [ + "Customer" + ], + "security": [ + { + "BearerAuth": [ + "CustomersWrite" + ] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "delete-auth0", + "description": "If set to `false`, it does not delete the user from Auth0.\n", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true + }, + "example": false + } + ], + "responses": { + "204": { + "description": "Customer deleted." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/customers/accountID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/customers/accountID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/customers/accountID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/customers/accountID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/customers/accountID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/customers/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/customers/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/customers/{customerID}/users": { + "get": { + "summary": "List Customer's users", + "description": "Get a list of all users that belong to this customer.", + "tags": [ + "Customer" + ], + "security": [ + { + "BearerAuth": [ + "CustomersUsersRead" + ] + } + ], + "parameters": [ + { + "name": "customerID", + "description": "customerID is universally unique identifier (UUID V4) used identify a\ncustomer in our backend.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "37874c1b-d073-4b06-bf01-a1497fbe1142" + }, + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "sort", + "description": "Sort results based on a key.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "created_at" + }, + { + "name": "order", + "description": "Order direction of the results, to be used in combination with `sort` parameter.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "desc" + } + ], + "responses": { + "200": { + "description": "Users returned", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/customers/customerID/users\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/customers/customerID/users \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/customers/customerID/users\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/customers/customerID/users\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/customers/customerID/users\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/customers/customerID/users\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/customers/customerID/users\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/gateways/{gatewayID}/import-power-limit": { + "get": { + "summary": "Retrieve gateway's current import power limit.", + "tags": [ + "Import Power Limit" + ], + "security": [ + { + "BearerAuth": [ + "SystemsRead" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + ], + "responses": { + "200": { + "description": "Import power limit returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + }, + "x-readme-ref-name": "AbstractImportPowerLimit" + }, + { + "properties": { + "internalDeviceID": { + "type": "string", + "description": "Unique ID to identify the gateway the import power limit belongs to.", + "example": "aeb639cf0793e81f0804c6647af7f0900a847921c0596726f1afdfd04a3a3186", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the import power limit was updated in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "numberOfPhases", + "internalDeviceID", + "createdAt", + "updatedAt", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "importEVMarginTotal", + "importEVMarginPhase", + "maxImportEVMarginL1", + "maxImportEVMarginL2", + "maxImportEVMarginL3", + "maxImportEVWorstCase", + "maxImportEVWorstCaseL1", + "maxImportEVWorstCaseL2", + "maxImportEVWorstCaseL3" + ] + } + ], + "x-readme-ref-name": "ImportPowerLimit" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Import power limit not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "put": { + "summary": "Set gateway's import power limit.", + "tags": [ + "Import Power Limit" + ], + "security": [ + { + "BearerAuth": [ + "SystemsWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + ], + "requestBody": { + "description": "Set a gateway's import power limit.", + "required": true, + "content": { + "application/json": { + "schema": { + "x-readme-ref-name": "ImportPowerLimitSet", + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Import power limit set.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + }, + "x-readme-ref-name": "AbstractImportPowerLimit" + }, + { + "properties": { + "internalDeviceID": { + "type": "string", + "description": "Unique ID to identify the gateway the import power limit belongs to.", + "example": "aeb639cf0793e81f0804c6647af7f0900a847921c0596726f1afdfd04a3a3186", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the import power limit was updated in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "numberOfPhases", + "internalDeviceID", + "createdAt", + "updatedAt", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "importEVMarginTotal", + "importEVMarginPhase", + "maxImportEVMarginL1", + "maxImportEVMarginL2", + "maxImportEVMarginL3", + "maxImportEVWorstCase", + "maxImportEVWorstCaseL1", + "maxImportEVWorstCaseL2", + "maxImportEVWorstCaseL3" + ] + } + ], + "x-readme-ref-name": "ImportPowerLimit" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\"\n\npayload = {\n \"numberOfPhases\": 3,\n \"maxImportTotal\": 0,\n \"maxImportL1\": 0,\n \"maxImportL2\": 0,\n \"maxImportL3\": 0,\n \"importEVMarginTotal\": 0,\n \"importEVMarginPhase\": 0,\n \"maxImportEVMarginL1\": 0,\n \"maxImportEVMarginL2\": 0,\n \"maxImportEVMarginL3\": 0,\n \"maxImportEVWorstCase\": 0,\n \"maxImportEVWorstCaseL1\": 0,\n \"maxImportEVWorstCaseL2\": 0,\n \"maxImportEVWorstCaseL3\": 0\n}\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.put(url, json=payload, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PUT \\\n --url https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"numberOfPhases\": 3,\n \"maxImportTotal\": 0,\n \"maxImportL1\": 0,\n \"maxImportL2\": 0,\n \"maxImportL3\": 0,\n \"importEVMarginTotal\": 0,\n \"importEVMarginPhase\": 0,\n \"maxImportEVMarginL1\": 0,\n \"maxImportEVMarginL2\": 0,\n \"maxImportEVMarginL3\": 0,\n \"maxImportEVWorstCase\": 0,\n \"maxImportEVWorstCaseL1\": 0,\n \"maxImportEVWorstCaseL2\": 0,\n \"maxImportEVWorstCaseL3\": 0\n}\n'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\"\n\n\tpayload := strings.NewReader(\"{\\\"numberOfPhases\\\":3,\\\"maxImportTotal\\\":0,\\\"maxImportL1\\\":0,\\\"maxImportL2\\\":0,\\\"maxImportL3\\\":0,\\\"importEVMarginTotal\\\":0,\\\"importEVMarginPhase\\\":0,\\\"maxImportEVMarginL1\\\":0,\\\"maxImportEVMarginL2\\\":0,\\\"maxImportEVMarginL3\\\":0,\\\"maxImportEVWorstCase\\\":0,\\\"maxImportEVWorstCaseL1\\\":0,\\\"maxImportEVWorstCaseL2\\\":0,\\\"maxImportEVWorstCaseL3\\\":0}\")\n\n\treq, _ := http.NewRequest(\"PUT\", url, payload)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nMediaType mediaType = MediaType.parse(\"application/json\");\nRequestBody body = RequestBody.create(mediaType, \"{\\\"numberOfPhases\\\":3,\\\"maxImportTotal\\\":0,\\\"maxImportL1\\\":0,\\\"maxImportL2\\\":0,\\\"maxImportL3\\\":0,\\\"importEVMarginTotal\\\":0,\\\"importEVMarginPhase\\\":0,\\\"maxImportEVMarginL1\\\":0,\\\"maxImportEVMarginL2\\\":0,\\\"maxImportEVMarginL3\\\":0,\\\"maxImportEVWorstCase\\\":0,\\\"maxImportEVWorstCaseL1\\\":0,\\\"maxImportEVWorstCaseL2\\\":0,\\\"maxImportEVWorstCaseL3\\\":0}\");\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")\n .put(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval mediaType = MediaType.parse(\"application/json\")\nval body = RequestBody.create(mediaType, \"{\\\"numberOfPhases\\\":3,\\\"maxImportTotal\\\":0,\\\"maxImportL1\\\":0,\\\"maxImportL2\\\":0,\\\"maxImportL3\\\":0,\\\"importEVMarginTotal\\\":0,\\\"importEVMarginPhase\\\":0,\\\"maxImportEVMarginL1\\\":0,\\\"maxImportEVMarginL2\\\":0,\\\"maxImportEVMarginL3\\\":0,\\\"maxImportEVWorstCase\\\":0,\\\"maxImportEVWorstCaseL1\\\":0,\\\"maxImportEVWorstCaseL2\\\":0,\\\"maxImportEVWorstCaseL3\\\":0}\")\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")\n .put(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet parameters = [\n \"numberOfPhases\": 3,\n \"maxImportTotal\": 0,\n \"maxImportL1\": 0,\n \"maxImportL2\": 0,\n \"maxImportL3\": 0,\n \"importEVMarginTotal\": 0,\n \"importEVMarginPhase\": 0,\n \"maxImportEVMarginL1\": 0,\n \"maxImportEVMarginL2\": 0,\n \"maxImportEVMarginL3\": 0,\n \"maxImportEVWorstCase\": 0,\n \"maxImportEVWorstCaseL1\": 0,\n \"maxImportEVWorstCaseL2\": 0,\n \"maxImportEVWorstCaseL3\": 0\n] as [String : Any?]\n\nlet postData = try JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PUT\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\nrequest.httpBody = postData\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddJsonBody(\"{\\\"numberOfPhases\\\":3,\\\"maxImportTotal\\\":0,\\\"maxImportL1\\\":0,\\\"maxImportL2\\\":0,\\\"maxImportL3\\\":0,\\\"importEVMarginTotal\\\":0,\\\"importEVMarginPhase\\\":0,\\\"maxImportEVMarginL1\\\":0,\\\"maxImportEVMarginL2\\\":0,\\\"maxImportEVMarginL3\\\":0,\\\"maxImportEVWorstCase\\\":0,\\\"maxImportEVWorstCaseL1\\\":0,\\\"maxImportEVWorstCaseL2\\\":0,\\\"maxImportEVWorstCaseL3\\\":0}\", false);\nvar response = await client.PutAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete gateway's import power limit.", + "tags": [ + "Import Power Limit" + ], + "security": [ + { + "BearerAuth": [ + "SystemsWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + ], + "responses": { + "204": { + "description": "Import power limit deleted successfully!" + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/gateways/gatewayID/import-power-limit\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems": { + "get": { + "summary": "List all Systems", + "description": "List systems that are accessible to the authenticated user.", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemsRead" + ] + } + ], + "parameters": [ + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "embed", + "description": "Describes which embedded fields of the system should be populated.", + "deprecated": true, + "in": "query", + "schema": { + "type": "string", + "enum": [ + "user" + ] + } + } + ], + "responses": { + "200": { + "description": "An array of systems of up to `per_page` systems.\n\nEach entry in the array is a separate system. If no system is available, the resulting array will be empty.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + }, + { + "properties": { + "users": { + "description": "The users belonging to this system.\nOnly set if `embed` query parameter includes `user`.\n", + "type": "array", + "readOnly": true, + "items": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + } + } + } + } + ], + "x-readme-ref-name": "SystemWithUsers" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create a System", + "description": "Creates a System.", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemsWrite" + ] + } + ], + "requestBody": { + "description": "The body of a system creation request.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "type": "object", + "properties": { + "priorities": { + "readOnly": true + }, + "curtailmentStrategy": { + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "SystemCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemCreateStrict" + } + } + } + }, + "responses": { + "201": { + "description": "The created system.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/systems \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}": { + "get": { + "summary": "Retrieve a System", + "description": "Retrieves the details of an existing system.", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemsRead" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "include", + "description": "This query param allows to set certain fields only when needed.\nThis makes the request faster as it requires to load only necessary data.\n\nIf this param is set, only the specified fields are included.\nAll other fields, which are possible to include, will be excluded then.\n\nIf you want to include multiple fields, comma-separate them. \n", + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "gateways", + "accounts", + "location", + "priorities", + "appliancePriorities", + "status", + "parentID", + "visibleFields", + "visibleAppliances", + "productOption" + ] + } + } + } + ], + "responses": { + "200": { + "description": "Returned system.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update a System", + "description": "Updates the specific system by setting the values of the body parameters.\n\nAny parameters not provided will be left unchanged.\n", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemsWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "description": "Modified System.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "type": "object", + "properties": { + "productOption": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + } + } + } + } + ], + "x-readme-ref-name": "SystemUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemUpdateStrict" + }, + "examples": { + "updateName": { + "summary": "Update system name", + "value": { + "name": "gridX Headquarter" + } + }, + "enableDerApi": { + "description": "This example enables cloud DER API.\nThis means that the gridBox will publish both constraints and flexibilities, which makes the objects available through the API.\n", + "summary": "Enable DER API", + "value": { + "metadata": { + "energy": { + "ems": { + "derAPISettings": { + "enabledCloudAPI": true + } + } + } + } + } + }, + "enableDerApiWithoutFlexibilitiesSync": { + "description": "This example enables cloud DER API without flexibilities being synchronised with gridBox.\nThis means that the gridBox won't publish flexibilities and only considers the constraints published to the cloud.\n", + "summary": "Enable DER API, do not sync flexibilities", + "value": { + "metadata": { + "energy": { + "ems": { + "derAPISettings": { + "enabledCloudAPI": true, + "flexibilities": { + "disabled": true + } + } + } + } + } + } + }, + "assignProductOption": { + "summary": "Assign a product option to the system", + "value": { + "productOption": { + "id": "d085f746-1ae3-4a89-ab3a-a5aa61fd4bf8" + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Returned system.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID\"\n\npayload = { \"name\": \"gridX Headquarter\" }\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, json=payload, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/systems/systemID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"name\": \"gridX Headquarter\"\n}\n'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID\"\n\n\tpayload := strings.NewReader(\"{\\\"name\\\":\\\"gridX Headquarter\\\"}\")\n\n\treq, _ := http.NewRequest(\"PATCH\", url, payload)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nMediaType mediaType = MediaType.parse(\"application/json\");\nRequestBody body = RequestBody.create(mediaType, \"{\\\"name\\\":\\\"gridX Headquarter\\\"}\");\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval mediaType = MediaType.parse(\"application/json\")\nval body = RequestBody.create(mediaType, \"{\\\"name\\\":\\\"gridX Headquarter\\\"}\")\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet parameters = [\"name\": \"gridX Headquarter\"] as [String : Any?]\n\nlet postData = try JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\nrequest.httpBody = postData\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddJsonBody(\"{\\\"name\\\":\\\"gridX Headquarter\\\"}\", false);\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete a System", + "description": "Deletes a system.\n\n**Important**: The system must not have any attached Gateway. Reset any attached Gateway first by creating a *reset job*.\n", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemsWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "204": { + "description": "System has been deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Gateway Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/systems/systemID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways": { + "get": { + "summary": "List all Gateways", + "description": "List gateways that are accessible to the authenticated user.", + "tags": [ + "Gateway" + ], + "security": [ + { + "BearerAuth": [ + "GatewaysRead" + ] + } + ], + "parameters": [ + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + } + ], + "responses": { + "200": { + "description": "An array of gateways of up to `per_page` gateways.\n\nEach entry in the array is a separate gateway. If no gateway is available, the resulting array will be empty.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}": { + "get": { + "summary": "Retrieve a Gateway", + "description": "Retrieves the details of an existing gateway.", + "tags": [ + "Gateway" + ], + "security": [ + { + "BearerAuth": [ + "GatewaysRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + ], + "responses": { + "200": { + "description": "Returned gateway.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + }, + { + "properties": { + "system": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + } + } + } + ], + "x-readme-ref-name": "GatewayWithSystem" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Gateway Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update a Gateway", + "description": "Updates the specific gateway by setting the values of the body parameters.\n\nAny parameters not provided will be left unchanged.\n", + "tags": [ + "Gateway" + ], + "security": [ + { + "BearerAuth": [ + "GatewaysWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "name": { + "nullable": true + } + } + } + ], + "x-readme-ref-name": "GatewayUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "GatewayUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Returned gateway.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Gateway Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/gateways/gatewayID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete a Gateway", + "description": "Deletes a Gateway.", + "tags": [ + "Gateway" + ], + "security": [ + { + "BearerAuth": [ + "GatewaysWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + ], + "responses": { + "204": { + "description": "Gateway has been deleted successfully." + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/gateways/gatewayID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/gateways": { + "post": { + "summary": "Create a System's Gateway", + "description": "Creates a gateway.", + "tags": [ + "Gateway" + ], + "security": [ + { + "BearerAuth": [ + "GatewayWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "description": "Gateway to be created.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-Z0-9]{16}$" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + } + }, + "required": [ + "startcode" + ] + } + ], + "x-readme-ref-name": "GatewayCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "GatewayCreateStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Created gateway.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "The payload for creating the gateway contains invalid data.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "GENERAL", + "STARTCODE_NOT_FOUND", + "STARTCODE_ALREADY_REGISTERED" + ] + } + }, + "required": [ + "type" + ] + } + ] + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/gateways\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/systems/systemID/gateways \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/gateways\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/gateways\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/gateways\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/gateways\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/scans": { + "get": { + "summary": "List Gateway's Scans", + "description": "List of scans for the given gateway and the given interval.\n\nIf no interval is specified, the entire period is considered and all scans are listed.\n", + "tags": [ + "Scan" + ], + "security": [ + { + "BearerAuth": [ + "ScansRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "interval", + "description": "Requested time interval, formatted in ISO8601.\n\nIn this format the start and end point of the interval are formatted according\nto RFC3339 and separated by a slash \"/\".\n", + "in": "query", + "required": true, + "allowReserved": true, + "example": "2021-12-24T18:21:00Z/2021-12-25T18:21:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + } + ], + "responses": { + "200": { + "description": "An array of scans.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Scan", + "description": "Represents a group of scanners than have to run on a specific gridbox.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a scan.", + "type": "string", + "format": "uuid", + "example": "9ee88ee2-49f4-434d-a96f-67aca96aaa0a" + }, + "startedAt": { + "description": "The time at which the scan has started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "The time at which the scan has finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "scanners": { + "description": "Represents a list of scanners that have to run.", + "type": "array", + "items": { + "title": "Scanner", + "description": "Represents a scanner within a scan.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a scanner.", + "type": "string", + "format": "uuid", + "example": "7992f38a-df67-49d9-9f2f-98c63015a20c" + }, + "name": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + }, + "startedAt": { + "description": "The time at which the scan has started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "The time at which the scan has finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id", + "name", + "startedAt", + "finishedAt" + ], + "x-readme-ref-name": "Scanner" + } + }, + "appliances": { + "description": "Represents a list of appliances that have been detected during a scan.", + "type": "array", + "items": { + "title": "Appliance", + "description": "Appliance represents a monitor-/controllable device such as Inverters,\nMeters and Heat Pumps.\n", + "readOnly": true, + "oneOf": [ + { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "INVERTER": "#/components/schemas/Inverter", + "METER": "#/components/schemas/Meter", + "HEAT_PUMP": "#/components/schemas/HeatPump", + "EVSTATION": "#/components/schemas/EVStation", + "ELECTROLYZER": "#/components/schemas/Electrolyzer", + "IO_DEVICE": "#/components/schemas/IODevice", + "HEATER": "#/components/schemas/Heater", + "CONTAINER": "#/components/schemas/Container" + } + }, + "x-readme-ref-name": "Appliance" + } + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "Scan" + } + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/scans\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/scans \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/scans\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/scans\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/scans\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/scans\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/scans\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/jobs": { + "get": { + "summary": "List Gateway's Jobs", + "description": "List jobs that belong to the given gateway.\n", + "tags": [ + "Job" + ], + "security": [ + { + "BearerAuth": [ + "JobsRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + ], + "responses": { + "200": { + "description": "An array of jobs.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "Represents an application-based job on the gridBox.", + "type": "object", + "properties": { + "type": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "requestedAt": { + "description": "Represents the time at which the job was requested.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "state": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + } + }, + "x-readme-ref-name": "AbstractJob" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a job.", + "example": "d90fc059-b1d0-4277-a347-43609e232f4f" + }, + "receivedAt": { + "description": "Represents the time at which the job was received by the gateway.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "startedAt": { + "description": "Represents the time at which the job was started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the job was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "executions": { + "description": "Represents a set of job executions.", + "type": "array", + "items": { + "title": "Job Execution", + "description": "Represents an execution of a job.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a job execution.", + "type": "string", + "format": "uuid", + "example": "5830cd32-a194-4b9d-bea3-c2332f27167f" + }, + "jobID": { + "description": "Unique identifier of a job.", + "type": "string", + "format": "uuid" + }, + "succeeded": { + "description": "Indicates that the execution was successful.", + "type": "boolean" + }, + "error": { + "description": "A possible error message.", + "type": "string" + }, + "startedAt": { + "description": "Represents the time at which the execution was started at the gridbox.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the execution was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "JobExecution" + } + } + }, + "required": [ + "id", + "state", + "type", + "executions" + ] + } + ], + "x-readme-ref-name": "JobWithExecutions" + } + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Gateway Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/jobs\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/jobs \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/jobs\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/jobs\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/jobs\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/jobs/{jobIDOrType}": { + "get": { + "summary": "Get a Job", + "description": "Gets a particular job that belongs to the given gateway. In this case, the path parameter should be a job ID.\n", + "tags": [ + "Job" + ], + "security": [ + { + "BearerAuth": [ + "JobsRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "jobIDOrType", + "description": "Unique identifier for a job or the type of the job. \nIn `POST` request the job **type** is used, in `GET` and `DELETE` requests job **ID**.\n", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "examples": { + "jobType": { + "summary": "Type of the job.", + "value": "reset" + }, + "jobID": { + "summary": "Unique identifier for a job.", + "value": "0dce59b6-edd5-4366-a6fb-27c0ab3e8f90" + } + } + } + ], + "responses": { + "200": { + "description": "A job.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "description": "Represents an application-based job on the gridBox.", + "type": "object", + "properties": { + "type": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "requestedAt": { + "description": "Represents the time at which the job was requested.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "state": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + } + }, + "x-readme-ref-name": "AbstractJob" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a job.", + "example": "d90fc059-b1d0-4277-a347-43609e232f4f" + }, + "receivedAt": { + "description": "Represents the time at which the job was received by the gateway.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "startedAt": { + "description": "Represents the time at which the job was started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the job was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "executions": { + "description": "Represents a set of job executions.", + "type": "array", + "items": { + "title": "Job Execution", + "description": "Represents an execution of a job.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a job execution.", + "type": "string", + "format": "uuid", + "example": "5830cd32-a194-4b9d-bea3-c2332f27167f" + }, + "jobID": { + "description": "Unique identifier of a job.", + "type": "string", + "format": "uuid" + }, + "succeeded": { + "description": "Indicates that the execution was successful.", + "type": "boolean" + }, + "error": { + "description": "A possible error message.", + "type": "string" + }, + "startedAt": { + "description": "Represents the time at which the execution was started at the gridbox.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the execution was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "JobExecution" + } + } + }, + "required": [ + "id", + "state", + "type", + "executions" + ] + } + ], + "x-readme-ref-name": "JobWithExecutions" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "404": { + "description": "Job or Gateway not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create a job with a given type", + "description": "Creates a job with the given type for the given gateway, only if a job with that type doesn't already exist.\nIn this case, the path parameter should be a job type. Please note that the job type is case-sensitive.\n\n * `SCAN`: Once this job is triggered, the gridBox will look for connected appliances and update the list accordingly.\n\n * `RESET`: This type of job resets gridBox to default and removes it from previously configured system.\n\n * `RESTART`: Once this job is triggered, the gridBox will restart.\n\n*Job execution is asynchronous and does not guarantee immediate execution.*\n", + "tags": [ + "Job" + ], + "security": [ + { + "BearerAuth": [ + "JobsWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "jobIDOrType", + "description": "Unique identifier for a job or the type of the job. \nIn `POST` request the job **type** is used, in `GET` and `DELETE` requests job **ID**.\n", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "examples": { + "jobType": { + "summary": "Type of the job.", + "value": "reset" + }, + "jobID": { + "summary": "Unique identifier for a job.", + "value": "0dce59b6-edd5-4366-a6fb-27c0ab3e8f90" + } + } + } + ], + "responses": { + "201": { + "description": "A job.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "description": "Represents an application-based job on the gridBox.", + "type": "object", + "properties": { + "type": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "requestedAt": { + "description": "Represents the time at which the job was requested.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "state": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + } + }, + "x-readme-ref-name": "AbstractJob" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a job.", + "example": "d90fc059-b1d0-4277-a347-43609e232f4f" + } + }, + "required": [ + "state", + "type" + ] + } + ], + "x-readme-ref-name": "JobCreation" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Cancel a particular job", + "description": "Cancels a particular job from the given gateway. In this case, the path parameter should be a job ID.\n", + "tags": [ + "Job" + ], + "security": [ + { + "BearerAuth": [ + "JobsWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "jobIDOrType", + "description": "Unique identifier for a job or the type of the job. \nIn `POST` request the job **type** is used, in `GET` and `DELETE` requests job **ID**.\n", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "examples": { + "jobType": { + "summary": "Type of the job.", + "value": "reset" + }, + "jobID": { + "summary": "Unique identifier for a job.", + "value": "0dce59b6-edd5-4366-a6fb-27c0ab3e8f90" + } + } + } + ], + "responses": { + "200": { + "description": "A job.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "description": "Represents an application-based job on the gridBox.", + "type": "object", + "properties": { + "type": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "requestedAt": { + "description": "Represents the time at which the job was requested.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "state": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + } + }, + "x-readme-ref-name": "AbstractJob" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a job.", + "example": "d90fc059-b1d0-4277-a347-43609e232f4f" + }, + "receivedAt": { + "description": "Represents the time at which the job was received by the gateway.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "startedAt": { + "description": "Represents the time at which the job was started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the job was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "executions": { + "description": "Represents a set of job executions.", + "type": "array", + "items": { + "title": "Job Execution", + "description": "Represents an execution of a job.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a job execution.", + "type": "string", + "format": "uuid", + "example": "5830cd32-a194-4b9d-bea3-c2332f27167f" + }, + "jobID": { + "description": "Unique identifier of a job.", + "type": "string", + "format": "uuid" + }, + "succeeded": { + "description": "Indicates that the execution was successful.", + "type": "boolean" + }, + "error": { + "description": "A possible error message.", + "type": "string" + }, + "startedAt": { + "description": "Represents the time at which the execution was started at the gridbox.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the execution was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "JobExecution" + } + } + }, + "required": [ + "id", + "state", + "type", + "executions" + ] + } + ], + "x-readme-ref-name": "JobWithExecutions" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "404": { + "description": "Job or Gateway not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/jobs/jobIDOrType\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/appliances": { + "get": { + "summary": "List Gateway's Appliances", + "description": "Lists appliances that belong to the given gateway.\n\nChildren appliances, e.g. those of hybrid inverters, are not included by default.\nTo include them, `listAll` parameter must be set to `true`.\n", + "tags": [ + "Appliance" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "listAll", + "description": "Boolean value to define if all the appliances must be listed.\nIf absent or set to `false` child appliances of Hybrid Inverter would be skipped.\n", + "in": "query", + "example": true, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "An array of appliances of up to `per_page` appliances.\n\nEach entry in the array is a separate appliance. If no appliance is available, the resulting array will be empty.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Appliance", + "description": "Appliance represents a monitor-/controllable device such as Inverters,\nMeters and Heat Pumps.\n", + "readOnly": true, + "oneOf": [ + { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "INVERTER": "#/components/schemas/Inverter", + "METER": "#/components/schemas/Meter", + "HEAT_PUMP": "#/components/schemas/HeatPump", + "EVSTATION": "#/components/schemas/EVStation", + "ELECTROLYZER": "#/components/schemas/Electrolyzer", + "IO_DEVICE": "#/components/schemas/IODevice", + "HEATER": "#/components/schemas/Heater", + "CONTAINER": "#/components/schemas/Container" + } + }, + "x-readme-ref-name": "Appliance" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Gateway Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/appliances \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/appliances/{applianceID}": { + "get": { + "summary": "Retrieve an Appliance", + "description": "Retrieves the details of an existing appliance.", + "tags": [ + "Appliance" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + } + ], + "responses": { + "200": { + "description": "Returned Appliance.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Appliance", + "description": "Appliance represents a monitor-/controllable device such as Inverters,\nMeters and Heat Pumps.\n", + "readOnly": true, + "oneOf": [ + { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "INVERTER": "#/components/schemas/Inverter", + "METER": "#/components/schemas/Meter", + "HEAT_PUMP": "#/components/schemas/HeatPump", + "EVSTATION": "#/components/schemas/EVStation", + "ELECTROLYZER": "#/components/schemas/Electrolyzer", + "IO_DEVICE": "#/components/schemas/IODevice", + "HEATER": "#/components/schemas/Heater", + "CONTAINER": "#/components/schemas/Container" + } + }, + "x-readme-ref-name": "Appliance" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update an Appliance", + "description": "Updates the specific appliance by setting the values of the body parameters. \n\nAny parameters not provided will be left unchanged.\n", + "tags": [ + "Appliance" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + } + ], + "requestBody": { + "description": "Partially updates an appliance.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Appliance Update", + "description": "ApplianceUpdate contains fields of an appliance that can be updated.\n", + "type": "object", + "properties": { + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "kind": { + "description": "Indicates the specific kind or role of the appliance.\nOnly settable for appliances of type `INVERTER` or `METER`.\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID", + "GRID", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ] + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + } + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "desiredState": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "ApplianceUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ApplianceUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Updated appliance.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Appliance", + "description": "Appliance represents a monitor-/controllable device such as Inverters,\nMeters and Heat Pumps.\n", + "readOnly": true, + "oneOf": [ + { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "INVERTER": "#/components/schemas/Inverter", + "METER": "#/components/schemas/Meter", + "HEAT_PUMP": "#/components/schemas/HeatPump", + "EVSTATION": "#/components/schemas/EVStation", + "ELECTROLYZER": "#/components/schemas/Electrolyzer", + "IO_DEVICE": "#/components/schemas/IODevice", + "HEATER": "#/components/schemas/Heater", + "CONTAINER": "#/components/schemas/Container" + } + }, + "x-readme-ref-name": "Appliance" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete an Appliance", + "description": "Deletes an appliances.", + "tags": [ + "Appliance" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + } + ], + "responses": { + "204": { + "description": "Appliance has been deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/appliances/{applianceID}/ev/configuration": { + "get": { + "summary": "Retrieve an EV configuration", + "description": "Returns an EV charging station's configuration.", + "tags": [ + "EV Configuration" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesEVConfigurationRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + } + ], + "responses": { + "200": { + "description": "Returned EV configuration.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + }, + { + "required": [ + "applianceID", + "createdAt", + "updatedAt", + "chargingEnabled", + "chargingRemoteControllable", + "lockEnabled", + "minRequestedSoc", + "departureTimestamp", + "userSoc", + "userTotalCapacity", + "maxPowerCalculated", + "maxChargePower", + "minChargePower" + ], + "properties": { + "applianceID": { + "type": "string", + "format": "uuid", + "description": "ID of the EV charging station this configuration belongs to. \n" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was updated the last time." + } + } + } + ], + "x-readme-ref-name": "EVChargingStationConfiguration" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create an EV Configuration", + "description": "Creates an EV charging station's configuration if no configuration is present.\n", + "tags": [ + "EV Configuration" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesEVConfigurationWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + } + ], + "requestBody": { + "description": "EV configuration to be created.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + } + ], + "x-readme-ref-name": "EVChargingStationConfigurationCreation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EVChargingStationConfigurationCreationStrict" + } + } + } + }, + "responses": { + "201": { + "description": "EV charging station configuration created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + }, + { + "required": [ + "applianceID", + "createdAt", + "updatedAt", + "chargingEnabled", + "chargingRemoteControllable", + "lockEnabled", + "minRequestedSoc", + "departureTimestamp", + "userSoc", + "userTotalCapacity", + "maxPowerCalculated", + "maxChargePower", + "minChargePower" + ], + "properties": { + "applianceID": { + "type": "string", + "format": "uuid", + "description": "ID of the EV charging station this configuration belongs to. \n" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was updated the last time." + } + } + } + ], + "x-readme-ref-name": "EVChargingStationConfiguration" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Gateway Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update an EV configuration", + "description": "Updates the specified appliance's EV charging station configuration by setting the body parameters.", + "tags": [ + "EV Configuration" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesEVConfigurationWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + } + ], + "requestBody": { + "description": "Modified EV configuration.", + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + } + ], + "x-readme-ref-name": "EVChargingStationConfigurationUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Updated Charging Station configuration.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + }, + { + "required": [ + "applianceID", + "createdAt", + "updatedAt", + "chargingEnabled", + "chargingRemoteControllable", + "lockEnabled", + "minRequestedSoc", + "departureTimestamp", + "userSoc", + "userTotalCapacity", + "maxPowerCalculated", + "maxChargePower", + "minChargePower" + ], + "properties": { + "applianceID": { + "type": "string", + "format": "uuid", + "description": "ID of the EV charging station this configuration belongs to. \n" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was updated the last time." + } + } + } + ], + "x-readme-ref-name": "EVChargingStationConfiguration" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\npayload = {\n \"chargingEnabled\": True,\n \"chargingRemoteControllable\": True,\n \"lockEnabled\": True,\n \"minRequestedSoc\": 30,\n \"departureTimestamp\": \"2024-11-06T17:20:44.771Z\",\n \"estimatedDepartureTimestamp\": \"2024-11-06T17:20:44.771Z\",\n \"userSoc\": 50,\n \"userTotalCapacity\": 82000,\n \"chargeMode\": \"FORCED_EV\",\n \"maxPowerCalculated\": 8000,\n \"maxChargePower\": 8000,\n \"minChargePower\": 2070,\n \"minChargePowerPerPhase\": 1840,\n \"evProfileID\": \"6dd0a658-5828-4d30-bc65-a03c6d6e425f\"\n}\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, json=payload, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"chargingEnabled\": true,\n \"chargingRemoteControllable\": true,\n \"lockEnabled\": true,\n \"minRequestedSoc\": 30,\n \"departureTimestamp\": \"2024-11-06T17:20:44.771Z\",\n \"estimatedDepartureTimestamp\": \"2024-11-06T17:20:44.771Z\",\n \"userSoc\": 50,\n \"userTotalCapacity\": 82000,\n \"chargeMode\": \"FORCED_EV\",\n \"maxPowerCalculated\": 8000,\n \"maxChargePower\": 8000,\n \"minChargePower\": 2070,\n \"minChargePowerPerPhase\": 1840,\n \"evProfileID\": \"6dd0a658-5828-4d30-bc65-a03c6d6e425f\"\n}\n'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\n\tpayload := strings.NewReader(\"{\\\"chargingEnabled\\\":true,\\\"chargingRemoteControllable\\\":true,\\\"lockEnabled\\\":true,\\\"minRequestedSoc\\\":30,\\\"departureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"estimatedDepartureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"userSoc\\\":50,\\\"userTotalCapacity\\\":82000,\\\"chargeMode\\\":\\\"FORCED_EV\\\",\\\"maxPowerCalculated\\\":8000,\\\"maxChargePower\\\":8000,\\\"minChargePower\\\":2070,\\\"minChargePowerPerPhase\\\":1840,\\\"evProfileID\\\":\\\"6dd0a658-5828-4d30-bc65-a03c6d6e425f\\\"}\")\n\n\treq, _ := http.NewRequest(\"PATCH\", url, payload)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nMediaType mediaType = MediaType.parse(\"application/json\");\nRequestBody body = RequestBody.create(mediaType, \"{\\\"chargingEnabled\\\":true,\\\"chargingRemoteControllable\\\":true,\\\"lockEnabled\\\":true,\\\"minRequestedSoc\\\":30,\\\"departureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"estimatedDepartureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"userSoc\\\":50,\\\"userTotalCapacity\\\":82000,\\\"chargeMode\\\":\\\"FORCED_EV\\\",\\\"maxPowerCalculated\\\":8000,\\\"maxChargePower\\\":8000,\\\"minChargePower\\\":2070,\\\"minChargePowerPerPhase\\\":1840,\\\"evProfileID\\\":\\\"6dd0a658-5828-4d30-bc65-a03c6d6e425f\\\"}\");\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval mediaType = MediaType.parse(\"application/json\")\nval body = RequestBody.create(mediaType, \"{\\\"chargingEnabled\\\":true,\\\"chargingRemoteControllable\\\":true,\\\"lockEnabled\\\":true,\\\"minRequestedSoc\\\":30,\\\"departureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"estimatedDepartureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"userSoc\\\":50,\\\"userTotalCapacity\\\":82000,\\\"chargeMode\\\":\\\"FORCED_EV\\\",\\\"maxPowerCalculated\\\":8000,\\\"maxChargePower\\\":8000,\\\"minChargePower\\\":2070,\\\"minChargePowerPerPhase\\\":1840,\\\"evProfileID\\\":\\\"6dd0a658-5828-4d30-bc65-a03c6d6e425f\\\"}\")\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet parameters = [\n \"chargingEnabled\": true,\n \"chargingRemoteControllable\": true,\n \"lockEnabled\": true,\n \"minRequestedSoc\": 30,\n \"departureTimestamp\": \"2024-11-06T17:20:44.771Z\",\n \"estimatedDepartureTimestamp\": \"2024-11-06T17:20:44.771Z\",\n \"userSoc\": 50,\n \"userTotalCapacity\": 82000,\n \"chargeMode\": \"FORCED_EV\",\n \"maxPowerCalculated\": 8000,\n \"maxChargePower\": 8000,\n \"minChargePower\": 2070,\n \"minChargePowerPerPhase\": 1840,\n \"evProfileID\": \"6dd0a658-5828-4d30-bc65-a03c6d6e425f\"\n] as [String : Any?]\n\nlet postData = try JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\nrequest.httpBody = postData\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddJsonBody(\"{\\\"chargingEnabled\\\":true,\\\"chargingRemoteControllable\\\":true,\\\"lockEnabled\\\":true,\\\"minRequestedSoc\\\":30,\\\"departureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"estimatedDepartureTimestamp\\\":\\\"2024-11-06T17:20:44.771Z\\\",\\\"userSoc\\\":50,\\\"userTotalCapacity\\\":82000,\\\"chargeMode\\\":\\\"FORCED_EV\\\",\\\"maxPowerCalculated\\\":8000,\\\"maxChargePower\\\":8000,\\\"minChargePower\\\":2070,\\\"minChargePowerPerPhase\\\":1840,\\\"evProfileID\\\":\\\"6dd0a658-5828-4d30-bc65-a03c6d6e425f\\\"}\", false);\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete an EV configuration", + "description": "Deletes an EV charging Station configuration.", + "tags": [ + "EV Configuration" + ], + "security": [ + { + "BearerAuth": [ + "AppliancesEVConfigurationWrite" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + } + ], + "responses": { + "204": { + "description": "EV configuration has been deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/ev/configuration\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/ev-profiles": { + "get": { + "summary": "List available EV profiles", + "description": "Lists EV profiles that belong the the specified system.", + "tags": [ + "EV Profile" + ], + "security": [ + { + "BearerAuth": [ + "EVProfilesRead" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "200": { + "description": "Available EV profiles.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + }, + "systemID": { + "description": "Unique identifier of the system that this EV profile belongs to.", + "type": "string", + "format": "uuid", + "example": "938b84d9-17e9-44e5-b422-4fb95ea3550b" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was created in UTC using the RFC3339 format.", + "example": "2022-11-10T23:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was updated the last time in UTC using the RFC3339 format.", + "example": "2022-11-12T23:20:50Z" + }, + "chargingStationApplianceIDs": { + "readOnly": true, + "title": "ChargingStationApplianceIDs", + "description": "ChargingStationApplianceIDs represents the charging station appliances the EV is assigned to.\n", + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "example": [ + "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "e3bb9553-78a6-4f4f-98d5-5c5f9012251d" + ] + } + }, + "required": [ + "id", + "systemID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "ElectricVehicleProfile" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/ev-profiles\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/ev-profiles \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/ev-profiles\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/ev-profiles\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/ev-profiles\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create a new EV profile", + "description": "Creates an EV profile.", + "tags": [ + "EV Profile" + ], + "security": [ + { + "BearerAuth": [ + "EVProfilesWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "description": "EV profile to be created.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + } + } + } + ], + "x-readme-ref-name": "ElectricVehicleProfileCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ElectricVehicleProfileCreateStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Created EV profile.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + }, + "systemID": { + "description": "Unique identifier of the system that this EV profile belongs to.", + "type": "string", + "format": "uuid", + "example": "938b84d9-17e9-44e5-b422-4fb95ea3550b" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was created in UTC using the RFC3339 format.", + "example": "2022-11-10T23:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was updated the last time in UTC using the RFC3339 format.", + "example": "2022-11-12T23:20:50Z" + }, + "chargingStationApplianceIDs": { + "readOnly": true, + "title": "ChargingStationApplianceIDs", + "description": "ChargingStationApplianceIDs represents the charging station appliances the EV is assigned to.\n", + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "example": [ + "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "e3bb9553-78a6-4f4f-98d5-5c5f9012251d" + ] + } + }, + "required": [ + "id", + "systemID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "ElectricVehicleProfile" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/ev-profiles\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/systems/systemID/ev-profiles \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/ev-profiles\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/ev-profiles\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/ev-profiles\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/ev-profiles/{evProfileID}": { + "get": { + "summary": "Retrieve an EV profile", + "description": "Retrieve an EV profile that belong the the specified system.", + "tags": [ + "EV Profile" + ], + "security": [ + { + "BearerAuth": [ + "EVProfilesRead" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "evProfileID", + "description": "Unique identifier for an EV profile.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "d4498841-1404-46f6-8086-7cc8bbdf98d3" + } + ], + "responses": { + "200": { + "description": "EV profile.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + }, + "systemID": { + "description": "Unique identifier of the system that this EV profile belongs to.", + "type": "string", + "format": "uuid", + "example": "938b84d9-17e9-44e5-b422-4fb95ea3550b" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was created in UTC using the RFC3339 format.", + "example": "2022-11-10T23:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was updated the last time in UTC using the RFC3339 format.", + "example": "2022-11-12T23:20:50Z" + }, + "chargingStationApplianceIDs": { + "readOnly": true, + "title": "ChargingStationApplianceIDs", + "description": "ChargingStationApplianceIDs represents the charging station appliances the EV is assigned to.\n", + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "example": [ + "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "e3bb9553-78a6-4f4f-98d5-5c5f9012251d" + ] + } + }, + "required": [ + "id", + "systemID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "ElectricVehicleProfile" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/ev-profiles/evProfileID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update an EV profile", + "description": "Update an EV profile that belong the the specified system.", + "tags": [ + "EV Profile" + ], + "security": [ + { + "BearerAuth": [ + "EVProfilesWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "evProfileID", + "description": "Unique identifier for an EV profile.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "d4498841-1404-46f6-8086-7cc8bbdf98d3" + } + ], + "requestBody": { + "description": "EV profile to be updated.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + } + ], + "x-readme-ref-name": "ElectricVehicleProfileUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Returned updated EV profile.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + }, + "systemID": { + "description": "Unique identifier of the system that this EV profile belongs to.", + "type": "string", + "format": "uuid", + "example": "938b84d9-17e9-44e5-b422-4fb95ea3550b" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was created in UTC using the RFC3339 format.", + "example": "2022-11-10T23:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was updated the last time in UTC using the RFC3339 format.", + "example": "2022-11-12T23:20:50Z" + }, + "chargingStationApplianceIDs": { + "readOnly": true, + "title": "ChargingStationApplianceIDs", + "description": "ChargingStationApplianceIDs represents the charging station appliances the EV is assigned to.\n", + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "example": [ + "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "e3bb9553-78a6-4f4f-98d5-5c5f9012251d" + ] + } + }, + "required": [ + "id", + "systemID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "ElectricVehicleProfile" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\"\n\npayload = {\n \"name\": \"My profile\",\n \"manufacturer\": \"Tesla\",\n \"model\": \"Model-3\",\n \"color\": \"red\",\n \"capacity\": 12000,\n \"averageConsumption\": 30000,\n \"phasesCount\": 1,\n \"minChargePower\": 8000,\n \"userSoc\": 50,\n \"image\": \"data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",\n \"minChargePowerPerPhase\": 2070,\n \"minRequestedSoc\": 70\n}\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, json=payload, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/systems/systemID/ev-profiles/evProfileID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"name\": \"My profile\",\n \"manufacturer\": \"Tesla\",\n \"model\": \"Model-3\",\n \"color\": \"red\",\n \"capacity\": 12000,\n \"averageConsumption\": 30000,\n \"phasesCount\": 1,\n \"minChargePower\": 8000,\n \"userSoc\": 50,\n \"image\": \"data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",\n \"minChargePowerPerPhase\": 2070,\n \"minRequestedSoc\": 70\n}\n'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\"\n\n\tpayload := strings.NewReader(\"{\\\"name\\\":\\\"My profile\\\",\\\"manufacturer\\\":\\\"Tesla\\\",\\\"model\\\":\\\"Model-3\\\",\\\"color\\\":\\\"red\\\",\\\"capacity\\\":12000,\\\"averageConsumption\\\":30000,\\\"phasesCount\\\":1,\\\"minChargePower\\\":8000,\\\"userSoc\\\":50,\\\"image\\\":\\\"data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\\\",\\\"minChargePowerPerPhase\\\":2070,\\\"minRequestedSoc\\\":70}\")\n\n\treq, _ := http.NewRequest(\"PATCH\", url, payload)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nMediaType mediaType = MediaType.parse(\"application/json\");\nRequestBody body = RequestBody.create(mediaType, \"{\\\"name\\\":\\\"My profile\\\",\\\"manufacturer\\\":\\\"Tesla\\\",\\\"model\\\":\\\"Model-3\\\",\\\"color\\\":\\\"red\\\",\\\"capacity\\\":12000,\\\"averageConsumption\\\":30000,\\\"phasesCount\\\":1,\\\"minChargePower\\\":8000,\\\"userSoc\\\":50,\\\"image\\\":\\\"data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\\\",\\\"minChargePowerPerPhase\\\":2070,\\\"minRequestedSoc\\\":70}\");\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval mediaType = MediaType.parse(\"application/json\")\nval body = RequestBody.create(mediaType, \"{\\\"name\\\":\\\"My profile\\\",\\\"manufacturer\\\":\\\"Tesla\\\",\\\"model\\\":\\\"Model-3\\\",\\\"color\\\":\\\"red\\\",\\\"capacity\\\":12000,\\\"averageConsumption\\\":30000,\\\"phasesCount\\\":1,\\\"minChargePower\\\":8000,\\\"userSoc\\\":50,\\\"image\\\":\\\"data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\\\",\\\"minChargePowerPerPhase\\\":2070,\\\"minRequestedSoc\\\":70}\")\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet parameters = [\n \"name\": \"My profile\",\n \"manufacturer\": \"Tesla\",\n \"model\": \"Model-3\",\n \"color\": \"red\",\n \"capacity\": 12000,\n \"averageConsumption\": 30000,\n \"phasesCount\": 1,\n \"minChargePower\": 8000,\n \"userSoc\": 50,\n \"image\": \"data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",\n \"minChargePowerPerPhase\": 2070,\n \"minRequestedSoc\": 70\n] as [String : Any?]\n\nlet postData = try JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\nrequest.httpBody = postData\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddJsonBody(\"{\\\"name\\\":\\\"My profile\\\",\\\"manufacturer\\\":\\\"Tesla\\\",\\\"model\\\":\\\"Model-3\\\",\\\"color\\\":\\\"red\\\",\\\"capacity\\\":12000,\\\"averageConsumption\\\":30000,\\\"phasesCount\\\":1,\\\"minChargePower\\\":8000,\\\"userSoc\\\":50,\\\"image\\\":\\\"data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\\\",\\\"minChargePowerPerPhase\\\":2070,\\\"minRequestedSoc\\\":70}\", false);\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete an EV profile", + "description": "Deletes an EV profile that belongs to the specified system.", + "tags": [ + "EV Profile" + ], + "security": [ + { + "BearerAuth": [ + "EVProfilesWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "evProfileID", + "description": "Unique identifier for an EV profile.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "d4498841-1404-46f6-8086-7cc8bbdf98d3" + } + ], + "responses": { + "204": { + "description": "EV profile deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/systems/systemID/ev-profiles/evProfileID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/ev-profiles/evProfileID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/evcharging-schedules": { + "get": { + "summary": "List a System's EV charging schedules.", + "description": "Lists EV charging schedules that belong to the specified system.\n\nIt only contains the currently active schedules and schedules to be active in the\nnext 24 hours.\n", + "tags": [ + "EV Charging Schedule" + ], + "security": [ + { + "BearerAuth": [ + "SchedulesRead" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "200": { + "description": "Returned currently active and upcoming EV charging schedules.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + ] + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/evcharging-schedules\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/evcharging-schedules \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/evcharging-schedules\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/evcharging-schedules\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/evcharging-schedules\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/evcharging-schedules\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/evcharging-schedules\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create an EV charging schedule", + "description": "Creates a system's EV charging schedule.", + "tags": [ + "EV Charging Schedule" + ], + "security": [ + { + "BearerAuth": [ + "SchedulesWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "description": "EV charging schedule to be created.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "required": [ + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingScheduleCreation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EVChargingScheduleCreationStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Created EV charging schedule.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/evcharging-schedules\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/systems/systemID/evcharging-schedules \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/evcharging-schedules\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/evcharging-schedules\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/evcharging-schedules\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/evcharging-schedules\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/evcharging-schedules\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/power-limit-schedules/{scheduleID}": { + "get": { + "summary": "Retrieve a power limit schedule", + "description": "Retrieves the details of an existing power limit schedule.", + "tags": [ + "Power Limit Schedule" + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "scheduleID", + "description": "Unique identifier for a schedule.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204" + } + ], + "responses": { + "200": { + "description": "Returned power limit schedule.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Power Limit Schedule", + "description": "A Power Limit Schedule is a schedule that defines recurring import power limits, \nwhich should be applied to the grid meter.\n\nThe schedule is recurring inside the interval bounds defined by `from` and `to`.\n\nThere can be only one active timeframe for every point in time.\nSchedules can overlap, but they must not have overlapping timeframes. \n", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Name of this schedule. Must be unique for this system." + }, + "from": { + "type": "string", + "format": "date-time", + "description": "From when the schedule applies (inclusive)." + }, + "to": { + "type": "string", + "format": "date-time", + "description": "Until when the schedule applies (exclusive)." + }, + "timezone": { + "type": "string", + "description": "Fully qualified identifier of the timezone ([IANA timezone database identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) this schedule should be applied in.\nUsed to determine time of day of the timeframes.\n" + }, + "timeframes": { + "description": "List of timeframes containing which import limit should be applied at which time of the day.\n\nThey must not overlap in this schedule and also not with timeframes of other schedules of this system.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "from", + "to", + "maxPower" + ], + "properties": { + "from": { + "description": "Time of day from when the limit of this timeframe should be applied (inclusive).\n", + "type": "string", + "example": "00:00" + }, + "to": { + "description": "Time of day until when the limit of this timeframe should be applied (exclusive).\n", + "type": "string", + "example": "14:00" + }, + "maxPower": { + "description": "Max import power in Watt to apply to the grid meter during this timeframe.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 100000 + } + } + } + }, + "recurrence": { + "type": "object", + "description": "Recurrence rules for this schedule.\n\nInspired by [RFC5545](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10) and supporting a small subset of it.\n", + "required": [ + "frequency" + ], + "properties": { + "frequency": { + "description": "Type of recurrence rule.", + "type": "string", + "enum": [ + "DAILY" + ] + }, + "byDayOfWeek": { + "description": "Specifies a list of weekdays this rule should apply to.\nOnly valid for `frequency=DAILY`.\n\nOmitting it is the same as selecting all days.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "SU", + "MO", + "TU", + "WE", + "TH", + "FR", + "SA" + ] + } + } + } + } + }, + "x-readme-ref-name": "AbstractPowerLimitSchedule" + }, + { + "required": [ + "id", + "title", + "from", + "to", + "timezone", + "timeframes", + "recurrence", + "status", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique ID of this schedule." + }, + "timeframes": { + "minItems": 1 + }, + "status": { + "description": "Status of the schedule.\n\n- `ACTIVE`: A timeframe of this schedule is currently being applied.\n- `OUTDATED`: No more timeframes from this schedule will be applied.\n- `UPCOMING`: A timeframe of this schedule will be applied in the future.\n", + "type": "string", + "enum": [ + "ACTIVE", + "OUTDATED", + "UPCOMING" + ] + }, + "createdAt": { + "description": "When the Power Limit Schedule was created.", + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "description": "When the Power Limit Schedule was last updated.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "PowerLimitSchedule" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update a power limit schedule", + "description": "Updates the specified power limit schedule.", + "tags": [ + "Power Limit Schedule" + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "scheduleID", + "description": "Unique identifier for a schedule.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204" + } + ], + "requestBody": { + "description": "Partially modified power limit schedule.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Power Limit Schedule", + "description": "A Power Limit Schedule is a schedule that defines recurring import power limits, \nwhich should be applied to the grid meter.\n\nThe schedule is recurring inside the interval bounds defined by `from` and `to`.\n\nThere can be only one active timeframe for every point in time.\nSchedules can overlap, but they must not have overlapping timeframes. \n", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Name of this schedule. Must be unique for this system." + }, + "from": { + "type": "string", + "format": "date-time", + "description": "From when the schedule applies (inclusive)." + }, + "to": { + "type": "string", + "format": "date-time", + "description": "Until when the schedule applies (exclusive)." + }, + "timezone": { + "type": "string", + "description": "Fully qualified identifier of the timezone ([IANA timezone database identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) this schedule should be applied in.\nUsed to determine time of day of the timeframes.\n" + }, + "timeframes": { + "description": "List of timeframes containing which import limit should be applied at which time of the day.\n\nThey must not overlap in this schedule and also not with timeframes of other schedules of this system.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "from", + "to", + "maxPower" + ], + "properties": { + "from": { + "description": "Time of day from when the limit of this timeframe should be applied (inclusive).\n", + "type": "string", + "example": "00:00" + }, + "to": { + "description": "Time of day until when the limit of this timeframe should be applied (exclusive).\n", + "type": "string", + "example": "14:00" + }, + "maxPower": { + "description": "Max import power in Watt to apply to the grid meter during this timeframe.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 100000 + } + } + } + }, + "recurrence": { + "type": "object", + "description": "Recurrence rules for this schedule.\n\nInspired by [RFC5545](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10) and supporting a small subset of it.\n", + "required": [ + "frequency" + ], + "properties": { + "frequency": { + "description": "Type of recurrence rule.", + "type": "string", + "enum": [ + "DAILY" + ] + }, + "byDayOfWeek": { + "description": "Specifies a list of weekdays this rule should apply to.\nOnly valid for `frequency=DAILY`.\n\nOmitting it is the same as selecting all days.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "SU", + "MO", + "TU", + "WE", + "TH", + "FR", + "SA" + ] + } + } + } + } + }, + "x-readme-ref-name": "AbstractPowerLimitSchedule" + } + ], + "x-readme-ref-name": "PowerLimitScheduleUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PowerLimitScheduleUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Updated power limit schedule.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Power Limit Schedule", + "description": "A Power Limit Schedule is a schedule that defines recurring import power limits, \nwhich should be applied to the grid meter.\n\nThe schedule is recurring inside the interval bounds defined by `from` and `to`.\n\nThere can be only one active timeframe for every point in time.\nSchedules can overlap, but they must not have overlapping timeframes. \n", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Name of this schedule. Must be unique for this system." + }, + "from": { + "type": "string", + "format": "date-time", + "description": "From when the schedule applies (inclusive)." + }, + "to": { + "type": "string", + "format": "date-time", + "description": "Until when the schedule applies (exclusive)." + }, + "timezone": { + "type": "string", + "description": "Fully qualified identifier of the timezone ([IANA timezone database identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) this schedule should be applied in.\nUsed to determine time of day of the timeframes.\n" + }, + "timeframes": { + "description": "List of timeframes containing which import limit should be applied at which time of the day.\n\nThey must not overlap in this schedule and also not with timeframes of other schedules of this system.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "from", + "to", + "maxPower" + ], + "properties": { + "from": { + "description": "Time of day from when the limit of this timeframe should be applied (inclusive).\n", + "type": "string", + "example": "00:00" + }, + "to": { + "description": "Time of day until when the limit of this timeframe should be applied (exclusive).\n", + "type": "string", + "example": "14:00" + }, + "maxPower": { + "description": "Max import power in Watt to apply to the grid meter during this timeframe.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 100000 + } + } + } + }, + "recurrence": { + "type": "object", + "description": "Recurrence rules for this schedule.\n\nInspired by [RFC5545](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10) and supporting a small subset of it.\n", + "required": [ + "frequency" + ], + "properties": { + "frequency": { + "description": "Type of recurrence rule.", + "type": "string", + "enum": [ + "DAILY" + ] + }, + "byDayOfWeek": { + "description": "Specifies a list of weekdays this rule should apply to.\nOnly valid for `frequency=DAILY`.\n\nOmitting it is the same as selecting all days.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "SU", + "MO", + "TU", + "WE", + "TH", + "FR", + "SA" + ] + } + } + } + } + }, + "x-readme-ref-name": "AbstractPowerLimitSchedule" + }, + { + "required": [ + "id", + "title", + "from", + "to", + "timezone", + "timeframes", + "recurrence", + "status", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique ID of this schedule." + }, + "timeframes": { + "minItems": 1 + }, + "status": { + "description": "Status of the schedule.\n\n- `ACTIVE`: A timeframe of this schedule is currently being applied.\n- `OUTDATED`: No more timeframes from this schedule will be applied.\n- `UPCOMING`: A timeframe of this schedule will be applied in the future.\n", + "type": "string", + "enum": [ + "ACTIVE", + "OUTDATED", + "UPCOMING" + ] + }, + "createdAt": { + "description": "When the Power Limit Schedule was created.", + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "description": "When the Power Limit Schedule was last updated.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "PowerLimitSchedule" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete a power limit schedule", + "description": "Deletes a power limit schedule.", + "tags": [ + "Power Limit Schedule" + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "scheduleID", + "description": "Unique identifier for a schedule.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204" + } + ], + "responses": { + "204": { + "description": "Power limit schedule has been deleted successfully." + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/power-limit-schedules/scheduleID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/tariff": { + "get": { + "summary": "Retrieve the tariff v2 of a system", + "description": "Retrieves the tariff v2 of the system. \n", + "tags": [ + "TariffV2" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "200": { + "description": "Tariff of the system. Empty if there is none.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + { + "properties": { + "systemID": { + "type": "string", + "description": "ID of the system the tariff is assigned to", + "format": "uuid", + "example": "3a07b17f-da57-4d61-b9e4-17c4fcd861c4", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the tariff was updated using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "currency": { + "default": "EUR" + }, + "marketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + } + }, + "required": [ + "name", + "feedinType", + "offtakeType", + "systemID", + "createdAt", + "updatedAt", + "currency" + ] + } + ], + "x-readme-ref-name": "TariffV2" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/tariff\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/tariff \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/tariff\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/tariff\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/tariff\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Set the tariff v2 of a system", + "description": "Sets the tariff v2 of the system. \n\nSee the response bodies description which fields have to be set for which `feedinType`/`offtakeType`.\n", + "tags": [ + "TariffV2" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + { + "type": "object", + "properties": { + "marketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + } + }, + "required": [ + "feedinType", + "offtakeType" + ] + } + ], + "x-readme-ref-name": "TariffV2Creation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TariffV2CreationStrict" + } + } + } + }, + "responses": { + "201": { + "description": "The newly-set tariff v2.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + { + "properties": { + "systemID": { + "type": "string", + "description": "ID of the system the tariff is assigned to", + "format": "uuid", + "example": "3a07b17f-da57-4d61-b9e4-17c4fcd861c4", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the tariff was updated using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "currency": { + "default": "EUR" + }, + "marketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + } + }, + "required": [ + "name", + "feedinType", + "offtakeType", + "systemID", + "createdAt", + "updatedAt", + "currency" + ] + } + ], + "x-readme-ref-name": "TariffV2" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "409": { + "description": "Resource already exists", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Conflict", + "description": "Conflict indicates that the client is attempting to create a resource that already exists.\n", + "type": "object", + "example": { + "message": "Resource already exists" + } + } + ], + "x-readme-ref-name": "ConflictException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/tariff\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/systems/systemID/tariff \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/tariff\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/tariff\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/tariff\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update the tariff v2 of a system", + "description": "Updates the tariff v2 of the system.\n\nSee the response bodies description which fields have to be set for which `feedinType`/`offtakeType`.\n", + "tags": [ + "TariffV2" + ], + "security": [ + { + "BearerAuth": [ + "TariffWrite" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + } + ], + "x-readme-ref-name": "TariffV2Update" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TariffV2UpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "The updated TariffV2.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + { + "properties": { + "systemID": { + "type": "string", + "description": "ID of the system the tariff is assigned to", + "format": "uuid", + "example": "3a07b17f-da57-4d61-b9e4-17c4fcd861c4", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the tariff was updated using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "currency": { + "default": "EUR" + }, + "marketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + } + }, + "required": [ + "name", + "feedinType", + "offtakeType", + "systemID", + "createdAt", + "updatedAt", + "currency" + ] + } + ], + "x-readme-ref-name": "TariffV2" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/tariff\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/systems/systemID/tariff \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/tariff\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/tariff\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/tariff\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/tariff/prices": { + "get": { + "summary": "Retrieve the tariff end prices of a system", + "description": "Retrieves the end-price tariff for the system in the specified resolution (15-minute by default if not specified).\nThe end-price is the price the customer is billed for (for market data tariffs for example after offset, VAT and provider fee are applied).\n\nDepending on the tariff settings, the tariff data might have been directly posted through the API, originate from market data \nor is extrapolated from static data.\n\nIf the resolution of the underlying data doesn't correspond to the requested resolution the data will be up- or down-sampled.\nFor example the market prices used by market data tariffs have a 1 hour resolution. If you request 15min resolution you will\nget 4 equal periods per hour. If you request daily resolution, the average prices of 24 hourly periods will be returned per period. \n\nIf there are missing price periods over the requested interval (which may happen for `EXTERNAL` tariffs), the end-price tariff will start after the last period gap, aligned with the requested resolution.\nThat is, if the requested interval for a given day is from 00:00 to 12:00 and no prices were sent from at 02:15 to 03:45, the first period returned will be from 03:45 to 04:00 for a 15-min resolution or from 04:00 to 05:00 for an hourly resolution.\n\nOnce calculated the prices won't change anymore for the requested period.\nEven if the tariff is reconfigured the returned price will stay the same.\nThis is due to the fact that historical prices can not be changed anymore. \nChanges in the tariff will only have an effect in the future.\n\nThe returned currency is determined by the currency of the underlying tariff if not specified otherwise.\n", + "tags": [ + "TariffV2" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "interval", + "in": "query", + "description": "Requested time interval for fetching end-price tariff in the RFC3339 format.\nIf the available tariff data does not cover the full interval, the largest available subset will still be returned.\nIf the lower bound of the interval is not a multiple of the resolution, it will be truncated.\nIf the upper bound of the interval is not a multiple of the resolution, it will be rounded up.\n", + "required": true, + "example": "2020-09-21T00:00:00Z/2022-09-23T00:00:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + }, + { + "name": "resolution", + "in": "query", + "description": "Resolution of the end-price tariff periods as ISO8601 duration.\nIf not specified it will be a 15-min resolution.\n\nPossible resolutions are:\n- PT15M - 15 minutes\n- PT1H - 1 hour\n- P1D - 1 day\n", + "required": false, + "example": "PT1H", + "schema": { + "type": "string", + "format": "iso8601" + } + }, + { + "name": "currency", + "in": "query", + "description": "Currency in which the end prices should be returned.\n\nIf the underlying data isn't already in the requested currency, the prices will be converted.\nThis uses exchange rates with a daily resolution.\n", + "example": "EUR", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "End-price tariff of the system for the interval requested.\nIf the system has no tariff and therefore no end prices can be calculated the returned periods will be empty.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "End-price Tariff V2", + "description": "Represent a tariff v2 with end price periods.\nEnd prices are prices with applied offset, VAT and provider fee.\nIn contrast to normal \"TariffV2\" EndpriceTariffV2 always is for a particular interval\nand contains all periods for this interval.\n", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code (ISO 4217)", + "example": "EUR" + }, + "periods": { + "description": "List of periods containing end prices over non-overlapping periods. \nThe periods are sorted chronologically.\n", + "type": "array", + "items": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + } + } + }, + "x-readme-ref-name": "AbstractEndpriceTariffV2" + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the underlying TariffV2.", + "nullable": true + }, + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the contained periods starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the contained period ends in the RFC3339 format.\n" + }, + "periods": { + "items": { + "allOf": [ + { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + }, + { + "type": "object", + "required": [ + "marketPrice" + ] + } + ], + "x-readme-ref-name": "EndpriceTariffV2Period" + } + } + }, + "required": [ + "name", + "currency", + "from", + "to", + "periods" + ] + } + ], + "x-readme-ref-name": "EndpriceTariffV2" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/tariff/prices\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/tariff/prices \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/tariff/prices\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff/prices\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff/prices\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/tariff/prices\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/tariff/prices\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Set tariff end prices of a system", + "description": "Sets the tariff end prices for **external tariffs**.\n\nThe sent price periods have a few restrictions:\n- They must have a 15 minute resolution.\n- They must not have gaps for current and future prices (gaps in the past are allowed).\n\nThe prices can be sent in all supported currencies and will be converted by the `GET /tariff/prices` endpoint accordingly.\n\nYou don't have to send your prices in all the currencies you want to support.\nInternally they always will be converted to Euro, therefore sending the same price periods in different currencies will overwrite\nthe previously sent price periods. \n", + "tags": [ + "TariffV2" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "End-price Tariff V2", + "description": "Represent a tariff v2 with end price periods.\nEnd prices are prices with applied offset, VAT and provider fee.\nIn contrast to normal \"TariffV2\" EndpriceTariffV2 always is for a particular interval\nand contains all periods for this interval.\n", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code (ISO 4217)", + "example": "EUR" + }, + "periods": { + "description": "List of periods containing end prices over non-overlapping periods. \nThe periods are sorted chronologically.\n", + "type": "array", + "items": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + } + } + }, + "x-readme-ref-name": "AbstractEndpriceTariffV2" + }, + { + "type": "object", + "properties": { + "currency": { + "description": "Currency code (ISO 4217)\nIf not set, the currency of the tariff is used.\n" + }, + "periods": { + "minItems": 1 + } + }, + "required": [ + "periods" + ] + } + ], + "x-readme-ref-name": "EndPriceTariffV2Set" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EndPriceTariffV2SetStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Price periods successfully inserted.\n\nReturns an end-price tariff with all inserted price periods.\n", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "End-price Tariff V2", + "description": "Represent a tariff v2 with end price periods.\nEnd prices are prices with applied offset, VAT and provider fee.\nIn contrast to normal \"TariffV2\" EndpriceTariffV2 always is for a particular interval\nand contains all periods for this interval.\n", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code (ISO 4217)", + "example": "EUR" + }, + "periods": { + "description": "List of periods containing end prices over non-overlapping periods. \nThe periods are sorted chronologically.\n", + "type": "array", + "items": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + } + } + }, + "x-readme-ref-name": "AbstractEndpriceTariffV2" + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the underlying TariffV2.", + "nullable": true + }, + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the contained periods starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the contained period ends in the RFC3339 format.\n" + }, + "periods": { + "items": { + "allOf": [ + { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + }, + { + "type": "object", + "required": [ + "marketPrice" + ] + } + ], + "x-readme-ref-name": "EndpriceTariffV2Period" + } + } + }, + "required": [ + "name", + "currency", + "from", + "to", + "periods" + ] + } + ], + "x-readme-ref-name": "EndpriceTariffV2" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/tariff/prices\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/systems/systemID/tariff/prices \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/tariff/prices\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff/prices\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/tariff/prices\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/tariff/prices\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/tariff/prices\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/decisions": { + "get": { + "summary": "Get time of use optimization decisions of a system.", + "description": "Get optimization decisions and associated metrics for a system with `system_id`,\nwithin given time interval. Note that decisions may not always cover the complete time interval.\nOnly decisions with `start_at` in the past are returned.\nThe maximum time interval that can be requested is 48 hours.\n", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "interval", + "description": "Requested time interval, formatted in ISO8601.\n\nIn this format the start and end point of the interval are formatted according\nto RFC3339 and separated by a slash \"/\".\n", + "in": "query", + "required": true, + "allowReserved": true, + "example": "2021-12-24T18:21:00Z/2021-12-25T18:21:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + } + ], + "responses": { + "200": { + "description": "Array of optimization decisions and associated metrics.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "properties": { + "decisions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time" + }, + "to": { + "type": "string", + "format": "date-time" + }, + "case_name": { + "type": "string", + "enum": [ + "BATTERY_SELF_CONSUMPTION", + "BATTERY_NO_DISCHARGE", + "BATTERY_CHARGE_FROM_GRID", + "BATTERY_DISCHARGE_TO_GRID", + "BATTERY_NO_CHARGE", + "BATTERY_LIMIT_CHARGE", + "BATTERY_LIMIT_DISCHARGE", + "BATTERY_UNDEFINED_DECISION", + "EV_NO_DECISION", + "EV_CHARGE_FROM_GRID", + "EV_NO_CHARGE", + "EV_LIMIT_CHARGE", + "EV_LIMIT_DISCHARGE", + "EV_UNDEFINED_DECISION", + "HEATPUMP_RECOMMEND_ON", + "HEATPUMP_AUTO", + "PV_CURTAILMENT", + "PV_NO_DECISION" + ], + "example": "BATTERY_CHARGE_FROM_GRID", + "description": "Identifies underlying the decision case that this decision is based on.\nThe following cases are implemented:\n1. `BATTERY_SELF_CONSUMPTION`: No time-of-use decision applied for the battery. In this case, the default\nself-consumption maximization logic applies to the battery.\n2. `BATTERY_NO_DISCHARGE`: Do not discharge the battery, even if there is demand and no PV surplus.\nDemand is served with power from the grid, instead of discharging the battery.\n3. `BATTERY_CHARGE_FROM_GRID`: Charge the battery with power for the grid, instead of only\ncharging the PV surplus. The battery is forced to charge with maximum charging power.\n4. `BATTERY_DISCHARGE_TO_GRID`: Discharge the battery into the grid, instead of only discharging to serve demand. \nDischarge of the battery may coincide with PV surplus, to benefit from high grid export prices charging the PV \nsurplus. The battery is forced to discharge with maximum power.\n5. `BATTERY_NO_CHARGE`: Do not charge the battery, even if there is PV surplus. PV surplus is injected\ninto the grid, instead of charging the battery.\n6. `BATTERY_LIMIT_CHARGE`: Limit the charging power of the battery, even if there is additional PV surplus.\n7. `BATTERY_LIMIT_DISCHARGE`: Limit the discharging power of the battery, even if there is additional demand.\n8. `BATTERY_UNDEFINED_DECISION`: Decision applied to the battery, but the decision cannot be mapped to any\nother decision case. This case is used as a fallback for newly implemented decision cases.\nself-consumption maximization logic applies to the battery.\n9. `EV_NO_DECISION`: No time-of-use decision applied for the EV. In this case, the default\ncharge logic applies to the EV, depending on the charge mode.\n10. `EV_CHARGE_FROM_GRID`: Charge the EV with power for the grid, instead of only\ncharging the PV surplus. The EV is forced to charge with maximum charging power.\n11. `EV_NO_CHARGE`: Do not charge the EV, even if there is PV surplus.\n12. `EV_LIMIT_CHARGE`: Limit the charging power of the EV.\n13. `EV_LIMIT_DISCHARGE`: Limit the discharging power of the EV.\n14. `EV_UNDEFINED_DECISION`: Decision applied to the EV, but the decision cannot be mapped to any\nother decision case. This case is used as a fallback for newly implemented decision cases.\n15. `HEATPUMP_RECOMMEND_ON`: Recommending the heat pump to switch on.\n16. `HEATPUMP_AUTO`: The heat pump is set to run in its energy-efficient normal mode.\n17. `PV_CURTAILMENT`: The PV production is curtailed to avoid grid export during periods of negative feed-in prices. \n18. `PV_NO_DECISION`: No time-of-use decision applied for the PV. \n" + }, + "insight": { + "type": "object", + "properties": { + "motives": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY_CHARGE_TO_COVER_LOAD", + "BATTERY_CHARGE_TO_DISCHARGE_TO_GRID", + "BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD", + "BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID", + "BATTERY_KEEP_TO_COVER_LOAD", + "BATTERY_KEEP_TO_DISCHARGE_TO_GRID", + "BATTERY_DISCHARGE_TO_GRID", + "EV_CHARGE_IN_LOW_PRICES", + "EV_CHARGE_TO_SATISFY_DESIRED_SOC", + "EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER", + "HEAT_PUMP_RECOMMEND_ON_MOTIVE" + ] + }, + "example": [ + "BATTERY_CHARGE_TO_COVER_LOAD" + ], + "description": "Identifies the motivation behind a ToU decision. The following insights are implemented:\n1. `BATTERY_CHARGE_TO_COVER_LOAD`: Charge the battery in low `import_price` to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n2. `BATTERY_CHARGE_TO_DISCHARGE_TO_GRID`: Charge the battery in low `import_price` to discharge to grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n3. `BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD`: Charge the battery from surplus to cover load later at higher import prices.\n4. `BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID`: Charge the battery from surplus to discharge to grid at higher export prices.\n5. `BATTERY_KEEP_TO_COVER_LOAD`: Delay battery discharge to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n6. `BATTERY_KEEP_TO_DISCHARGE_TO_GRID`: Delay battery discharge to the grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n7. `BATTERY_DISCHARGE_TO_GRID`: Discharge the battery into the grid to benefit from high export prices.\n8. `EV_CHARGE_IN_LOW_PRICES`: Charge the EV earlier in low `import_price`. The desired SoC expected to be met at `end_time`.\n9. `EV_CHARGE_TO_SATISFY_DESIRED_SOC`: Force Charge the EV from grid to ensure that the desired SoC at pre-defined departure time (regardless of prices).\n10. `EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER`: Prevent EV charge to allow PV surplus export at high export prices, and charge EV from grid later at lower import prices.\n11. `HEAT_PUMP_RECOMMEND_ON_MOTIVE`: Request increased heat pump operation, to avoid potential higher price periods or to use PV surplus.\n" + }, + "importPrice": { + "type": "number", + "example": 0.1, + "description": "Current import price at which the decision is taken.\n" + }, + "breakEvenImportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum import price at which using the stored energy later becomes more profitable than importing from grid, while accounting for battery efficiency losses.\n" + }, + "averageImportPrice": { + "type": "number", + "example": 0.1, + "description": "Average import price at which the stored energy was utilized.\n" + }, + "exportPrice": { + "type": "number", + "example": 0.1, + "description": "Current export price at which the decision is taken.\n" + }, + "breakEvenExportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum export price at which selling the stored energy to grid later becomes profitable, while accounting for battery efficiency losses.\n" + }, + "averageExportPrice": { + "type": "number", + "example": 0.1, + "description": "Average export price at which the stored energy was utilized.\n" + }, + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Refers to the start time of an upcoming event justifying the current decision (e.g., start of battery discharge to cover load / to grid).\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T01:00:00Z", + "description": "Refers to the end time of an upcoming event justifying the current decision (e.g., end of battery discharge to cover load / to grid).\n" + } + }, + "x-readme-ref-name": "DecisionInsight" + }, + "isPriceBasedOptimization": { + "type": "boolean", + "description": "Indicates if the decision is based on price. In most cases, decisions not based on price correspond to the \"default\" decision for a particular appliance type." + } + }, + "required": [ + "from", + "to", + "case_name", + "isPriceBasedOptimization" + ], + "x-readme-ref-name": "Decision" + } + }, + "metrics": { + "type": "object", + "properties": { + "percent_decision_taken": { + "type": "number", + "format": "double", + "example": 75, + "description": "Percentage of the taken decisions as a share of the total possible decisions during this time interval. Taken decisions are all decisions excluding \"no-decision\" cases.\n" + } + }, + "required": [ + "percent_decision_taken" + ], + "x-readme-ref-name": "DecisionMetrics" + } + }, + "required": [ + "decisions", + "metrics" + ], + "x-readme-ref-name": "Decisions" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/decisions\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/decisions \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/decisions\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/decisions\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/decisions\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/decisions\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/decisions\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/settings": { + "get": { + "summary": "Get time of use optimization settings of a system.", + "description": "Get time of use optimization settings of a system.", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "200": { + "description": "Ok", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "required": [ + "enabled", + "enabledBatteryChargeFromGrid", + "enabledDischargeFlexibilityToGrid" + ] + } + ] + } + } + } + }, + "204": { + "description": "No time of use setting information found for the given systemID" + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/settings\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/settings \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/settings\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/settings\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/settings\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/settings\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/settings\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "put": { + "summary": "Set time of use optimization settings for a system.", + "description": "Set time of use optimization settings for a system.", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "properties": { + "enabledBatteryChargeFromGrid": { + "default": true + }, + "enabledDischargeFlexibilityToGrid": { + "default": false + } + }, + "required": [ + "enabled" + ] + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPut" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPutStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "required": [ + "enabled", + "enabledBatteryChargeFromGrid", + "enabledDischargeFlexibilityToGrid" + ] + } + ] + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/settings\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.put(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PUT \\\n --url https://api.gridx.de/systems/systemID/timeofuse/settings \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/settings\"\n\n\treq, _ := http.NewRequest(\"PUT\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/settings\")\n .put(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/settings\")\n .put(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/settings\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PUT\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/settings\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PutAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update time of use optimization settings for a system.", + "description": "Update time of use optimization settings for a system.", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPatchStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "required": [ + "enabled", + "enabledBatteryChargeFromGrid", + "enabledDischargeFlexibilityToGrid" + ] + } + ] + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/settings\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/systems/systemID/timeofuse/settings \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/settings\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/settings\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/settings\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/settings\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/settings\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/forecasts/meter": { + "get": { + "summary": "Get the Time-of-Use forecasts for the grid connection point.", + "description": "The Time-of-Use (ToU) optimization runs on a given resolution of 15 minutes.\nFor each time segment, i.e. `[10:00, 10:15]` it publishes a series of forecasts for\nthe grid connection point associated with a system with `systemID`.\n\nThis endpoint requires to specify a time window called `interval` for which the forecasts are returned.\nFor example `[2021-01-01T02:07:14Z, 2021-01-02T02:07:14Z]`.\nIf no interval is provided it is assumed to be `[00:00:00 today, 00:00:00 in two days]`.\nThe maximum size of this interval is 48h.\n\nThis endpoint returns the forecasts **in the selected time window**.\nPlease note that the forecasts might not cover the whole time window.\nIn this case the largest possible subset is returned.\nIf no forecast is available, an empty list is returned.\n", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "interval", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "datetime", + "example": "2018-04-01T15:00:00Z/2018-04-25T00:00:00Z" + }, + "description": "A time interval [start_timestamp, end_timestamp] encoded as a unique string start_timestamp/end_timestamp.\nEach timestamp should be specified in the RFC3339 format.\nThe maximum time interval that can be requested is 48 hours.\nIMPORTANT: it has to be fully URL encoded (also known as Percent-encoding), including the `/`.\n" + } + ], + "responses": { + "200": { + "description": "Successful request. Retrieved forecasts for the given parameters.\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the validity period for the forecast.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T22:10:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the validity period for the forecast.\n" + }, + "periods": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "importActivePower": { + "type": "number", + "description": "The forecasted import active power in Watts.\n" + }, + "exportActivePower": { + "type": "number", + "description": "The forecasted export active power in Watts.\n" + } + }, + "x-readme-ref-name": "GridConnectionPointPeriod" + } + }, + "lastUpdated": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Last time when the forecast was updated.\n" + } + }, + "x-readme-ref-name": "GridConnectionPointForecasts" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter\"\n\nheaders = {\"accept\": \"application/json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter \\\n --header 'accept: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/forecasts/meter/last-updated": { + "get": { + "summary": "Get the last updated timestamp for the Time-of-Use forecasts for the grid connection point.", + "description": "The Time-of-Use (ToU) optimization runs on a given resolution of 15 minutes.\nFor each time segment, i.e. `[10:00, 10:15]` it publishes a series of forecasts for\nthe grid connection point associated with a system with `systemID`.\n\nThis endpoint requires to specify a time window called `interval` for which the forecasts are returned.\nFor example `[2021-01-01T02:07:14Z, 2021-01-02T02:07:14Z]`.\nIf no interval is provided it is assumed to be `[00:00:00 today, 00:00:00 in two days]`.\nThe maximum size of this interval is 48h.\n\nThis endpoint returns the last timestamp RFC3339 format when the forecasts **in the selected time window**\nwere updated.\n", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "interval", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "datetime", + "example": "2018-04-01T15:00:00Z/2018-04-25T00:00:00Z" + }, + "description": "A time interval [start_timestamp, end_timestamp] encoded as a unique string start_timestamp/end_timestamp.\nEach timestamp should be specified in the RFC3339 format.\nThe maximum time interval that can be requested is 48 hours.\nIMPORTANT: it has to be fully URL encoded (also known as Percent-encoding), including the `/`.\n" + } + ], + "responses": { + "200": { + "description": "Successful request. Retrieved last update time for the given parameters.\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "lastUpdated": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Last time when the prediction where updated.\n" + } + } + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter/last-updated\"\n\nheaders = {\"accept\": \"application/json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter/last-updated \\\n --header 'accept: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter/last-updated\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter/last-updated\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter/last-updated\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter/last-updated\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/forecasts/meter/last-updated\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/status": { + "get": { + "summary": "Get the historical status of the Time-of-Use service.", + "description": "The Time-of-Use (ToU) optimization runs on a given resolution of 15 minutes.\nFor each time segment, i.e. `[10:00, 10:15]` it publishes an operational status\nassociated with a system with `systemID`.\n\nThis endpoint requires to specify a time window called `interval` for which the status data are returned.\nFor example `[2021-01-01T02:07:14Z, 2021-01-02T02:07:14Z]`.\nIf no interval is provided it is assumed to be `[now - 48h, now]`.\nThe maximum size of this interval is 48h.\nPlease note that the statuses might not cover the whole time window.", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "interval", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "datetime", + "example": "2018-04-01T15:00:00Z/2018-04-25T00:00:00Z" + }, + "description": "A time interval [start_timestamp, end_timestamp] encoded as a unique string start_timestamp/end_timestamp.\nEach timestamp should be specified in the RFC3339 format.\nThe maximum time interval that can be requested is 48 hours.\nIMPORTANT: it has to be fully URL encoded (also known as Percent-encoding), including the `/`.\n" + } + ], + "responses": { + "200": { + "description": "Successful request. Retrieved historical status for given parameters.\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the validity period for the status history.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T22:10:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the validity period for the status history.\n" + }, + "periods": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "status": { + "type": "string", + "enum": [ + "ONLINE", + "SUBOPTIMAL", + "OFFLINE", + "DISABLED", + "INITIALIZING" + ], + "example": "ONLINE", + "description": "Operational status of Time-of-Use for a specific run.\n\n* `ONLINE` - Time-of-Use optimization is running successfully.\n* `SUBOPTIMAL` - Time-of-Use optimization is running suboptimally.\n* `OFFLINE` - Time-of-Use optimization failed.\n* `DISABLED` - Time-of-Use optimization is disabled for the system.\n* `INITIALIZING` - Time-of-Use optimization is initializing, it may take up to 48h.\n", + "x-readme-ref-name": "StatusValue" + }, + "error_code": { + "type": "string", + "enum": [ + "STATIC_PRICES", + "MISSING_PRICES", + "INCOMPLETE_PRICES", + "MISSING_APPLIANCES", + "MISSING_GRID_METER", + "MULTIPLE_GRID_METERS", + "MULTIPLE_BATTERIES", + "MULTIPLE_EVCS", + "MULTIPLE_HEAT_PUMPS", + "MULTIPLE_PVS_CURTAILMENT", + "MISSING_CONTROLLABLE_APPLIANCE", + "OFFLINE_APPLIANCE", + "EMS_NOT_ENABLED", + "EMS_CONSENT_NOT_GIVEN", + "UNKNOWN_INVERTER", + "INTERNAL_ERROR" + ], + "example": "INTERNAL_ERROR", + "description": "Most recent error causing a failure of Time-of-Use specific run.\n* `STATIC_PRICES` - Time-of-Use failing due to import and export prices are constant.\n* `MISSING_PRICES` - Time-of-Use failing due to missing import and export prices.\n* `INCOMPLETE_PRICES` - Time-of-Use failing due to incomplete import and export prices.\n* `MISSING_APPLIANCES` - Time-of-Use failing due to missing appliances in a system.\n* `MISSING_GRID_METER` - Time-of-Use failing due to missing grid meter.\n* `MULTIPLE_GRID_METERS` - Time-of-Use failing due to multiple grid meters within a system.\n* `MULTIPLE_BATTERIES` - Time-of-Use failing due to multiple batteries within a system.\n* `MULTIPLE_EVCS` - Time-of-Use failing due to multiple EV charging stations within a system.\n* `MULTIPLE_HEAT_PUMPS` - Time-of-Use failing due to multiple heat pumps within a system.\n* `MULTIPLE_PVS_CURTAILMENT` - Time-of-Use failing due to multiple PVs within a system with PV curtailment enabled.\n* `MISSING_CONTROLLABLE_APPLIANCE` - Time-of-Use failing due to missing controllable device (battery, EV or heat pump).\n* `OFFLINE_APPLIANCE` - Time-of-Use failing due to an offline appliance.\n* `EMS_NOT_ENABLED` - Time-of-Use failing due to energy management not being enabled on the system.\n* `EMS_CONSENT_NOT_GIVEN` - Time-of-Use failing due to consent to energy management not being given for the system.\n* `UNKNOWN_INVERTER` - Time-of-Use failing due to an unknown inverter.\n* `INTERNAL_ERROR` - Time-of-Use failing due to an unknown, internal issue.\n", + "x-readme-ref-name": "ToUErrorCode" + }, + "warnings": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "MISSING_EV_CONFIG", + "MISSING_EV_PROFILE", + "UNSUPPORTED_CHARGE_MODE_QUICK", + "UNSUPPORTED_CHARGE_MODE_SURPLUS", + "UNSUPPORTED_CHARGE_MODE_SAFETY", + "UNSUPPORTED_CHARGE_MODE_UNKNOWN" + ] + }, + "example": [ + "MISSING_EV_CONFIG" + ], + "description": "All the relevant warnings that occurred during a Time-of-Use specific run.\n\n* `MISSING_EV_CONFIG` - Time-of-Use not working optimally due to missing EV configuration.\n* `MISSING_EV_PROFILE` - Time-of-Use not working optimally due to missing EV profile.\n* `UNSUPPORTED_CHARGE_MODE_QUICK` - Time-of-Use not working optimally due to EV set to Quick Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SURPLUS` - Time-of-Use not working optimally due to EV set to Surplus Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SAFETY` - Time-of-Use not working optimally due to EV set to Safety Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_UNKNOWN` - Time-of-Use not working optimally due to EV set to unknown charge mode.\n", + "x-readme-ref-name": "ToUWarnings" + } + }, + "x-readme-ref-name": "RunStatus" + }, + "x-readme-ref-name": "RunStatuses" + } + }, + "x-readme-ref-name": "StatusHistory" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/status\"\n\nheaders = {\"accept\": \"application/json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/status \\\n --header 'accept: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/status\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/status\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/status\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/status\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/status\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/status/current": { + "get": { + "summary": "Get the last known status of the Time-of-Use service.", + "description": "The Time-of-Use (ToU) optimization runs on a given resolution of 15 minutes.\nFor each time segment, i.e. `[10:00, 10:15]` it publishes an operational status for\nassociated with a system with `systemID`.\n\nThis endpoint provides the last known, or current, status of the Time-of-Use runs.", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "200": { + "description": "Successful request. Retrieved status for the given parameters.\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "status": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "status": { + "type": "string", + "enum": [ + "ONLINE", + "SUBOPTIMAL", + "OFFLINE", + "DISABLED", + "INITIALIZING" + ], + "example": "ONLINE", + "description": "Operational status of Time-of-Use for a specific run.\n\n* `ONLINE` - Time-of-Use optimization is running successfully.\n* `SUBOPTIMAL` - Time-of-Use optimization is running suboptimally.\n* `OFFLINE` - Time-of-Use optimization failed.\n* `DISABLED` - Time-of-Use optimization is disabled for the system.\n* `INITIALIZING` - Time-of-Use optimization is initializing, it may take up to 48h.\n", + "x-readme-ref-name": "StatusValue" + }, + "error_code": { + "type": "string", + "enum": [ + "STATIC_PRICES", + "MISSING_PRICES", + "INCOMPLETE_PRICES", + "MISSING_APPLIANCES", + "MISSING_GRID_METER", + "MULTIPLE_GRID_METERS", + "MULTIPLE_BATTERIES", + "MULTIPLE_EVCS", + "MULTIPLE_HEAT_PUMPS", + "MULTIPLE_PVS_CURTAILMENT", + "MISSING_CONTROLLABLE_APPLIANCE", + "OFFLINE_APPLIANCE", + "EMS_NOT_ENABLED", + "EMS_CONSENT_NOT_GIVEN", + "UNKNOWN_INVERTER", + "INTERNAL_ERROR" + ], + "example": "INTERNAL_ERROR", + "description": "Most recent error causing a failure of Time-of-Use specific run.\n* `STATIC_PRICES` - Time-of-Use failing due to import and export prices are constant.\n* `MISSING_PRICES` - Time-of-Use failing due to missing import and export prices.\n* `INCOMPLETE_PRICES` - Time-of-Use failing due to incomplete import and export prices.\n* `MISSING_APPLIANCES` - Time-of-Use failing due to missing appliances in a system.\n* `MISSING_GRID_METER` - Time-of-Use failing due to missing grid meter.\n* `MULTIPLE_GRID_METERS` - Time-of-Use failing due to multiple grid meters within a system.\n* `MULTIPLE_BATTERIES` - Time-of-Use failing due to multiple batteries within a system.\n* `MULTIPLE_EVCS` - Time-of-Use failing due to multiple EV charging stations within a system.\n* `MULTIPLE_HEAT_PUMPS` - Time-of-Use failing due to multiple heat pumps within a system.\n* `MULTIPLE_PVS_CURTAILMENT` - Time-of-Use failing due to multiple PVs within a system with PV curtailment enabled.\n* `MISSING_CONTROLLABLE_APPLIANCE` - Time-of-Use failing due to missing controllable device (battery, EV or heat pump).\n* `OFFLINE_APPLIANCE` - Time-of-Use failing due to an offline appliance.\n* `EMS_NOT_ENABLED` - Time-of-Use failing due to energy management not being enabled on the system.\n* `EMS_CONSENT_NOT_GIVEN` - Time-of-Use failing due to consent to energy management not being given for the system.\n* `UNKNOWN_INVERTER` - Time-of-Use failing due to an unknown inverter.\n* `INTERNAL_ERROR` - Time-of-Use failing due to an unknown, internal issue.\n", + "x-readme-ref-name": "ToUErrorCode" + }, + "warnings": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "MISSING_EV_CONFIG", + "MISSING_EV_PROFILE", + "UNSUPPORTED_CHARGE_MODE_QUICK", + "UNSUPPORTED_CHARGE_MODE_SURPLUS", + "UNSUPPORTED_CHARGE_MODE_SAFETY", + "UNSUPPORTED_CHARGE_MODE_UNKNOWN" + ] + }, + "example": [ + "MISSING_EV_CONFIG" + ], + "description": "All the relevant warnings that occurred during a Time-of-Use specific run.\n\n* `MISSING_EV_CONFIG` - Time-of-Use not working optimally due to missing EV configuration.\n* `MISSING_EV_PROFILE` - Time-of-Use not working optimally due to missing EV profile.\n* `UNSUPPORTED_CHARGE_MODE_QUICK` - Time-of-Use not working optimally due to EV set to Quick Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SURPLUS` - Time-of-Use not working optimally due to EV set to Surplus Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SAFETY` - Time-of-Use not working optimally due to EV set to Safety Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_UNKNOWN` - Time-of-Use not working optimally due to EV set to unknown charge mode.\n", + "x-readme-ref-name": "ToUWarnings" + } + }, + "x-readme-ref-name": "RunStatus" + } + } + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/status/current\"\n\nheaders = {\"accept\": \"application/json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/status/current \\\n --header 'accept: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/status/current\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/status/current\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/status/current\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/status/current\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/status/current\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/readiness": { + "get": { + "summary": "Evaluate whether the system is ready for enabling Time-of-Use.", + "description": "A series of operational prerequisites are required before enabling Time-of-Use (ToU) for a system.\nThe checks are done in order to evaluate the system's \"readiness\" for ToU.\nIn principal, checks pertaining to appliances used, price data used, as well as some system metadata are performed.", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "200": { + "description": "Successful request. Retrieved ToU readiness for the given parameters.\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isTouReady": { + "type": "boolean", + "example": false, + "description": "Truth value whether system is ready for ToU.\n" + }, + "reasons": { + "type": "array", + "description": "List of reasons detailing the cause(s) of the truth value of ToU Readiness\n", + "items": { + "type": "string", + "enum": [ + "UNKNOWN_REASON", + "UNSUPPORTED_SETUP_NO_APPLIANCES_FOUND", + "UNSUPPORTED_SETUP_MULTIPLE_BATTERIES", + "UNSUPPORTED_SETUP_MULTIPLE_EVCS", + "UNSUPPORTED_SETUP_MULTIPLE_GRID_METERS", + "UNSUPPORTED_SETUP_MULTIPLE_HEAT_PUMPS", + "UNSUPPORTED_SETUP_NO_GRID_METER", + "UNSUPPORTED_SETUP_NO_CONTROLLABLE_APPLIANCE", + "UNSUPPORTED_SETUP_UNKNOWN_APPLIANCE", + "UNSUPPORTED_APPLIANCE_PV_INVERTER", + "UNSUPPORTED_APPLIANCE_BATTERY_INVERTER", + "UNSUPPORTED_APPLIANCE_EVCS", + "UNSUPPORTED_APPLIANCE_HEAT_PUMP", + "SYSTEM_LOCATION_MISSING", + "TARIFF_PRICES_NOT_SET", + "TARIFF_PRICES_NOT_DYNAMIC", + "TARIFF_PRICES_BIDDING_ZONE_NOT_SET" + ], + "example": "UNSUPPORTED_SETUP_NO_APPLIANCES_FOUND", + "description": "Justification for ToU Readiness truth value.\n", + "x-readme-ref-name": "ToUReadinessReason" + } + } + }, + "required": [ + "isTouReady" + ], + "x-readme-ref-name": "ToUReadiness" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/readiness\"\n\nheaders = {\"accept\": \"application/json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/readiness \\\n --header 'accept: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/readiness\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/readiness\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/readiness\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/readiness\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/readiness\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/timeofuse/kpi": { + "get": { + "summary": "Get the historical KPIs of the Time-of-Use service.", + "description": "Provides Key Performance Indicators (KPIs) for system cost analysis under Time-of-Use (ToU) and \nSelf-Sufficiency Optimization (SSO) models. Returns interval-based ToU and SSO costs to evaluate potential savings between the two scenarios.", + "tags": [ + "TimeOfUse" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "interval", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "datetime", + "example": "2018-04-01T15:00:00Z/2018-04-25T00:00:00Z" + }, + "description": "A time interval [start_timestamp, end_timestamp] encoded as a unique string start_timestamp/end_timestamp.\nEach timestamp should be specified in the RFC3339 format.\nThe maximum time interval that can be requested is 48 hours.\nIMPORTANT: it has to be fully URL encoded (also known as Percent-encoding), including the `/`.\n" + } + ], + "responses": { + "200": { + "description": "Successful request. Retrieved historical KPI for given parameters.\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "periods": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-22T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "touCost": { + "type": "number", + "description": "ToU cost for the requested interval.\n" + }, + "touCostCurrency": { + "type": "string", + "description": "A currency for a ToU cost for the requested interval.\n" + }, + "ssoCost": { + "type": "number", + "description": "SSO cost for the requested interval.\n" + }, + "ssoCostCurrency": { + "type": "string", + "description": "A currency for a SSO cost for the requested interval.\n" + }, + "errorCode": { + "type": "string", + "description": "Error code describing the reason of a failed saving calculation run.\n" + } + }, + "description": "Time-of-Use KPI record.\n", + "x-readme-ref-name": "KPI" + }, + "description": "Time-of-Use KPI collection.\n", + "x-readme-ref-name": "KPIs" + } + }, + "description": "Time-of-Use KPI history for the system for which the request is made.\n", + "x-readme-ref-name": "KPIHistory" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "404": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "502": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/timeofuse/kpi\"\n\nheaders = {\"accept\": \"application/json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/timeofuse/kpi \\\n --header 'accept: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/timeofuse/kpi\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/kpi\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/timeofuse/kpi\")\n .get()\n .addHeader(\"accept\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/timeofuse/kpi\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/timeofuse/kpi\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/live": { + "get": { + "summary": "Retrieve System's Live Measurement.", + "description": "Retrieves a system's latest aggregated measurement.", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemMeasurementsRead" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + ], + "responses": { + "200": { + "description": "Successfully returned system's live measurements.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Date and time at which the data point was observed.\nFor power values the data point is written after the aggregated \ntime span. For energy values the observation is stored at the \nbeginning of the aggregated time span.\n" + }, + "grid": { + "type": "number", + "format": "double", + "description": "Grid is the measured power/energy at the grid connection point.\n\nFor power values, Positive values indicate supply, Negative values\nindicate feed in.\n" + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the power/energy measured at the grid connection point's \nfirst phase.\n" + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the power/energy measured at the grid connection point's \nsecond phase.\n" + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the power/energy measured at the grid connection point's \nthird phase.\n" + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells.\n" + }, + "production": { + "type": "number", + "format": "double", + "description": "Sum of all energy producing appliances (e.g. PV)." + }, + "battery": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + }, + "batteries": { + "type": "array", + "description": "Battery measurements for each battery in the system.", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "Aggregated measured power/energy for heat pumps.\n" + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "Aggregated measured power/energy for heat pumps that have their own \nheat pump tariff.\n" + }, + "heatPumps": { + "type": "array", + "description": "Heat pump measurements for each heat pump in the system.", + "items": { + "title": "Heat pump measurement", + "type": "object", + "properties": { + "applianceID": { + "type": "string" + }, + "power": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "HeatPumpMeasurement" + } + }, + "evChargingStation": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + }, + "evChargingStations": { + "type": "array", + "description": "Charging station measurements for all charging stations that are \npart of the system.\n", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system including heatpumps\nand EV charging stations.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "Power/Energy consumed through production and charged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "Power/energy consumed through production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the household through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the heat pump through production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the EV through production directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the heater through production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "Power/energy consumed through storage and production.\n" + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double", + "description": "Ratio of produced energy vs total consumed energy (0.0-1.0).\n", + "example": 0.9 + }, + "selfConsumptionRate": { + "type": "number", + "format": "double", + "description": "Ratio of self consumption vs production (0.0-1.0)." + }, + "directConsumptionRate": { + "type": "number", + "format": "double", + "description": "Ratio of direct consumption vs production (0.0-1.0)." + }, + "heating": { + "type": "number", + "format": "double", + "description": "Aggregated power/energy measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "Average temperature of the heaters in °C." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "Power of the appliances with misc location, empty for energy.\n" + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for grid in Ws (Imported Energy), empty for energy.\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for grid in Ws (Exported Energy), empty for energy.\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for heatpump in Ws (Imported Energy), empty for \nenergy.\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter Reading for heatpump in Ws (Exported Energy), empty for \nenergy.\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "description": "Number of times the fuse was protected, based on the curtailed power\nover all phases.\n" + } + }, + "x-readme-ref-name": "Measurement" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/live\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/live \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/live\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/live\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/live\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/live\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/live\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/systems/{systemID}/historical": { + "get": { + "summary": "Historical Measurements for Systems", + "description": "Lists aggregated measurements of a system over a period of time.\n\nSystem measurements are the result of incorporating measurements from \nall appliances that are part of a system. This allows computing e.g. \noverall consumption adding producers (e.g. PV) and subtracting consumers\n(e.g. EV charging stations). This aggregation is performed in various \nresolutions to suit different use cases. See the 'resolution' parameter\nfor a list of options.\n\nDepending on the resolution parameter, the response contains either\npower or energy measurements (unless otherwise documented):\n- **power** (unit: W): `15m`, `1h`\n- **energy** (unit: Wh): `1d`, `1w`, `1M`, `1y`\n\nMeasurements are \"aligned\" differently whether they contain energy or\npower measurements:\n- For power values the data point is written after the aggregated time \n span. For the interval 2018-04-01T00:00:00Z/2018-04-02T00:00:00Z\n with resolution 15m the first observation will be recorded at \n 2018-04-01T00:15:00Z\n- For energy values the observation is stored at the beginning of \n the aggregated time span. For the interval \n 2018-04-01T00:00:00Z/2018-04-05T00:00:00Z and resolution 1d the first \n observation will be recorded at 2018-04-01T00:00:00Z\n\nThe `total` object of the response contains an aggregation of the \nindividual data points over time and therefore is an energy value.\nThe `total.measuredAt` field is an interval containing all data points \nin the requested interval.\n\nIn order to reduce the duration of the endpoint, the gridX API imposes \nlimitations on the interval for a given resolution:\n\n| Resolution | Limit |\n|------------|-------------------------|\n| 15m | intervals up to 1 day |\n| 1h | intervals up to 1 week |\n| 1d | intervals up to 1 month |\n| 1w | intervals up to 1 month |\n| 1M | intervals up to 5 years |\n| 1y | no limit |\n", + "tags": [ + "System" + ], + "security": [ + { + "BearerAuth": [ + "SystemMeasurementsRead" + ] + } + ], + "parameters": [ + { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + { + "name": "interval", + "description": "Requested time interval, formatted in ISO8601.\n\nIn this format the start and end point of the interval are formatted according\nto RFC3339 and separated by a slash \"/\".\n", + "in": "query", + "required": true, + "allowReserved": true, + "example": "2021-12-24T18:21:00Z/2021-12-25T18:21:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + }, + { + "name": "resolution", + "description": "Requested resolution, formatted in ISO8601 units.\n\nIn this format the resolution is formatted with a single number and corresponding\nISO8601 date or time unit.\n", + "in": "query", + "example": "1h", + "schema": { + "type": "string", + "default": "1h", + "enum": [ + "15m", + "1h", + "1d", + "1w", + "1M" + ] + } + } + ], + "responses": { + "200": { + "description": "Successfully returned system's aggregated measurements.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Measurements", + "type": "object", + "properties": { + "total": { + "allOf": [ + { + "title": "Extended Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "description": "Time when the data was measured." + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the part of the grid connection point's first phase." + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the part of the grid connection point's second phase." + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the part of the grid connection point's second phase." + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells." + }, + "production": { + "type": "number", + "format": "double", + "description": "Production is sum of the producers." + }, + "batteries": { + "type": "array", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "HeatPump is the measured power/energy in front of the heat pumps." + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "HeatPumpExternal is the measured power/energy in front of the heat\npump which has its own heat pump tariff.\n" + }, + "evChargingStations": { + "type": "array", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Consumption is adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system which\nincludes heatpump and EV.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "SelfConsumption is power/energy consumed through production and\ncharged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "DirectConsumption is power/energy consumed from production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHousehold is power/energy consumed by the\nhousehold through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeatPump is power/energy consumed by the heat pump\nthrough production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "DirectConsumptionEV is power/energy consumed by the EV through\nproduction directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeater is the power/energy consumed by the heater\nthrough production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "SelfSupply is power/energy consumed through storage and production." + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double" + }, + "selfConsumptionRate": { + "type": "number", + "format": "double" + }, + "directConsumptionRate": { + "type": "number", + "format": "double" + }, + "heating": { + "type": "number", + "format": "double", + "description": "HeatingPower is the aggregated amount of power measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "HeatingTemperature is temperature of the heaters." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "AppliancePower is power of the appliances with misc location." + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Imported Energy).\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Exported Energy).\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingPositive is the meter Reading for HeatPump in Ws\n(Imported Energy).\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingNegative is the meter Reading for HeatPump in Ws\n(Exported Energy).\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "minimum": 0, + "description": "Number of times the fuse was protected, based on the curtailed power over all phases.\n" + }, + "grid": { + "title": "Measurement Grid", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + }, + "supplyLimit": { + "type": "number", + "format": "double" + }, + "meterReading": { + "title": "Measurement Grid Meter Reading", + "type": "object", + "properties": { + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "MeasurementGridMeterReading" + } + }, + "x-readme-ref-name": "MeasurementGrid" + }, + "battery": { + "title": "Extended Battery Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "Power/energy charged to the battery." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the battery." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of battery capacity charged (0.0-1.0).\n" + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Capacity is the maximum energy the battery can provide in Wh.\n" + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "NominalCapacity is the nominal capacity of battery in Wh.\n" + } + }, + "x-readme-ref-name": "MeasurementBatteryExtended" + }, + "evChargingStation": { + "title": "Extended EV Station Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "The measured charging power of the EV." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the EV." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of EV battery charged (0.0-1.0)." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current on the first phase of the EV station in A (ampere).\n" + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current on the second phase of the EV station in A." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current on the third phase of the EV station in A." + } + }, + "x-readme-ref-name": "MeasurementEVStationExtended" + } + }, + "x-readme-ref-name": "MeasurementExtended" + }, + { + "properties": { + "measuredAt": { + "description": "Interval containing all data points in the requested interval formatted in ISO8601.\n", + "type": "string", + "example": "2018-04-01T00:00:00Z/2018-04-05T00:00:00Z" + } + }, + "type": "object" + } + ] + }, + "data": { + "type": "array", + "items": { + "allOf": [ + { + "title": "Extended Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "description": "Time when the data was measured." + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the part of the grid connection point's first phase." + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the part of the grid connection point's second phase." + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the part of the grid connection point's second phase." + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells." + }, + "production": { + "type": "number", + "format": "double", + "description": "Production is sum of the producers." + }, + "batteries": { + "type": "array", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "HeatPump is the measured power/energy in front of the heat pumps." + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "HeatPumpExternal is the measured power/energy in front of the heat\npump which has its own heat pump tariff.\n" + }, + "evChargingStations": { + "type": "array", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Consumption is adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system which\nincludes heatpump and EV.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "SelfConsumption is power/energy consumed through production and\ncharged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "DirectConsumption is power/energy consumed from production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHousehold is power/energy consumed by the\nhousehold through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeatPump is power/energy consumed by the heat pump\nthrough production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "DirectConsumptionEV is power/energy consumed by the EV through\nproduction directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeater is the power/energy consumed by the heater\nthrough production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "SelfSupply is power/energy consumed through storage and production." + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double" + }, + "selfConsumptionRate": { + "type": "number", + "format": "double" + }, + "directConsumptionRate": { + "type": "number", + "format": "double" + }, + "heating": { + "type": "number", + "format": "double", + "description": "HeatingPower is the aggregated amount of power measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "HeatingTemperature is temperature of the heaters." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "AppliancePower is power of the appliances with misc location." + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Imported Energy).\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Exported Energy).\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingPositive is the meter Reading for HeatPump in Ws\n(Imported Energy).\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingNegative is the meter Reading for HeatPump in Ws\n(Exported Energy).\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "minimum": 0, + "description": "Number of times the fuse was protected, based on the curtailed power over all phases.\n" + }, + "grid": { + "title": "Measurement Grid", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + }, + "supplyLimit": { + "type": "number", + "format": "double" + }, + "meterReading": { + "title": "Measurement Grid Meter Reading", + "type": "object", + "properties": { + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "MeasurementGridMeterReading" + } + }, + "x-readme-ref-name": "MeasurementGrid" + }, + "battery": { + "title": "Extended Battery Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "Power/energy charged to the battery." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the battery." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of battery capacity charged (0.0-1.0).\n" + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Capacity is the maximum energy the battery can provide in Wh.\n" + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "NominalCapacity is the nominal capacity of battery in Wh.\n" + } + }, + "x-readme-ref-name": "MeasurementBatteryExtended" + }, + "evChargingStation": { + "title": "Extended EV Station Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "The measured charging power of the EV." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the EV." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of EV battery charged (0.0-1.0)." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current on the first phase of the EV station in A (ampere).\n" + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current on the second phase of the EV station in A." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current on the third phase of the EV station in A." + } + }, + "x-readme-ref-name": "MeasurementEVStationExtended" + } + }, + "x-readme-ref-name": "MeasurementExtended" + }, + { + "properties": { + "measuredAt": { + "format": "date-time" + } + } + } + ] + } + } + }, + "x-readme-ref-name": "Measurements" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/systems/systemID/historical\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/systems/systemID/historical \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/systems/systemID/historical\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/historical\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/systems/systemID/historical\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/systems/systemID/historical\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/systems/systemID/historical\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/appliances/{applianceID}/measurements/appliance": { + "get": { + "summary": "List Appliance's Raw Measurements", + "description": "Lists raw measurements of an appliance over a period of time.\n\nThe provided `interval` must not span more than 24 hours.\n\nThe resolution cannot be controlled. The granularity at which we store\nmeasurements varies from appliance to appliance, firmware and \nconfiguration.\n\nListing raw measurements is only supported for appliances of type:\n* `INVERTER`\n* `METER`\n* `EVSTATION`\n* `HEAT_PUMP`\n* `ELECTROLYZER`\n", + "tags": [ + "Appliance" + ], + "security": [ + { + "BearerAuth": [ + "ApplianceMeasurementsRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + }, + { + "name": "interval", + "description": "Requested time interval, formatted in ISO8601.\n\nIn this format the start and end point of the interval are formatted according\nto RFC3339 and separated by a slash \"/\".\n", + "in": "query", + "required": true, + "allowReserved": true, + "example": "2021-12-24T18:21:00Z/2021-12-25T18:21:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + } + ], + "responses": { + "200": { + "description": "Returned raw measurement.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "description": "List of raw measurements of an appliance.", + "type": "array", + "items": { + "description": "Raw measurement of an appliance.", + "type": "object", + "oneOf": [ + { + "title": "Inverter's Measurements", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "gridFrequency": { + "type": "integer", + "format": "int32", + "description": "The locally measured grid frequency in centi (10^-2) Hz." + }, + "acCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current in mA." + }, + "l1ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L1 in mA." + }, + "l2ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L2 in mA." + }, + "l3ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L3 in mA." + }, + "l1ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L1 in mV." + }, + "l2ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L2 in mV." + }, + "l3ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L3 mV." + }, + "acActivePower": { + "type": "integer", + "format": "int32", + "description": "AC active power in mW." + }, + "acReactivePower": { + "type": "integer", + "format": "int32", + "description": "AC reactive power in VAr." + }, + "acApparentPower": { + "type": "integer", + "format": "int32", + "description": "AC apparent power VA." + }, + "dcCurrent": { + "type": "integer", + "format": "int32", + "description": "DC current in mA." + }, + "dcVoltage": { + "type": "integer", + "format": "int32", + "description": "DC voltage in mV." + }, + "dcPower": { + "type": "integer", + "format": "int32", + "description": "DC power in mW." + }, + "battery": { + "title": "A measurement produced by a battery (inverter).", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "capacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Capacity in Wh." + }, + "nominalCapacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Nominal capacity in Wh." + }, + "stateOfCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, state of charge in percent." + }, + "stateOfHealth": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, health of the battery in percent." + }, + "temperature": { + "type": "integer", + "format": "int32", + "description": "Temperature of the battery in degrees Celsius." + }, + "presentCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current charge of the battery in mW." + }, + "presentDischarge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current discharge of the battery in mW." + } + }, + "x-readme-ref-name": "BatteryMeasurementRaw" + } + }, + "required": [ + "measuredAt" + ], + "x-readme-ref-name": "InverterMeasurement" + }, + { + "title": "Meter's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "l1ActivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power in mW." + }, + "l1ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power Reading (Imported Energy) in Ws." + }, + "l1ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l1ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power in VAr." + }, + "l1ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Imported Energy) in VArs." + }, + "l1ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Exported Energy) in VArs." + }, + "l1ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power in VA." + }, + "l1ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Imported Energy) in VAs." + }, + "l1ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Exported Energy) in VAs." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "L1 Current in mA." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "L1 Voltage in mV." + }, + "l1ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L1 maximum imported power in mW." + }, + "l2ActivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power in mW." + }, + "l2ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Imported Energy) in Ws." + }, + "l2ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l2ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power in VAr." + }, + "l2ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Imported Energy) in VArs." + }, + "l2ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Exported Energy) in VArs." + }, + "l2ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power in VA." + }, + "l2ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Imported Energy) in VAs." + }, + "l2ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Exported Energy) in VAs." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "L2 Current in mA." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "L2 Voltage in mV." + }, + "l2ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L2 maximum imported power in mW." + }, + "l3ActivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power in mW." + }, + "l3ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Imported Energy) in Ws." + }, + "l3ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Exported Energy) in Ws." + }, + "l3ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power in VAr." + }, + "l3ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Imported Energy) in VArs." + }, + "l3ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Exported Energy) in VArs." + }, + "l3ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power in VA." + }, + "l3ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Imported Energy) in VAs." + }, + "l3ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Exported Energy) in VAs." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "L3 Current in mA." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "L3 Voltage in mV." + }, + "l3ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L3 maximum imported power in mW." + }, + "sumActivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power in mW." + }, + "sumActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Imported Energy) in Ws." + }, + "sumActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Exported Energy) in Ws." + }, + "sumApparentPower": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power in VA." + }, + "sumApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Imported Energy) in VAs." + }, + "sumApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Exported Energy) in VAs." + }, + "sumReactivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power in VA." + }, + "sumReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Imported Energy) in VAs." + }, + "sumReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Exported Energy) in VAs." + }, + "sumImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "Sum Maximum imported power in mW." + }, + "sumPowerFactor": { + "type": "integer", + "format": "int32", + "description": "Power factor in deg." + } + }, + "x-readme-ref-name": "AUXMeterMeasurement" + }, + { + "title": "EV Charging Station's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Date and time the data point was collected." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for first phase in mW." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for second phase in mW." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for third phase in mW." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "Current for first phase in mA." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "Current for second phase in mA." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "Current for third phase in mA." + }, + "realPower": { + "type": "integer", + "format": "int64", + "description": "Real Power in mW. Positive values mean charging, negative values\nmean discharging (V2G; currently not done).\n" + }, + "powerFactor": { + "type": "integer", + "format": "int32", + "description": "Power Factor in 0.1% (cosphi)." + }, + "l1RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L1 in mW." + }, + "l2RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L2 in mW." + }, + "l3RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L3 in mW." + }, + "temperature": { + "type": "integer", + "format": "int64", + "description": "Temperature inside the charging station in °C." + }, + "capacity": { + "type": "integer", + "format": "int32", + "description": "The total capacity of the EV battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "The current state of charge of the EV battery in percent from 0.0 -\n100.0%.\n" + }, + "maxCharge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed charge power in mW." + }, + "minCharge": { + "type": "integer", + "format": "int32", + "description": "Minimum allowed charge power in mW, below this power the EV won't\ncharge.\n" + }, + "maxDischarge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed discharge power in mW." + }, + "stationState": { + "type": "string", + "description": "State indicating whether the charging station is charging, ready, in\nerror state, etc.\n" + }, + "plugState": { + "type": "string", + "description": "State indicates whether an EV is plugged into the charging station.\n" + }, + "pluggedIn": { + "type": "boolean", + "description": "PluggedIn true if an electric vehicle is currently plugged into the\ncharging station.\n" + }, + "tokenID": { + "type": "string", + "description": "TokenID is the used authentication token at the charging station.\n" + } + }, + "x-readme-ref-name": "EVChargingStationMeasurement" + }, + { + "title": "A measurement produced by a heatpump appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "power": { + "type": "integer", + "description": "Power of the heatpump in mW." + }, + "powerL1": { + "type": "integer", + "description": "Power for the first phase in mW ." + }, + "powerL2": { + "type": "integer" + }, + "powerL3": { + "type": "integer" + }, + "minPower": { + "type": "integer" + }, + "maxPower": { + "type": "integer" + }, + "readyState": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "averageTemperature": { + "type": "number", + "format": "double" + }, + "controlledTemperature": { + "type": "number", + "format": "double" + }, + "baseLineTemperature": { + "type": "number", + "format": "double" + }, + "heatSourceTemperature": { + "type": "number", + "format": "double" + }, + "outdoorTemperature": { + "type": "number", + "format": "double" + }, + "operationStatus": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "HEATING", + "DRINKING_HOT_WATER", + "POOL_HEATING", + "EVU_LOCK", + "DEFROST", + "OFF", + "EXTERNAL_SOURCE", + "COOLING" + ] + }, + "energyHeating": { + "type": "number", + "format": "double" + }, + "energyDrinkingHotWater": { + "type": "number", + "format": "double" + } + }, + "required": [ + "operationStatus" + ], + "x-readme-ref-name": "HeatPumpMeasurementRaw" + }, + { + "title": "A measurement produced by a heater appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "flowRate": { + "type": "number", + "format": "double", + "description": "Volumetric flow rate given in m³/s." + }, + "readingPositive": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was gained during circulation from inflow to outflow in Wh." + }, + "readingNegative": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was consumed during circulation from inflow to outflow in Wh." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power in mW." + }, + "inflowTemperature": { + "type": "number", + "format": "double", + "description": "Inflow temperature given in °C" + }, + "outflowTemperature": { + "type": "number", + "format": "double", + "description": "Outflow temperature given in °C" + } + }, + "x-readme-ref-name": "HeaterMeasurementRaw" + }, + { + "title": "Electrolyzer Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "status": { + "type": "integer", + "format": "int32", + "description": "Status is the local mode of the electrolyzer." + }, + "statusPurification": { + "type": "boolean", + "description": "StatusPurification is the purification status of the electrolyzer. 0 means no regeneration is in progress." + }, + "flowSetpoint": { + "type": "number", + "format": "double", + "description": "Flow Setpoint value set by the customer in Nm3/h." + }, + "hydrogenFlow": { + "type": "number", + "format": "double", + "description": "Hydrogen Flow leaving the electrolyzer in Nm3/h." + }, + "pressure": { + "type": "number", + "format": "double", + "description": "Pressure in the electrolyzer in barg." + }, + "rectifierEnergy1": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 400V in kW." + }, + "rectifierEnergy2": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 21KV in kW." + }, + "bufferPressure": { + "type": "number", + "format": "double", + "description": "Buffer Pressure of the Electrolyzer in barg." + }, + "productionTime": { + "type": "number", + "format": "double", + "description": "Production Time in hours." + }, + "timeUntilMaintanance": { + "type": "number", + "format": "double", + "description": "Time until maintenance in hours." + }, + "pipelinePressure": { + "type": "number", + "format": "double", + "description": "Pipeline pressure in bar." + }, + "customerHydrogenFlow1": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by the customer." + }, + "customerHydrogenFlow2": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow3": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow4": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow5": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + } + }, + "x-readme-ref-name": "ElectrolyzerMeasurement" + } + ], + "x-readme-ref-name": "ApplianceMeasurement" + }, + "x-readme-ref-name": "ApplianceMeasurements" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/appliance\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/appliance \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/appliance\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/appliance\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/appliance\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/appliance\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/appliance\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/appliances/{applianceID}/measurements": { + "get": { + "summary": "List Appliance's Combined Measurements", + "description": "Lists combinations of appliance measurements and energy management \nmeasurements. \n\nThis endpoints adds a \"convenience\" method for fetching raw measurements \nand energy management measurements together, by combining them into a \nsingle measurement object. \n\nIt is usually used to inspect the EMS behavior in correspondence to raw \nvalues reported by the appliance. \n\nThe requested `interval` must not span more than 24 hours.\n\nListing combined measurements is only supported for appliances of type:\n* `INVERTER`\n* `METER`\n* `EVSTATION`\n* `HEAT_PUMP`\n", + "tags": [ + "Appliance" + ], + "security": [ + { + "BearerAuth": [ + "ApplianceMeasurementsRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + }, + { + "name": "interval", + "description": "Requested time interval, formatted in ISO8601.\n\nIn this format the start and end point of the interval are formatted according\nto RFC3339 and separated by a slash \"/\".\n", + "in": "query", + "required": true, + "allowReserved": true, + "example": "2021-12-24T18:21:00Z/2021-12-25T18:21:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + } + ], + "responses": { + "200": { + "description": "Combined measurements have been returned successfully.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "description": "Combined appliance and energy management measurement.", + "allOf": [ + { + "oneOf": [ + { + "title": "Inverter's Measurements", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "gridFrequency": { + "type": "integer", + "format": "int32", + "description": "The locally measured grid frequency in centi (10^-2) Hz." + }, + "acCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current in mA." + }, + "l1ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L1 in mA." + }, + "l2ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L2 in mA." + }, + "l3ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L3 in mA." + }, + "l1ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L1 in mV." + }, + "l2ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L2 in mV." + }, + "l3ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L3 mV." + }, + "acActivePower": { + "type": "integer", + "format": "int32", + "description": "AC active power in mW." + }, + "acReactivePower": { + "type": "integer", + "format": "int32", + "description": "AC reactive power in VAr." + }, + "acApparentPower": { + "type": "integer", + "format": "int32", + "description": "AC apparent power VA." + }, + "dcCurrent": { + "type": "integer", + "format": "int32", + "description": "DC current in mA." + }, + "dcVoltage": { + "type": "integer", + "format": "int32", + "description": "DC voltage in mV." + }, + "dcPower": { + "type": "integer", + "format": "int32", + "description": "DC power in mW." + }, + "battery": { + "title": "A measurement produced by a battery (inverter).", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "capacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Capacity in Wh." + }, + "nominalCapacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Nominal capacity in Wh." + }, + "stateOfCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, state of charge in percent." + }, + "stateOfHealth": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, health of the battery in percent." + }, + "temperature": { + "type": "integer", + "format": "int32", + "description": "Temperature of the battery in degrees Celsius." + }, + "presentCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current charge of the battery in mW." + }, + "presentDischarge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current discharge of the battery in mW." + } + }, + "x-readme-ref-name": "BatteryMeasurementRaw" + } + }, + "required": [ + "measuredAt" + ], + "x-readme-ref-name": "InverterMeasurement" + }, + { + "title": "Meter's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "l1ActivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power in mW." + }, + "l1ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power Reading (Imported Energy) in Ws." + }, + "l1ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l1ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power in VAr." + }, + "l1ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Imported Energy) in VArs." + }, + "l1ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Exported Energy) in VArs." + }, + "l1ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power in VA." + }, + "l1ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Imported Energy) in VAs." + }, + "l1ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Exported Energy) in VAs." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "L1 Current in mA." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "L1 Voltage in mV." + }, + "l1ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L1 maximum imported power in mW." + }, + "l2ActivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power in mW." + }, + "l2ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Imported Energy) in Ws." + }, + "l2ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l2ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power in VAr." + }, + "l2ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Imported Energy) in VArs." + }, + "l2ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Exported Energy) in VArs." + }, + "l2ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power in VA." + }, + "l2ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Imported Energy) in VAs." + }, + "l2ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Exported Energy) in VAs." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "L2 Current in mA." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "L2 Voltage in mV." + }, + "l2ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L2 maximum imported power in mW." + }, + "l3ActivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power in mW." + }, + "l3ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Imported Energy) in Ws." + }, + "l3ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Exported Energy) in Ws." + }, + "l3ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power in VAr." + }, + "l3ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Imported Energy) in VArs." + }, + "l3ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Exported Energy) in VArs." + }, + "l3ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power in VA." + }, + "l3ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Imported Energy) in VAs." + }, + "l3ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Exported Energy) in VAs." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "L3 Current in mA." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "L3 Voltage in mV." + }, + "l3ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L3 maximum imported power in mW." + }, + "sumActivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power in mW." + }, + "sumActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Imported Energy) in Ws." + }, + "sumActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Exported Energy) in Ws." + }, + "sumApparentPower": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power in VA." + }, + "sumApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Imported Energy) in VAs." + }, + "sumApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Exported Energy) in VAs." + }, + "sumReactivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power in VA." + }, + "sumReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Imported Energy) in VAs." + }, + "sumReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Exported Energy) in VAs." + }, + "sumImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "Sum Maximum imported power in mW." + }, + "sumPowerFactor": { + "type": "integer", + "format": "int32", + "description": "Power factor in deg." + } + }, + "x-readme-ref-name": "AUXMeterMeasurement" + }, + { + "title": "EV Charging Station's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Date and time the data point was collected." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for first phase in mW." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for second phase in mW." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for third phase in mW." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "Current for first phase in mA." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "Current for second phase in mA." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "Current for third phase in mA." + }, + "realPower": { + "type": "integer", + "format": "int64", + "description": "Real Power in mW. Positive values mean charging, negative values\nmean discharging (V2G; currently not done).\n" + }, + "powerFactor": { + "type": "integer", + "format": "int32", + "description": "Power Factor in 0.1% (cosphi)." + }, + "l1RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L1 in mW." + }, + "l2RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L2 in mW." + }, + "l3RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L3 in mW." + }, + "temperature": { + "type": "integer", + "format": "int64", + "description": "Temperature inside the charging station in °C." + }, + "capacity": { + "type": "integer", + "format": "int32", + "description": "The total capacity of the EV battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "The current state of charge of the EV battery in percent from 0.0 -\n100.0%.\n" + }, + "maxCharge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed charge power in mW." + }, + "minCharge": { + "type": "integer", + "format": "int32", + "description": "Minimum allowed charge power in mW, below this power the EV won't\ncharge.\n" + }, + "maxDischarge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed discharge power in mW." + }, + "stationState": { + "type": "string", + "description": "State indicating whether the charging station is charging, ready, in\nerror state, etc.\n" + }, + "plugState": { + "type": "string", + "description": "State indicates whether an EV is plugged into the charging station.\n" + }, + "pluggedIn": { + "type": "boolean", + "description": "PluggedIn true if an electric vehicle is currently plugged into the\ncharging station.\n" + }, + "tokenID": { + "type": "string", + "description": "TokenID is the used authentication token at the charging station.\n" + } + }, + "x-readme-ref-name": "EVChargingStationMeasurement" + }, + { + "title": "A measurement produced by a heatpump appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "power": { + "type": "integer", + "description": "Power of the heatpump in mW." + }, + "powerL1": { + "type": "integer", + "description": "Power for the first phase in mW ." + }, + "powerL2": { + "type": "integer" + }, + "powerL3": { + "type": "integer" + }, + "minPower": { + "type": "integer" + }, + "maxPower": { + "type": "integer" + }, + "readyState": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "averageTemperature": { + "type": "number", + "format": "double" + }, + "controlledTemperature": { + "type": "number", + "format": "double" + }, + "baseLineTemperature": { + "type": "number", + "format": "double" + }, + "heatSourceTemperature": { + "type": "number", + "format": "double" + }, + "outdoorTemperature": { + "type": "number", + "format": "double" + }, + "operationStatus": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "HEATING", + "DRINKING_HOT_WATER", + "POOL_HEATING", + "EVU_LOCK", + "DEFROST", + "OFF", + "EXTERNAL_SOURCE", + "COOLING" + ] + }, + "energyHeating": { + "type": "number", + "format": "double" + }, + "energyDrinkingHotWater": { + "type": "number", + "format": "double" + } + }, + "required": [ + "operationStatus" + ], + "x-readme-ref-name": "HeatPumpMeasurementRaw" + }, + { + "title": "A measurement produced by a heater appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "flowRate": { + "type": "number", + "format": "double", + "description": "Volumetric flow rate given in m³/s." + }, + "readingPositive": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was gained during circulation from inflow to outflow in Wh." + }, + "readingNegative": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was consumed during circulation from inflow to outflow in Wh." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power in mW." + }, + "inflowTemperature": { + "type": "number", + "format": "double", + "description": "Inflow temperature given in °C" + }, + "outflowTemperature": { + "type": "number", + "format": "double", + "description": "Outflow temperature given in °C" + } + }, + "x-readme-ref-name": "HeaterMeasurementRaw" + }, + { + "title": "Electrolyzer Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "status": { + "type": "integer", + "format": "int32", + "description": "Status is the local mode of the electrolyzer." + }, + "statusPurification": { + "type": "boolean", + "description": "StatusPurification is the purification status of the electrolyzer. 0 means no regeneration is in progress." + }, + "flowSetpoint": { + "type": "number", + "format": "double", + "description": "Flow Setpoint value set by the customer in Nm3/h." + }, + "hydrogenFlow": { + "type": "number", + "format": "double", + "description": "Hydrogen Flow leaving the electrolyzer in Nm3/h." + }, + "pressure": { + "type": "number", + "format": "double", + "description": "Pressure in the electrolyzer in barg." + }, + "rectifierEnergy1": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 400V in kW." + }, + "rectifierEnergy2": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 21KV in kW." + }, + "bufferPressure": { + "type": "number", + "format": "double", + "description": "Buffer Pressure of the Electrolyzer in barg." + }, + "productionTime": { + "type": "number", + "format": "double", + "description": "Production Time in hours." + }, + "timeUntilMaintanance": { + "type": "number", + "format": "double", + "description": "Time until maintenance in hours." + }, + "pipelinePressure": { + "type": "number", + "format": "double", + "description": "Pipeline pressure in bar." + }, + "customerHydrogenFlow1": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by the customer." + }, + "customerHydrogenFlow2": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow3": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow4": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow5": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + } + }, + "x-readme-ref-name": "ElectrolyzerMeasurement" + } + ] + }, + { + "type": "object", + "properties": { + "energyManagement": { + "title": "Energy Management Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "strategyID": { + "type": "string", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "dynamicFeedInCurtailment": { + "type": "boolean", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "prognosisBasedBatteryCharging": { + "type": "boolean", + "description": "True if a forecast is used to determine the future feed-in into the\nbatteries.\n" + }, + "activePowerSetpoint": { + "type": "integer", + "format": "int64", + "description": "The setpoint the appliance should follow in mW." + }, + "activePowerSetpointSystemicError": { + "type": "integer", + "format": "int64", + "description": "The measured deviation from the setpoint for the active power value\nin mW.\n" + }, + "l1CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 1." + }, + "l2CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 2." + }, + "l3CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 3." + }, + "maxStateOfChargeAfterMaxFeedIn": { + "type": "integer", + "format": "int32", + "description": "MaxStateOfChargeAfterMaxFeedIn is the max state of charge (0-100%) the\nbattery can reach while considering the capacity needed to store the\nenergy above max feed-in. (eBatMax - eBatOverFeedIn) * 100 /\neBatMax.\n" + }, + "predictedEnergyOutput": { + "type": "integer", + "format": "int64", + "description": "PredictedEnergyOutput is the predicted electrical energy output of\nthis appliance in Wh based on the forecast model, including error\nadjustments.\n" + }, + "energyOverFeedInCumulatedDaily": { + "type": "integer", + "format": "int64", + "description": "EnergyOverFeedInCumulatedDaily is the cumulated energy over the\nfeed-in that is saved this day thanks to the energy management. This\nvalue is reported by the grid meter in Wh.\n" + } + }, + "x-readme-ref-name": "EnergyManagementMeasurement" + } + } + } + ], + "x-readme-ref-name": "CombinedMeasurement" + } + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/gateways/{gatewayID}/appliances/{applianceID}/measurements/energymanagement": { + "get": { + "summary": "List Appliance's Energy Management Measurements", + "description": "Lists energy management measurements of an appliance over a period of time.\nData points returned are emitted directly by the Energy Management\nSystem (EMS), therefore the resolution cannot be controlled. The \ngranularity at which we store measurements depends on the EMS mode and \nconfiguration. \nThe provided `interval` must not span more than 24 hours.\n", + "tags": [ + "Appliance" + ], + "security": [ + { + "BearerAuth": [ + "ApplianceMeasurementsRead" + ] + } + ], + "parameters": [ + { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + }, + { + "name": "interval", + "description": "Requested time interval, formatted in ISO8601.\n\nIn this format the start and end point of the interval are formatted according\nto RFC3339 and separated by a slash \"/\".\n", + "in": "query", + "required": true, + "allowReserved": true, + "example": "2021-12-24T18:21:00Z/2021-12-25T18:21:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + } + ], + "responses": { + "200": { + "description": "Energy Management Measurement returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Energy Management Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "strategyID": { + "type": "string", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "dynamicFeedInCurtailment": { + "type": "boolean", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "prognosisBasedBatteryCharging": { + "type": "boolean", + "description": "True if a forecast is used to determine the future feed-in into the\nbatteries.\n" + }, + "activePowerSetpoint": { + "type": "integer", + "format": "int64", + "description": "The setpoint the appliance should follow in mW." + }, + "activePowerSetpointSystemicError": { + "type": "integer", + "format": "int64", + "description": "The measured deviation from the setpoint for the active power value\nin mW.\n" + }, + "l1CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 1." + }, + "l2CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 2." + }, + "l3CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 3." + }, + "maxStateOfChargeAfterMaxFeedIn": { + "type": "integer", + "format": "int32", + "description": "MaxStateOfChargeAfterMaxFeedIn is the max state of charge (0-100%) the\nbattery can reach while considering the capacity needed to store the\nenergy above max feed-in. (eBatMax - eBatOverFeedIn) * 100 /\neBatMax.\n" + }, + "predictedEnergyOutput": { + "type": "integer", + "format": "int64", + "description": "PredictedEnergyOutput is the predicted electrical energy output of\nthis appliance in Wh based on the forecast model, including error\nadjustments.\n" + }, + "energyOverFeedInCumulatedDaily": { + "type": "integer", + "format": "int64", + "description": "EnergyOverFeedInCumulatedDaily is the cumulated energy over the\nfeed-in that is saved this day thanks to the energy management. This\nvalue is reported by the grid meter in Wh.\n" + } + }, + "x-readme-ref-name": "EnergyManagementMeasurement" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/energymanagement\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/energymanagement \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/energymanagement\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/energymanagement\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/energymanagement\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/energymanagement\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/gateways/gatewayID/appliances/applianceID/measurements/energymanagement\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/clusters/{clusterID}/live": { + "get": { + "summary": "Retrieve Cluster's Live Measurement.", + "description": "Retrieves a cluster's latest aggregated measurement.", + "tags": [ + "Cluster" + ], + "security": [ + { + "BearerAuth": [ + "SystemMeasurementsRead" + ] + } + ], + "parameters": [ + { + "name": "clusterID", + "description": "Unique identifier used to access a cluster.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "2c7043ae-1539-4e02-bdbd-0395c90d6bd0" + } + ], + "responses": { + "200": { + "description": "Successfully returned cluster's live measurements.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Date and time at which the data point was observed.\nFor power values the data point is written after the aggregated \ntime span. For energy values the observation is stored at the \nbeginning of the aggregated time span.\n" + }, + "grid": { + "type": "number", + "format": "double", + "description": "Grid is the measured power/energy at the grid connection point.\n\nFor power values, Positive values indicate supply, Negative values\nindicate feed in.\n" + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the power/energy measured at the grid connection point's \nfirst phase.\n" + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the power/energy measured at the grid connection point's \nsecond phase.\n" + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the power/energy measured at the grid connection point's \nthird phase.\n" + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells.\n" + }, + "production": { + "type": "number", + "format": "double", + "description": "Sum of all energy producing appliances (e.g. PV)." + }, + "battery": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + }, + "batteries": { + "type": "array", + "description": "Battery measurements for each battery in the system.", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "Aggregated measured power/energy for heat pumps.\n" + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "Aggregated measured power/energy for heat pumps that have their own \nheat pump tariff.\n" + }, + "heatPumps": { + "type": "array", + "description": "Heat pump measurements for each heat pump in the system.", + "items": { + "title": "Heat pump measurement", + "type": "object", + "properties": { + "applianceID": { + "type": "string" + }, + "power": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "HeatPumpMeasurement" + } + }, + "evChargingStation": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + }, + "evChargingStations": { + "type": "array", + "description": "Charging station measurements for all charging stations that are \npart of the system.\n", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system including heatpumps\nand EV charging stations.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "Power/Energy consumed through production and charged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "Power/energy consumed through production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the household through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the heat pump through production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the EV through production directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the heater through production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "Power/energy consumed through storage and production.\n" + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double", + "description": "Ratio of produced energy vs total consumed energy (0.0-1.0).\n", + "example": 0.9 + }, + "selfConsumptionRate": { + "type": "number", + "format": "double", + "description": "Ratio of self consumption vs production (0.0-1.0)." + }, + "directConsumptionRate": { + "type": "number", + "format": "double", + "description": "Ratio of direct consumption vs production (0.0-1.0)." + }, + "heating": { + "type": "number", + "format": "double", + "description": "Aggregated power/energy measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "Average temperature of the heaters in °C." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "Power of the appliances with misc location, empty for energy.\n" + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for grid in Ws (Imported Energy), empty for energy.\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for grid in Ws (Exported Energy), empty for energy.\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for heatpump in Ws (Imported Energy), empty for \nenergy.\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter Reading for heatpump in Ws (Exported Energy), empty for \nenergy.\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "description": "Number of times the fuse was protected, based on the curtailed power\nover all phases.\n" + } + }, + "x-readme-ref-name": "Measurement" + } + } + } + }, + "401": { + "description": "Unauthorized.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Unauthorized", + "description": "The client isn't authorized to access the requested resource.", + "example": { + "message": "Unauthorized" + } + } + ], + "x-readme-ref-name": "UnauthorizedException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/clusters/clusterID/live\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/clusters/clusterID/live \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/clusters/clusterID/live\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/clusters/clusterID/live\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/clusters/clusterID/live\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/clusters/clusterID/live\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/clusters/clusterID/live\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/policies": { + "get": { + "summary": "List Policy Documents", + "description": "Lists all ever created policy documents", + "tags": [ + "Policy" + ], + "security": [ + { + "BearerAuth": [ + "PoliciesRead" + ] + } + ], + "responses": { + "200": { + "description": "List of policies.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/policies \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create Policy Document", + "description": "Creates a new policy document.", + "tags": [ + "Policy" + ], + "security": [ + { + "BearerAuth": [ + "PoliciesWrite" + ] + } + ], + "requestBody": { + "description": "Policy document to be created.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Policy Document Create", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentCreateStrict" + } + } + } + }, + "responses": { + "201": { + "description": "Created policy document.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/policies \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/policies/{policyID}": { + "get": { + "summary": "Get Policy Document", + "description": "Gets policy document based on its ID.", + "tags": [ + "Policy" + ], + "security": [ + { + "BearerAuth": [ + "PoliciesRead" + ] + } + ], + "parameters": [ + { + "name": "policyID", + "description": "Unique identifier that can be used to access policy documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "200": { + "description": "Policy Document", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies/policyID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/policies/policyID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies/policyID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies/policyID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies/policyID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update Policy Document", + "description": "Updates a policy document.", + "tags": [ + "Policy" + ], + "security": [ + { + "BearerAuth": [ + "PoliciesWrite" + ] + } + ], + "requestBody": { + "description": "Policy document to be updated.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Policy Document Update", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentUpdateStrict" + } + } + } + }, + "parameters": [ + { + "name": "policyID", + "description": "Unique identifier that can be used to access policy documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "204": { + "description": "Policy Document Updated" + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies/policyID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/policies/policyID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies/policyID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies/policyID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies/policyID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete Policy Document", + "description": "Deletes a policy document.", + "tags": [ + "Policy" + ], + "security": [ + { + "BearerAuth": [ + "PoliciesWrite" + ] + } + ], + "parameters": [ + { + "name": "policyID", + "description": "Unique identifier that can be used to access policy documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "204": { + "description": "Policy Document Deleted" + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies/policyID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/policies/policyID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies/policyID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies/policyID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies/policyID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/policies/{policyID}/statements/{statementID}": { + "delete": { + "summary": "Unassign Policy Statement from Document", + "description": "Un-assigns a policy statement from a policy document", + "tags": [ + "Policy" + ], + "security": [ + { + "BearerAuth": [ + "PoliciesWrite" + ] + } + ], + "parameters": [ + { + "name": "policyID", + "description": "Unique identifier that can be used to access policy documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "statementID", + "description": "Unique identifier that can be used to refer to policy statements.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "204": { + "description": "Policy Statement Unassigned" + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies/policyID/statements/statementID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/policies/policyID/statements/statementID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies/policyID/statements/statementID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID/statements/statementID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID/statements/statementID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies/policyID/statements/statementID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies/policyID/statements/statementID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/policies/{policyID}/groups": { + "post": { + "summary": "Assign Policy Document to Group", + "tags": [ + "Policy", + "Group" + ], + "security": [ + { + "BearerAuth": [ + "GroupsWrite" + ] + } + ], + "parameters": [ + { + "name": "policyID", + "description": "Unique identifier that can be used to access policy documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "requestBody": { + "description": "Assigns a policy document to a group.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + }, + "x-readme-ref-name": "PolicyGroupAssignment" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyGroupAssignmentStrict" + } + } + } + }, + "responses": { + "204": { + "description": "Policy Group Assigned" + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies/policyID/groups\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/policies/policyID/groups \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies/policyID/groups\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID/groups\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID/groups\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies/policyID/groups\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies/policyID/groups\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/policies/{policyID}/groups/{groupID}": { + "delete": { + "summary": "Unassign Policy Document from Group", + "tags": [ + "Policy", + "Group" + ], + "security": [ + { + "BearerAuth": [ + "GroupsWrite" + ] + } + ], + "parameters": [ + { + "name": "policyID", + "description": "Unique identifier that can be used to access policy documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + { + "name": "groupID", + "description": "Unique identifier that can be used to access policy groups.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "responses": { + "204": { + "description": "Policy Group Unassigned" + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/policies/policyID/groups/groupID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.delete(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/policies/policyID/groups/groupID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/policies/policyID/groups/groupID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID/groups/groupID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/policies/policyID/groups/groupID\")\n .delete(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/policies/policyID/groups/groupID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/policies/policyID/groups/groupID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/product-functionalities": { + "get": { + "summary": "List Product Functionalities", + "description": "Lists all product functionalities.", + "tags": [ + "Product Functionality" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "List of product functionalities.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/product-functionalities\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/product-functionalities \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/product-functionalities\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/product-functionalities\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/product-functionalities\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/product-functionalities\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/product-functionalities\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/product-functionalities/{functionalityID}": { + "get": { + "summary": "Get a Product Functionality", + "description": "Lists all product functionalities.", + "tags": [ + "Product Functionality" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "functionalityID", + "description": "Unique identifier of the product functionality.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "12a2cfc0-f873-11ed-b67e-0242ac120002" + } + ], + "responses": { + "200": { + "description": "Requested product functionality.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/product-functionalities/functionalityID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/product-functionalities/functionalityID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/product-functionalities/functionalityID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/product-functionalities/functionalityID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/product-functionalities/functionalityID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/product-functionalities/functionalityID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/product-functionalities/functionalityID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/accounts/{accountID}/product-options": { + "get": { + "summary": "List Product Options", + "description": "Lists all product options created by the given account and its children.\n\nProduct options returned by this endpoint are not necessarily assignable to all systems assigned to the given account. \n", + "tags": [ + "Product Option" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + } + ], + "responses": { + "200": { + "description": "List of product options.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + } + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/accounts/accountID/product-options\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/accounts/accountID/product-options \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/accounts/accountID/product-options\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/product-options\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/accounts/accountID/product-options\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/accounts/accountID/product-options\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/accounts/accountID/product-options\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/spine/devices/{deviceID}/powersequences/{sequenceID}": { + "patch": { + "summary": "Change a specific power sequence for a specific device.", + "description": "A PATCH may be performed on startTime and endTime of an existing power sequence. \nIf only one parameter is specified, the other is calculated from the accumulated duration of all power time slots for this sequence.\nA device binding is needed before changing the power sequence. If a binding doesn't exist, it is first created and then the power sequence is updated.\n", + "tags": [ + "Power Sequence" + ], + "security": [ + { + "BearerAuth": [ + "SPINEDevicesWrite" + ] + } + ], + "parameters": [ + { + "name": "deviceID", + "description": "ID of the SPINE device, specified by the manufacturer.", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "example": "deviceID" + }, + { + "name": "sequenceID", + "description": "Identifier of power sequence.", + "in": "path", + "required": true, + "schema": { + "type": "integer" + }, + "example": 1 + } + ], + "requestBody": { + "description": "Update a power sequence for the given device.", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + } + ], + "x-readme-ref-name": "PowerSequenceUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PowerSequenceUpdateStrict" + }, + "examples": { + "scheduleStart": { + "summary": "Start a power sequence at a scheduled time.", + "value": { + "startTime": "2021-06-24T12:00:00" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "A complete representation of the updated power sequence.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + { + "required": [ + "earliestStartTime", + "latestEndTime", + "powerTimeSlots" + ] + } + ], + "x-readme-ref-name": "PowerSequence" + }, + "examples": { + "earliestStart": { + "summary": "Running power sequence", + "value": { + "sequenceId": 1, + "state": "running", + "activeSlotNumber": 1, + "sequenceRemoteControllable": true, + "startTime": "2021-06-24T12:00:00Z", + "endTime": "2021-06-24T13:40:00Z", + "earliestStartTime": "2021-06-24T06:20:00Z", + "latestEndTime": "2021-06-24T19:00:00Z", + "isPausable": false, + "isStoppable": false, + "powerTimeSlots": [ + { + "slotId": 1, + "defaultDuration": "00:23:00", + "powerMin": 100, + "powerExpectedValue": 200, + "powerMax": 2000 + }, + { + "slotId": 2, + "defaultDuration": "01:17:00", + "powerMin": 90, + "powerExpectedValue": 180, + "powerMax": 1800 + } + ] + } + }, + "scheduleStart": { + "summary": "Scheduled power sequence", + "value": { + "sequenceId": 1, + "state": "scheduled", + "activeSlotNumber": 0, + "sequenceRemoteControllable": true, + "startTime": "2021-06-24T12:00:00Z", + "endTime": "2021-06-24T13:40:00Z", + "earliestStartTime": "2021-06-24T06:20:00Z", + "latestEndTime": "2021-06-24T19:00:00Z", + "isPausable": false, + "isStoppable": false, + "powerTimeSlots": [ + { + "slotId": 1, + "defaultDuration": "00:23:00", + "powerMin": 100, + "powerExpectedValue": 200, + "powerMax": 2000 + }, + { + "slotId": 2, + "defaultDuration": "01:17:00", + "powerMin": 90, + "powerExpectedValue": 180, + "powerMax": 1800 + } + ] + } + } + } + } + } + }, + "400": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Device Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "422": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/spine/devices/deviceID/powersequences/sequenceID\"\n\npayload = { \"startTime\": \"2021-06-24T12:00:00\" }\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, json=payload, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/spine/devices/deviceID/powersequences/sequenceID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"startTime\": \"2021-06-24T12:00:00\"\n}\n'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/spine/devices/deviceID/powersequences/sequenceID\"\n\n\tpayload := strings.NewReader(\"{\\\"startTime\\\":\\\"2021-06-24T12:00:00\\\"}\")\n\n\treq, _ := http.NewRequest(\"PATCH\", url, payload)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nMediaType mediaType = MediaType.parse(\"application/json\");\nRequestBody body = RequestBody.create(mediaType, \"{\\\"startTime\\\":\\\"2021-06-24T12:00:00\\\"}\");\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/spine/devices/deviceID/powersequences/sequenceID\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval mediaType = MediaType.parse(\"application/json\")\nval body = RequestBody.create(mediaType, \"{\\\"startTime\\\":\\\"2021-06-24T12:00:00\\\"}\")\nval request = Request.Builder()\n .url(\"https://api.gridx.de/spine/devices/deviceID/powersequences/sequenceID\")\n .patch(body)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet parameters = [\"startTime\": \"2021-06-24T12:00:00\"] as [String : Any?]\n\nlet postData = try JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet url = URL(string: \"https://api.gridx.de/spine/devices/deviceID/powersequences/sequenceID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\nrequest.httpBody = postData\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/spine/devices/deviceID/powersequences/sequenceID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddJsonBody(\"{\\\"startTime\\\":\\\"2021-06-24T12:00:00\\\"}\", false);\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user": { + "get": { + "summary": "Retrieve the authenticated User", + "description": "Retrieves the details of the authenticated user.", + "tags": [ + "User" + ], + "security": [ + { + "BearerAuth": [ + "ReadUser" + ] + } + ], + "responses": { + "200": { + "description": "The currently authenticated user representation.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update the authenticated User", + "description": "Updates the authenticated user by setting the values of the body parameters.\nAny parameters not provided will be left unchanged.\n", + "tags": [ + "User" + ], + "requestBody": { + "description": "User fields to update.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "UserStrict" + } + } + } + }, + "security": [ + { + "BearerAuth": [ + "WriteUser" + ] + } + ], + "responses": { + "200": { + "description": "The full representation of the user after the partial update on success.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/user \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/logins": { + "get": { + "summary": "Retrieve the authenticated user's login history", + "description": "Retrieves the history of the last user logins.", + "tags": [ + "User" + ], + "security": [ + { + "BearerAuth": [ + "ListLogins" + ] + } + ], + "responses": { + "200": { + "description": "Login history of the currently authenticated user.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "description": "Represents a user login event that can occur either on login success or failure.", + "type": "object", + "properties": { + "createdAt": { + "description": "Time when the event occurred in UTC.", + "type": "string", + "format": "date-time", + "example": "2020-11-10T13:13:00Z", + "readOnly": true + }, + "type": { + "description": "The type of the login event.", + "type": "string", + "example": "LOGIN_SUCCESS", + "readOnly": true + }, + "ip": { + "description": "The IP address that caused the login event.", + "type": "string", + "format": "ipv4", + "example": "8.8.8.8", + "readOnly": true + } + }, + "x-readme-ref-name": "LoginEvent" + } + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/logins\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/logins \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/logins\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/logins\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/logins\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/logins\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/logins\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/policies": { + "get": { + "summary": "List Policy Documents attached to the authenticated User", + "tags": [ + "User" + ], + "security": [ + { + "BearerAuth": [ + "PoliciesRead" + ] + } + ], + "responses": { + "200": { + "description": "The user's policies.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + } + }, + "500": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/policies\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/policies \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/policies\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/policies\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/policies\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/policies\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/policies\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/stars/systems": { + "get": { + "summary": "List all starred Systems", + "description": "List starred systems of the authenticated user.", + "tags": [ + "Star" + ], + "security": [ + { + "BearerAuth": [ + "ListStarredSystems" + ] + } + ], + "responses": { + "200": { + "description": "Starred systems of the authenticated user.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "description": "Represents a starred system which holds an additional starredAt timestamp.\n\nA System represents the logical view of one gateway and its appliances.\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + }, + { + "type": "object", + "properties": { + "starredAt": { + "description": "Date when the system was starred in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-11-10T13:13:00Z", + "readOnly": true + } + }, + "required": [ + "name", + "createdAt", + "updatedAt", + "starredAt" + ] + } + ], + "x-readme-ref-name": "StarredSystem" + } + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/stars/systems\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/stars/systems \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/stars/systems\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/stars/systems\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/stars/systems\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/stars/systems\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/stars/systems\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/stars/systems/{systemID}": { + "put": { + "summary": "Star a System", + "description": "Marks a system as favorite by starring it.", + "tags": [ + "Star" + ], + "parameters": [ + { + "name": "systemID", + "in": "path", + "description": "Identifier of the system to be starred.", + "required": true, + "example": "218e8795-2442-42d7-901b-1588373e527f", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "security": [ + { + "BearerAuth": [ + "StarSystem" + ] + } + ], + "responses": { + "204": { + "description": "Successfully starred system." + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "System not found." + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/stars/systems/systemID\"\n\nresponse = requests.put(url)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PUT \\\n --url https://api.gridx.de/user/stars/systems/systemID" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/stars/systems/systemID\"\n\n\treq, _ := http.NewRequest(\"PUT\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/stars/systems/systemID\")\n .put(null)\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/stars/systems/systemID\")\n .put(null)\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/stars/systems/systemID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PUT\"\nrequest.timeoutInterval = 10\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/stars/systems/systemID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nvar response = await client.PutAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Unstar a System", + "description": "Removes a system from favorites by unstarring it.", + "tags": [ + "Star" + ], + "parameters": [ + { + "name": "systemID", + "in": "path", + "description": "Identifier of the system to be unstarred.", + "required": true, + "example": "218e8795-2442-42d7-901b-1588373e527f", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "security": [ + { + "BearerAuth": [ + "UnstarSystem" + ] + } + ], + "responses": { + "204": { + "description": "Successfully unstarred system." + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/stars/systems/systemID\"\n\nresponse = requests.delete(url)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/user/stars/systems/systemID" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/stars/systems/systemID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/stars/systems/systemID\")\n .delete(null)\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/stars/systems/systemID\")\n .delete(null)\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/stars/systems/systemID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/stars/systems/systemID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/stars/accounts": { + "get": { + "summary": "List all starred Accounts", + "description": "Lists all starred accounts for the authenticated user.", + "tags": [ + "Star" + ], + "security": [ + { + "BearerAuth": [ + "ListAccounts" + ] + } + ], + "responses": { + "200": { + "description": "Starred accounts of the currently authenticated user.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "description": "Represents a starred account which holds an additional starredAt timestamp.\n", + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + { + "type": "object", + "properties": { + "starredAt": { + "description": "Time when the account was starred in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2020-11-10T13:13:00Z", + "readOnly": true + } + }, + "required": [ + "starredAt" + ] + } + ], + "x-readme-ref-name": "StarredAccount" + } + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/stars/accounts\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/stars/accounts \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/stars/accounts\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/stars/accounts\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/stars/accounts\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/stars/accounts\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/stars/accounts\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/stars/accounts/{accountID}": { + "put": { + "summary": "Star an Account", + "description": "Marks an account as favorite by starring it.", + "tags": [ + "Star" + ], + "parameters": [ + { + "name": "accountID", + "in": "path", + "description": "Identifier of the account to be starred.", + "required": true, + "example": "218e8795-2442-42d7-901b-1588373e527f", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "security": [ + { + "BearerAuth": [ + "StarAccount" + ] + } + ], + "responses": { + "204": { + "description": "Account starred successfully." + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "Account not found." + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/stars/accounts/accountID\"\n\nresponse = requests.put(url)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PUT \\\n --url https://api.gridx.de/user/stars/accounts/accountID" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/stars/accounts/accountID\"\n\n\treq, _ := http.NewRequest(\"PUT\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/stars/accounts/accountID\")\n .put(null)\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/stars/accounts/accountID\")\n .put(null)\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/stars/accounts/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PUT\"\nrequest.timeoutInterval = 10\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/stars/accounts/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nvar response = await client.PutAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Unstar an Account", + "description": "Removes a given account from favorites by unstarring it.", + "tags": [ + "Star" + ], + "parameters": [ + { + "name": "accountID", + "in": "path", + "description": "Identifier of the account to be starred.", + "required": true, + "example": "218e8795-2442-42d7-901b-1588373e527f", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "security": [ + { + "BearerAuth": [ + "UnstarAccount" + ] + } + ], + "responses": { + "204": { + "description": "Account unstarred successfully." + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/stars/accounts/accountID\"\n\nresponse = requests.delete(url)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/user/stars/accounts/accountID" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/stars/accounts/accountID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/stars/accounts/accountID\")\n .delete(null)\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/stars/accounts/accountID\")\n .delete(null)\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/stars/accounts/accountID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/stars/accounts/accountID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/notifications": { + "get": { + "summary": "List Notifications", + "description": "Lists dashboard notifications the authenticated user.", + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "ListNotifications" + ] + } + ], + "parameters": [ + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "unread", + "description": "List only unread notifications.", + "in": "query", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Dashboard notifications.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + } + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/notifications\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/notifications \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/notifications\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/notifications\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/notifications\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/notifications\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/notifications\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/notifications/{notificationID}": { + "get": { + "summary": "Retrieve a Notification", + "description": "Retrieves specific dashboard notification of the authenticated user.", + "parameters": [ + { + "name": "notificationID", + "description": "Unique identifier that can be used to access notifications.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [ + "GetNotification" + ] + } + ], + "responses": { + "200": { + "description": "Dashboard notification.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "Dashboard notification not found." + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/notifications/notificationID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/notifications/notificationID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/notifications/notificationID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/notifications/notificationID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/notifications/notificationID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/notifications/notificationID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/notifications/notificationID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update a Notification", + "description": "Updates a dashboard notification of the authenticated user.", + "parameters": [ + { + "name": "notificationID", + "description": "Unique identifier that can be used to access notifications.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + ], + "tags": [ + "Notification" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "requestBody": { + "description": "Modified Notification", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + } + ], + "x-readme-ref-name": "NotificationUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "Dashboard notification.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + } + } + } + }, + "400": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "403": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "404": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/notifications/notificationID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/user/notifications/notificationID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/notifications/notificationID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/notifications/notificationID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/notifications/notificationID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/notifications/notificationID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/notifications/notificationID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/tokens": { + "get": { + "summary": "List all Tokens", + "description": "Lists all the API tokens for the authenticated user.", + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "GetAPITokens" + ] + } + ], + "parameters": [ + { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + { + "name": "sort", + "description": "Sort results based on a key.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "created_at" + }, + { + "name": "order", + "description": "Order direction of the results, to be used in combination with `sort` parameter.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "desc" + } + ], + "responses": { + "200": { + "description": "API tokens of the current user.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + } + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found." + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/tokens\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/tokens \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/tokens\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/tokens\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/tokens\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/tokens\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/tokens\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "post": { + "summary": "Create a Token", + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "APITokenWrite" + ] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "APITokenCreationStrict" + } + } + } + }, + "responses": { + "201": { + "description": "API token created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "PersonalAPITokenWithSecret", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "token": { + "type": "string", + "description": "This token can be used for authenticating further requests as an alternative to Bearer Authentication.\n\nExample: Set the header field `Authorization` to `Token gxp_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0`. \nThe permissions of this tokens are the same as the user that created it.\n\n**ATTENTION** - Please keep the token secret and treat it like a password! The token is only available immediately after creation and can not be retrieved again afterwards.\n", + "example": "gxp_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0" + } + }, + "required": [ + "token" + ] + } + ], + "x-readme-ref-name": "PersonalAPITokenWithSecret" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/tokens\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.post(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request POST \\\n --url https://api.gridx.de/user/tokens \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/tokens\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/tokens\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/tokens\")\n .post(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/tokens\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/tokens\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PostAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + }, + "/user/tokens/{tokenID}": { + "get": { + "summary": "Retrieve a Token", + "description": "Retrieves the given API token for the authenticated user.", + "parameters": [ + { + "name": "tokenID", + "in": "path", + "description": "Identifier of the token.", + "required": true, + "example": "218e8795-2442-42d7-901b-1588373e527f", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "GetAPIToken" + ] + } + ], + "responses": { + "200": { + "description": "API token of the current user.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found." + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/tokens/tokenID\"\n\nheaders = {\"accept\": \"application/vnd.gridx.v2+json\"}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request GET \\\n --url https://api.gridx.de/user/tokens/tokenID \\\n --header 'accept: application/vnd.gridx.v2+json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/tokens/tokenID\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/tokens/tokenID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/tokens/tokenID\")\n .get()\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/tokens/tokenID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\"accept\": \"application/vnd.gridx.v2+json\"]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/tokens/tokenID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nvar response = await client.GetAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "patch": { + "summary": "Update a Token", + "description": "Updates the specific token by setting the values of the body parameters.\nAny parameters not provided will be left unchanged. \n", + "tags": [ + "Token" + ], + "security": [ + { + "BearerAuth": [ + "UpdateAPIToken" + ] + } + ], + "parameters": [ + { + "name": "tokenID", + "in": "path", + "description": "Identifier of the token to be updated.", + "required": true, + "example": "218e8795-2442-42d7-901b-1588373e527f", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "Update Token", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + } + ], + "x-readme-ref-name": "APITokenUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "APITokenUpdateStrict" + } + } + } + }, + "responses": { + "200": { + "description": "The full representation of the token after the partial update on success.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + } + } + } + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found." + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/tokens/tokenID\"\n\nheaders = {\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n}\n\nresponse = requests.patch(url, headers=headers)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request PATCH \\\n --url https://api.gridx.de/user/tokens/tokenID \\\n --header 'accept: application/vnd.gridx.v2+json' \\\n --header 'content-type: application/json'" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/tokens/tokenID\"\n\n\treq, _ := http.NewRequest(\"PATCH\", url, nil)\n\n\treq.Header.Add(\"accept\", \"application/vnd.gridx.v2+json\")\n\treq.Header.Add(\"content-type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/tokens/tokenID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/tokens/tokenID\")\n .patch(null)\n .addHeader(\"accept\", \"application/vnd.gridx.v2+json\")\n .addHeader(\"content-type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/tokens/tokenID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"PATCH\"\nrequest.timeoutInterval = 10\nrequest.allHTTPHeaderFields = [\n \"accept\": \"application/vnd.gridx.v2+json\",\n \"content-type\": \"application/json\"\n]\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/tokens/tokenID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nrequest.AddHeader(\"accept\", \"application/vnd.gridx.v2+json\");\nrequest.AddHeader(\"content-type\", \"application/json\");\nvar response = await client.PatchAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + }, + "delete": { + "summary": "Delete a Token", + "description": "Removes a given token from the authenticated user.", + "tags": [ + "Token" + ], + "parameters": [ + { + "name": "tokenID", + "in": "path", + "description": "Identifier of the token.", + "required": true, + "example": "218e8795-2442-42d7-901b-1588373e527f", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "security": [ + { + "BearerAuth": [ + "DeleteAPIToken" + ] + } + ], + "responses": { + "204": { + "description": "API token deleted successfully." + }, + "403": { + "description": "Forbidden (missing authorization)" + }, + "404": { + "description": "API token not found." + }, + "500": { + "description": "Internal Server Error" + } + }, + "x-code-samples": [ + { + "lang": "python", + "label": "Python", + "source": "import requests\n\nurl = \"https://api.gridx.de/user/tokens/tokenID\"\n\nresponse = requests.delete(url)\n\nprint(response.text)" + }, + { + "lang": "shell", + "label": "Shell", + "source": "curl --request DELETE \\\n --url https://api.gridx.de/user/tokens/tokenID" + }, + { + "lang": "go", + "label": "Go", + "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io\"\n)\n\nfunc main() {\n\n\turl := \"https://api.gridx.de/user/tokens/tokenID\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := io.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "OkHttpClient client = new OkHttpClient();\n\nRequest request = new Request.Builder()\n .url(\"https://api.gridx.de/user/tokens/tokenID\")\n .delete(null)\n .build();\n\nResponse response = client.newCall(request).execute();" + }, + { + "lang": "java", + "label": "Kotlin", + "source": "val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://api.gridx.de/user/tokens/tokenID\")\n .delete(null)\n .build()\n\nval response = client.newCall(request).execute()" + }, + { + "lang": "javascript", + "label": "Swift", + "source": "import Foundation\n\nlet url = URL(string: \"https://api.gridx.de/user/tokens/tokenID\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"DELETE\"\nrequest.timeoutInterval = 10\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nprint(String(decoding: data, as: UTF8.self))" + }, + { + "lang": "csharp", + "label": "C#", + "source": "using RestSharp;\n\n\nvar options = new RestClientOptions(\"https://api.gridx.de/user/tokens/tokenID\");\nvar client = new RestClient(options);\nvar request = new RestRequest(\"\");\nvar response = await client.DeleteAsync(request);\n\nConsole.WriteLine(\"{0}\", response.Content);\n" + } + ] + } + } + }, + "components": { + "parameters": { + "tariffID": { + "name": "tariffID", + "description": "Unique identifier for the energy tariff.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + "documentKey": { + "name": "documentKey", + "description": "Unique identifier that can be used to access documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "ruleID": { + "name": "ruleID", + "description": "Unique identifier that can be used to access notification rules.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "planID": { + "name": "planID", + "description": "Unique identifier that can be used to access charge plans.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "kind": { + "name": "kind", + "description": "Account kind.", + "in": "query", + "example": "b2b", + "schema": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ] + } + }, + "prefix": { + "name": "prefix", + "description": "Limits the response to keys that begin with the specified prefix.", + "in": "query", + "example": "myKey_", + "schema": { + "type": "string" + } + }, + "accountID": { + "name": "accountID", + "description": "Unique identifier used to access an account.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + "page": { + "name": "page", + "description": "Requested page, to be used in combination with the `per_page` parameter.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1, + "minimum": 1 + }, + "example": 5 + }, + "perPage": { + "name": "per_page", + "description": "Requested number of items per page.\n", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "minimum": 20, + "maximum": 100 + }, + "example": 50 + }, + "sort": { + "name": "sort", + "description": "Sort results based on a key.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "created_at" + }, + "embed": { + "name": "embed", + "description": "Describes which embedded fields of the system should be populated.", + "deprecated": true, + "in": "query", + "schema": { + "type": "string", + "enum": [ + "user" + ] + } + }, + "groupID": { + "name": "groupID", + "description": "Unique identifier that can be used to access policy groups.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "userID": { + "name": "userID", + "description": "Unique identifier used to access a user.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "deleteAuth0": { + "name": "delete-auth0", + "description": "If set to `false`, it does not delete the user from Auth0.\n", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true + }, + "example": false + }, + "notificationID": { + "name": "notificationID", + "description": "Unique identifier that can be used to access notifications.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "memberID": { + "name": "memberID", + "in": "path", + "description": "Identifier of a member (Appliance ID/Cluster ID).", + "required": true, + "example": "2c7043ae-1539-4e02-bdbd-0395c90d6bd0", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "customerID": { + "name": "customerID", + "description": "customerID is universally unique identifier (UUID V4) used identify a\ncustomer in our backend.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "37874c1b-d073-4b06-bf01-a1497fbe1142" + }, + "order": { + "name": "order", + "description": "Order direction of the results, to be used in combination with `sort` parameter.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "desc" + }, + "gspFeature": { + "name": "gspFeature", + "description": "Name of the GSP-feature.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Name of the GSP-feature.", + "enum": [ + "14a-lpc" + ], + "x-readme-ref-name": "GSPFeature" + } + }, + "systemID": { + "name": "systemID", + "description": "Unique identifier used to access a system.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "gatewayID": { + "name": "gatewayID", + "description": "Unique identifier used to access a gateway.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + }, + "listAll": { + "name": "listAll", + "description": "Boolean value to define if all the appliances must be listed.\nIf absent or set to `false` child appliances of Hybrid Inverter would be skipped.\n", + "in": "query", + "example": true, + "schema": { + "type": "boolean", + "default": false + } + }, + "evProfileID": { + "name": "evProfileID", + "description": "Unique identifier for an EV profile.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "d4498841-1404-46f6-8086-7cc8bbdf98d3" + }, + "jobIDOrType": { + "name": "jobIDOrType", + "description": "Unique identifier for a job or the type of the job. \nIn `POST` request the job **type** is used, in `GET` and `DELETE` requests job **ID**.\n", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "examples": { + "jobType": { + "summary": "Type of the job.", + "value": "reset" + }, + "jobID": { + "summary": "Unique identifier for a job.", + "value": "0dce59b6-edd5-4366-a6fb-27c0ab3e8f90" + } + } + }, + "ToUForecastsTimeInterval": { + "name": "interval", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "datetime", + "example": "2018-04-01T15:00:00Z/2018-04-25T00:00:00Z" + }, + "description": "A time interval [start_timestamp, end_timestamp] encoded as a unique string start_timestamp/end_timestamp.\nEach timestamp should be specified in the RFC3339 format.\nThe maximum time interval that can be requested is 48 hours.\nIMPORTANT: it has to be fully URL encoded (also known as Percent-encoding), including the `/`.\n" + }, + "include": { + "name": "include", + "description": "This query param allows to set certain fields only when needed.\nThis makes the request faster as it requires to load only necessary data.\n\nIf this param is set, only the specified fields are included.\nAll other fields, which are possible to include, will be excluded then.\n\nIf you want to include multiple fields, comma-separate them. \n", + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "gateways", + "accounts", + "location", + "priorities", + "appliancePriorities", + "status", + "parentID", + "visibleFields", + "visibleAppliances", + "productOption" + ] + } + } + }, + "interval": { + "name": "interval", + "description": "Requested time interval, formatted in ISO8601.\n\nIn this format the start and end point of the interval are formatted according\nto RFC3339 and separated by a slash \"/\".\n", + "in": "query", + "required": true, + "allowReserved": true, + "example": "2021-12-24T18:21:00Z/2021-12-25T18:21:00Z", + "schema": { + "type": "string", + "format": "datetime" + } + }, + "applianceID": { + "name": "applianceID", + "description": "Unique identifier used to access an appliance.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb2681ab-9526-49ca-bc52-a5f4ec366958" + }, + "scheduleID": { + "name": "scheduleID", + "description": "Unique identifier for a schedule.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204" + }, + "resolution": { + "name": "resolution", + "description": "Requested resolution, formatted in ISO8601 units.\n\nIn this format the resolution is formatted with a single number and corresponding\nISO8601 date or time unit.\n", + "in": "query", + "example": "1h", + "schema": { + "type": "string", + "default": "1h", + "enum": [ + "15m", + "1h", + "1d", + "1w", + "1M" + ] + } + }, + "clusterID": { + "name": "clusterID", + "description": "Unique identifier used to access a cluster.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "2c7043ae-1539-4e02-bdbd-0395c90d6bd0" + }, + "policyID": { + "name": "policyID", + "description": "Unique identifier that can be used to access policy documents.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "statementID": { + "name": "statementID", + "description": "Unique identifier that can be used to refer to policy statements.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17874c1b-d073-4b06-bf01-a1497fbe1142" + }, + "functionalityID": { + "name": "functionalityID", + "description": "Unique identifier of the product functionality.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "12a2cfc0-f873-11ed-b67e-0242ac120002" + }, + "optionID": { + "name": "optionID", + "description": "Unique identifier of the product option.\n", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "7e82929c-f87e-11ed-b67e-0242ac120002" + }, + "deviceID": { + "name": "deviceID", + "description": "ID of the SPINE device, specified by the manufacturer.", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "example": "deviceID" + }, + "sequenceID": { + "name": "sequenceID", + "description": "Identifier of power sequence.", + "in": "path", + "required": true, + "schema": { + "type": "integer" + }, + "example": 1 + } + }, + "requestBodies": { + "CreateScanConfigRequestBody": { + "description": "Creates a scan configuration.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "x-readme-ref-name": "ScanConfigurationSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ScanConfigurationSetStrict" + } + } + } + }, + "UpdateScanConfigRequestBody": { + "description": "Updates a scan configuration.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "x-readme-ref-name": "ScanConfigurationSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ScanConfigurationSetStrict" + } + } + } + }, + "AssignPolicyDocumentToAccountRequestBody": { + "description": "Assigns a policy document to an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Assign Policy Document to Account", + "description": "Holds the data required to assign an existing policy document by its ID to an existing account.\n", + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy document to be assigned to the account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + }, + "x-readme-ref-name": "PolicyDocumentAssign" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentAssignStrict" + } + } + } + }, + "CreatePolicyGroupRequestBody": { + "description": "Creates a policy group and related documents.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "policies": { + "type": "array", + "description": "the ID's of the policy documents that the group should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + } + }, + "required": [ + "name" + ] + } + ], + "x-readme-ref-name": "PolicyGroupCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyGroupCreateStrict" + } + } + } + }, + "CreateUserNotificationsRequestBody": { + "description": "Create a notification.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationStrict" + } + } + } + }, + "UpdateUserNotificationsRequestBody": { + "description": "Updates a notification.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationStrict" + } + } + } + }, + "AccountUpdateRequestBody": { + "description": "Updates an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AccountUpdateStrict" + } + } + } + }, + "AccountCreateRequestBody": { + "description": "Creates an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. If not set, defaults to the authenticated account." + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "default": "b2b", + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKindWithDefault" + }, + "groups": { + "type": "array", + "description": "the IDs of the policy groups that the account should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AccountCreateStrict" + } + } + } + }, + "MoveAccountRequestBody": { + "description": "Move an account into the target account with the provided targetID.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Move Account", + "type": "object", + "required": [ + "targetID" + ], + "properties": { + "targetID": { + "description": "AccountID of the target account that the account should be moved into.", + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + } + }, + "x-readme-ref-name": "MoveAccount" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "MoveAccountStrict" + } + } + } + }, + "AssignSystemToAccount": { + "description": "Assign a system (and its customers) to an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "System-Account assignment", + "type": "object", + "required": [ + "uuids" + ], + "properties": { + "moveSystemsAndCustomers": { + "description": "- `true`: Moves the system from the origin account to the target account (accountID parameter) and its parent accounts. The customers that belong to that account are also moved to the target account.\n- `false`: Assigns the system to the target account (accountID parameter) and its parent accounts.\n", + "type": "boolean" + }, + "moveVendorID": { + "description": "`true` by default when moveSystemsAndCustomers is `true`.\n - `true`: Updates the vendorID of the gateway of the specified system to the target accountID.\n - `false`: Does not update the vendorID of the gateway of the specified system.\n", + "type": "boolean" + }, + "uuids": { + "description": "System IDs that will be moved to the target account.", + "type": "array", + "items": { + "type": "string", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + } + }, + "x-readme-ref-name": "SystemAccountAssignment" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemAccountAssignmentStrict" + } + } + } + }, + "UnassignSystemToAccount": { + "description": "Unassings a system (and its customers) from an account.", + "required": true, + "content": { + "application/json": { + "schema": { + "title": "System-Account unassignment", + "type": "object", + "required": [ + "uuids" + ], + "properties": { + "moveSystemsAndCustomers": { + "description": "- `true`: Unassigns the system from the given account (accountID parameter). Moves the customer account to the parent account of the account the system is unassigned from (accountID parameter).\n- `false`: Unassigns the system from the given account (accountID parameter).\n", + "type": "boolean" + }, + "moveVendorID": { + "description": "`true` by default when moveSystemsAndCustomers is `true`.\n\n - `true`: Updates the vendorID of the gateway of the specified system to the target accounts' parentID.\n - `false`: Does not update the vendorID of the gateway of the specified system.\n", + "type": "boolean" + }, + "uuids": { + "description": "System IDs that will be removed from the target account.", + "type": "array", + "items": { + "type": "string", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + } + }, + "x-readme-ref-name": "SystemAccountUnAssignment" + } + } + } + }, + "CreateNotificationRuleRequestBody": { + "description": "Creates a notification rule.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationsRuleSetStrict" + } + } + } + }, + "UpdateNotificationRuleRequestBody": { + "description": "Updates a notification rule.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationsRuleSetStrict" + } + } + } + }, + "CreateAssetRequestBody": { + "description": "Creates an asset.", + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string", + "example": "Some Human-Readable Asset Name" + }, + "applicationId": { + "type": "string", + "format": "uuid" + }, + "system": { + "description": "Minimal information about the System in which the Asset is being created.", + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + }, + "required": [ + "id" + ] + }, + "manufacturer": { + "type": "string", + "example": "TQ-Systems" + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300" + }, + "serialNumber": { + "type": "string", + "example": "3cdae5c3c30c53b9" + }, + "priority": { + "type": "boolean", + "default": false + }, + "lastHeartbeatReceivedAt": { + "type": "string", + "format": "date-time", + "description": "At what time the last heartbeat was received." + }, + "driverVersion": { + "type": "string", + "example": "v1.0.1" + }, + "type": { + "type": "string", + "enum": [ + "CONTAINER", + "EVSTATION", + "HEAT_PUMP", + "HEATER", + "INVERTER", + "IO_DEVICE", + "METER", + "UNKNOWN" + ] + }, + "kind": { + "type": "string", + "enum": [ + "BATTERY", + "BTTP", + "CLUSTER", + "CONTAINER", + "EVSTATION", + "FUEL_CELL", + "GRID", + "HEAT_PUMP", + "HEAT_PUMP_EXTERNAL", + "HEATER", + "HEATING", + "HYBRID", + "IO_DEVICE", + "MISC", + "PV", + "PV_EXTERNAL", + "UNKNOWN", + "WIND_TURBINE" + ] + }, + "metadata": { + "type": "string", + "format": "json", + "example": "\"{\"reverse_flow\": false, \"aux_meter_type\": \"SIMULATION_AUX_METER_TYPE\"}\"" + }, + "networkSettings": { + "description": "Provides information about how to connect to the asset. The data varies depending on the driver.", + "type": "object", + "properties": { + "address": { + "type": "string", + "example": "wss://SMA3009885376.local:4712/ship/" + }, + "port": { + "type": "integer", + "example": 1234, + "minimum": 0, + "maximum": 65535 + } + }, + "x-readme-ref-name": "NetworkSettings" + } + }, + "required": [ + "type", + "system" + ] + } + } + } + }, + "UpdateAssetRequestBody": { + "description": "Updates an asset.", + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "A request to (partially) update an asset", + "properties": { + "name": { + "type": "string", + "example": "Some Human-Readable Asset Name" + }, + "system": { + "description": "Minimal information needed to check asset permission. Note: This property is for verification purposes only and it will not update or patch system ID.\n", + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + }, + "required": [ + "id" + ] + }, + "manufacturer": { + "type": "string", + "example": "TQ-Systems" + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300" + }, + "serialNumber": { + "type": "string", + "example": "3cdae5c3c30c53b9" + }, + "priority": { + "type": "boolean", + "nullable": true + }, + "lastHeartbeatReceivedAt": { + "type": "string", + "format": "date-time", + "description": "At what time the last heartbeat was received." + }, + "driverVersion": { + "type": "string", + "example": "v1.0.1" + }, + "type": { + "type": "string", + "enum": [ + "CONTAINER", + "EVSTATION", + "HEAT_PUMP", + "HEATER", + "INVERTER", + "IO_DEVICE", + "METER", + "UNKNOWN" + ] + }, + "kind": { + "type": "string", + "enum": [ + "BATTERY", + "BTTP", + "CLUSTER", + "CONTAINER", + "EVSTATION", + "FUEL_CELL", + "GRID", + "HEAT_PUMP", + "HEAT_PUMP_EXTERNAL", + "HEATER", + "HEATING", + "HYBRID", + "IO_DEVICE", + "MISC", + "PV", + "PV_EXTERNAL", + "UNKNOWN", + "WIND_TURBINE" + ] + }, + "metadata": { + "type": "string", + "format": "json", + "example": "\"{\"reverse_flow\": false, \"aux_meter_type\": \"SIMULATION_AUX_METER_TYPE\"}\"" + }, + "networkSettings": { + "description": "Provides information about how to connect to the asset. The data varies depending on the driver.", + "type": "object", + "properties": { + "address": { + "type": "string", + "example": "wss://SMA3009885376.local:4712/ship/" + }, + "port": { + "type": "integer", + "example": 1234, + "minimum": 0, + "maximum": 65535 + } + }, + "x-readme-ref-name": "NetworkSettings" + } + }, + "required": [ + "system" + ] + } + } + } + }, + "CustomerAccountUpdateRequestBody": { + "description": "Updates an end-customer account.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "CustomerAccountUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "CustomerAccountUpdateStrict" + } + } + } + }, + "SetImportPowerLimitRequestBody": { + "description": "Set a gateway's import power limit.", + "required": true, + "content": { + "application/json": { + "schema": { + "x-readme-ref-name": "ImportPowerLimitSet", + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + } + } + } + } + }, + "SystemCreationRequestBody": { + "description": "The body of a system creation request.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "type": "object", + "properties": { + "priorities": { + "readOnly": true + }, + "curtailmentStrategy": { + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "SystemCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemCreateStrict" + } + } + } + }, + "SystemUpdateRequestBody": { + "description": "Modified System.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "type": "object", + "properties": { + "productOption": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + } + } + } + } + ], + "x-readme-ref-name": "SystemUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemUpdateStrict" + }, + "examples": { + "updateName": { + "summary": "Update system name", + "value": { + "name": "gridX Headquarter" + } + }, + "enableDerApi": { + "description": "This example enables cloud DER API.\nThis means that the gridBox will publish both constraints and flexibilities, which makes the objects available through the API.\n", + "summary": "Enable DER API", + "value": { + "metadata": { + "energy": { + "ems": { + "derAPISettings": { + "enabledCloudAPI": true + } + } + } + } + } + }, + "enableDerApiWithoutFlexibilitiesSync": { + "description": "This example enables cloud DER API without flexibilities being synchronised with gridBox.\nThis means that the gridBox won't publish flexibilities and only considers the constraints published to the cloud.\n", + "summary": "Enable DER API, do not sync flexibilities", + "value": { + "metadata": { + "energy": { + "ems": { + "derAPISettings": { + "enabledCloudAPI": true, + "flexibilities": { + "disabled": true + } + } + } + } + } + } + }, + "assignProductOption": { + "summary": "Assign a product option to the system", + "value": { + "productOption": { + "id": "d085f746-1ae3-4a89-ab3a-a5aa61fd4bf8" + } + } + } + } + } + } + }, + "GatewayCreation": { + "description": "Gateway to be created.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-Z0-9]{16}$" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + } + }, + "required": [ + "startcode" + ] + } + ], + "x-readme-ref-name": "GatewayCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "GatewayCreateStrict" + } + } + } + }, + "ApplianceUpdateRequestBody": { + "description": "Partially updates an appliance.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Appliance Update", + "description": "ApplianceUpdate contains fields of an appliance that can be updated.\n", + "type": "object", + "properties": { + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "kind": { + "description": "Indicates the specific kind or role of the appliance.\nOnly settable for appliances of type `INVERTER` or `METER`.\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID", + "GRID", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ] + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + } + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "desiredState": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "ApplianceUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ApplianceUpdateStrict" + } + } + } + }, + "TimeOfUseSettingsPut": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "properties": { + "enabledBatteryChargeFromGrid": { + "default": true + }, + "enabledDischargeFlexibilityToGrid": { + "default": false + } + }, + "required": [ + "enabled" + ] + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPut" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPutStrict" + } + } + } + }, + "TimeOfUseSettingsPatch": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPatchStrict" + } + } + } + }, + "CreatePolicyDocumentRequestBody": { + "description": "Policy document to be created.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Policy Document Create", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentCreateStrict" + } + } + } + }, + "UpdatePolicyDocumentRequestBody": { + "description": "Policy document to be updated.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "title": "Policy Document Update", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentUpdateStrict" + } + } + } + }, + "AssignPolicyToGroupRequestBody": { + "description": "Assigns a policy document to a group.", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + }, + "x-readme-ref-name": "PolicyGroupAssignment" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyGroupAssignmentStrict" + } + } + } + }, + "UpdatePowerSequenceRequestBody": { + "description": "Update a power sequence for the given device.", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + } + ], + "x-readme-ref-name": "PowerSequenceUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PowerSequenceUpdateStrict" + }, + "examples": { + "scheduleStart": { + "summary": "Start a power sequence at a scheduled time.", + "value": { + "startTime": "2021-06-24T12:00:00" + } + } + } + } + } + }, + "UpdateNotificationRequestBody": { + "description": "Modified Notification", + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + } + ], + "x-readme-ref-name": "NotificationUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationUpdateStrict" + } + } + } + } + }, + "responses": { + "GetScanConfigResponse": { + "description": "Scan configuration returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "The account ID the configuration belongs to.", + "readOnly": true + }, + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was updated the last time." + } + }, + "x-readme-ref-name": "ScanConfiguration" + } + } + } + }, + "CreateScanConfigResponse": { + "description": "Scan configuration created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "The account ID the configuration belongs to.", + "readOnly": true + }, + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was updated the last time." + } + }, + "x-readme-ref-name": "ScanConfiguration" + } + } + } + }, + "UpdateScanConfigResponse": { + "description": "Scan configuration updated.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "The account ID the configuration belongs to.", + "readOnly": true + }, + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was updated the last time." + } + }, + "x-readme-ref-name": "ScanConfiguration" + } + } + } + }, + "AccountNotFoundResponse": { + "description": "Account not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "ScanConfigurationNotFoundResponse": { + "description": "Scan configuration not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "TariffNotFoundResponse": { + "description": "Tariff not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "GetAccountResponse": { + "description": "Account returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "UpdateAccountResponse": { + "description": "Account updated.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "GetAccountsResponse": { + "description": "Accounts returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + } + }, + "CreateAccountResponse": { + "description": "Account created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "GetAccountDocumentsResponse": { + "description": "Account documents returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "File", + "description": "Used to represent a bunch of data related to files in the S3 bucket.\n", + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "size": { + "type": "number" + }, + "modified": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "key", + "size", + "modified" + ], + "x-readme-ref-name": "File" + } + } + } + } + }, + "GetAccountDocumentResponse": { + "description": "Account document returned.\nThe MIME-Type and concrete content depends on the returned file.\n" + }, + "CreateAccountDocumentResponse": { + "description": "Account document created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "File", + "description": "Used to represent a bunch of data related to files in the S3 bucket.\n", + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "size": { + "type": "number" + }, + "modified": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "key", + "size", + "modified" + ], + "x-readme-ref-name": "File" + }, + { + "type": "object", + "properties": { + "link": { + "description": "URI location of the uploaded file", + "type": "string" + } + }, + "required": [ + "link" + ] + } + ], + "x-readme-ref-name": "FileCreate" + } + } + } + }, + "GetPolicyDocumentsInGroup": { + "description": "Policy documents returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + } + }, + "GetSystemsResponse": { + "description": "Systems returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + }, + { + "properties": { + "users": { + "description": "The users belonging to this system.\nOnly set if `embed` query parameter includes `user`.\n", + "type": "array", + "readOnly": true, + "items": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + } + } + } + } + ], + "x-readme-ref-name": "SystemWithUsers" + } + } + } + } + }, + "GetGroupsByAccountResponse": { + "description": "Policy groups of the account returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + } + } + } + }, + "CreatePolicyGroupResponse": { + "description": "Policy group created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + } + } + }, + "GetPolicyGroupResponse": { + "description": "Policy group returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + }, + { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "properties": { + "deliveryAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customerID": { + "type": "string", + "description": "Uniquely identifies the customer." + }, + "meterID": { + "type": "string" + }, + "wizardCompleted": { + "type": "boolean", + "description": "True if the wizard has been completed." + }, + "lastRequestAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the last request has been made by the customer. This field might not be always up-to-date and it might take some time for changes to be propagated.", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "AbstractCustomer" + } + ], + "x-readme-ref-name": "CustomerWithoutAuth" + } + } + } + } + ], + "x-readme-ref-name": "PolicyGroupWithCustomers" + } + } + } + }, + "UpdatePolicyGroupResponse": { + "description": "Updated policy group.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + ] + } + } + } + }, + "AssignSystemToAccountResponse": { + "description": "System assigned to account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "UnassignSystemToAccountResponse": { + "description": "System unassigned from account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "MoveAccountResponse": { + "description": "Moved account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + } + } + } + }, + "GetNotificationsResponse": { + "description": "Notifications returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + } + } + } + } + }, + "GetNotificationResponse": { + "description": "Notification returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + } + } + } + }, + "NotificationNotFoundResponse": { + "description": "Notification not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "CreateUserNotificationsResponse": { + "description": "Notification created.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + } + } + } + }, + "GetNotificationRuleResponse": { + "description": "Notifications rule returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "NotificationsRule" + } + } + } + }, + "GetNotificationRulesResponse": { + "description": "Notification rules returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "NotificationsRule" + } + } + } + } + }, + "GetChargePlansResponse": { + "description": "Charge plans returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "ChargePlan", + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "x-readme-ref-name": "ChargePlan" + } + } + } + } + }, + "AssignChargePlanResponse": { + "description": "Charge plans assigned to account.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "ChargePlan", + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "x-readme-ref-name": "ChargePlan" + } + } + } + }, + "GetEnergyMarketPricesResponse": { + "description": "Energy market prices returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Energy Market Data", + "type": "object", + "properties": { + "priceUnit": { + "type": "string", + "description": "Currency unit which the prices are (ct/kWh).", + "example": "EUR/MWh" + }, + "averagePriceDay": { + "type": "number", + "format": "double", + "description": "Average price of the second to last day in EUR/MWh.", + "example": 33.6 + }, + "periodStart": { + "type": "string", + "description": "Starting date at which the prices are fetched in RFC3339 format.", + "example": "2020-09-24T00:00:00Z" + }, + "periodEnd": { + "type": "string", + "description": "Ending date at which the prices are fetched in RFC3339 format.", + "example": "2022-09-27T00:00:00Z" + }, + "totalPrices": { + "description": "Contains an array of arrays in the format [time, price].\n\nThe fetched prices are in the following order:\n* Average prices for each day between [PeriodStart, SecondToLastDay].\n* Prices for the second to last day from the given interval with resolution 1h.\n* Price for the last day of the given interval with resolution 1h.\n", + "type": "array", + "items": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "example": [ + [ + "2022-09-25T22:00:00Z", + 2.5 + ], + [ + "2022-09-25T23:00:00Z", + 1 + ], + [ + "2022-09-26T00:00:00Z", + 2 + ], + [ + "2022-09-26T01:00:00Z", + 3 + ], + [ + "2022-09-26T02:00:00Z", + 4 + ], + [ + "2022-09-26T23:00:00Z", + 1 + ], + [ + "2022-09-27T00:00:00Z", + 2 + ], + [ + "2022-09-27T01:00:00Z", + 3 + ], + [ + "2022-09-27T02:00:00Z", + 4 + ] + ] + } + }, + "x-readme-ref-name": "EnergyMarketData" + } + } + } + }, + "GetAccountParentsResponse": { + "description": "Account parents sorted hierarchical.\nThe first item is the parent of the passed account. \nThe next is the parent of the parent of the passed account. \n", + "content": { + "application/json": { + "example": [ + { + "accountID": "parent" + }, + { + "accountID": "parent-parent", + "audience": "my-audience" + }, + { + "accountID": "root" + } + ], + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "accountID": { + "type": "string" + }, + "audience": { + "type": "string" + } + }, + "required": [ + "accountID" + ] + } + } + } + } + }, + "BadGatewayExceptionResponse": { + "description": "There has been an error from an upstream server.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + } + } + } + }, + "InvalidExceptionResponse": { + "description": "Validation failed.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + } + } + } + }, + "InternalExceptionResponse": { + "description": "There has been an internal error on our side. We're looking into it.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + } + } + } + }, + "ForbiddenExceptionResponse": { + "description": "Forbidden.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + } + } + } + }, + "BadRequestExceptionResponse": { + "description": "Malformed request.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + } + } + } + }, + "EntityNotFoundResponse": { + "description": "Requested entity not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "CustomerNotFoundResponse": { + "description": "Customer Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "UnauthorizedException": { + "description": "Unauthorized.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Unauthorized", + "description": "The client isn't authorized to access the requested resource.", + "example": { + "message": "Unauthorized" + } + } + ], + "x-readme-ref-name": "UnauthorizedException" + } + } + } + }, + "GetImportPowerLimitResponse": { + "description": "Import power limit returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + }, + "x-readme-ref-name": "AbstractImportPowerLimit" + }, + { + "properties": { + "internalDeviceID": { + "type": "string", + "description": "Unique ID to identify the gateway the import power limit belongs to.", + "example": "aeb639cf0793e81f0804c6647af7f0900a847921c0596726f1afdfd04a3a3186", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the import power limit was updated in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "numberOfPhases", + "internalDeviceID", + "createdAt", + "updatedAt", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "importEVMarginTotal", + "importEVMarginPhase", + "maxImportEVMarginL1", + "maxImportEVMarginL2", + "maxImportEVMarginL3", + "maxImportEVWorstCase", + "maxImportEVWorstCaseL1", + "maxImportEVWorstCaseL2", + "maxImportEVWorstCaseL3" + ] + } + ], + "x-readme-ref-name": "ImportPowerLimit" + } + } + } + }, + "SetImportPowerLimitResponse": { + "description": "Import power limit set.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + }, + "x-readme-ref-name": "AbstractImportPowerLimit" + }, + { + "properties": { + "internalDeviceID": { + "type": "string", + "description": "Unique ID to identify the gateway the import power limit belongs to.", + "example": "aeb639cf0793e81f0804c6647af7f0900a847921c0596726f1afdfd04a3a3186", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the import power limit was updated in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "numberOfPhases", + "internalDeviceID", + "createdAt", + "updatedAt", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "importEVMarginTotal", + "importEVMarginPhase", + "maxImportEVMarginL1", + "maxImportEVMarginL2", + "maxImportEVMarginL3", + "maxImportEVWorstCase", + "maxImportEVWorstCaseL1", + "maxImportEVWorstCaseL2", + "maxImportEVWorstCaseL3" + ] + } + ], + "x-readme-ref-name": "ImportPowerLimit" + } + } + } + }, + "ImportPowerLimitNotFoundResponse": { + "description": "Import power limit not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "HistoricalPowerLimitsResponse": { + "description": "Historical import power limits returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Historical import power limit", + "type": "object", + "properties": { + "systemID": { + "type": "string", + "format": "uuid", + "description": "Unique ID to identify the system the import power limits belong to.", + "readOnly": true, + "example": "512654ea-5328-4c79-8ed7-b4136aa31679" + }, + "data": { + "type": "array", + "items": { + "title": "Import power limits stored with the dynamic API.", + "type": "object", + "properties": { + "maxImportMeasuredTimestamp": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "maxImportTotal": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in mW." + }, + "maxImportL1": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the first phase in mW." + }, + "maxImportL2": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the second phase in mW." + }, + "maxImportL3": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the third phase in mW." + }, + "maxImportEvMarginTotal": { + "type": "integer", + "format": "int64", + "description": "maxImportTotal - importEVMarginTotal is the maximum import power considered in total in mW." + }, + "maxImportEvMarginL1": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the first phase in mW." + }, + "maxImportEvMarginL2": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the second phase in mW." + }, + "maxImportEvMarginL3": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the third phase in mW." + }, + "maxImportEvMarginWorstCaseTotal": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost." + }, + "maxImportEvMarginWorstCaseL1": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the first phase." + }, + "maxImportEvMarginWorstCaseL2": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the second phase." + }, + "maxImportEvMarginWorstCaseL3": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the third phase." + } + }, + "required": [ + "maxImportMeasuredTimestamp", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "maxImportEvMarginTotal", + "maxImportEvMarginL1", + "maxImportEvMarginL2", + "maxImportEvMarginL3", + "maxImportEvMarginWorstCaseTotal", + "maxImportEvMarginWorstCaseL1", + "maxImportEvMarginWorstCaseL2", + "maxImportEvMarginWorstCaseL3" + ], + "x-readme-ref-name": "PowerLimitDynamic" + } + } + }, + "required": [ + "systemID", + "data" + ], + "x-readme-ref-name": "HistoricalPowerLimits" + } + } + } + }, + "HistoricalPowerLimitsNotFoundResponse": { + "description": "Historical import power limits not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "NotFoundErrorResponse": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "JobNotFoundResponse": { + "description": "Job or Gateway not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "GatewayNotFoundResponse": { + "description": "Gateway Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "SystemNotFoundResponse": { + "description": "System not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "SystemCreated": { + "description": "The created system.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + } + } + } + }, + "ConflictExceptionResponse": { + "description": "Resource already exists", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Conflict", + "description": "Conflict indicates that the client is attempting to create a resource that already exists.\n", + "type": "object", + "example": { + "message": "Resource already exists" + } + } + ], + "x-readme-ref-name": "ConflictException" + } + } + } + }, + "TimeOfUseSettingsResp": { + "description": "Ok", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "required": [ + "enabled", + "enabledBatteryChargeFromGrid", + "enabledDischargeFlexibilityToGrid" + ] + } + ] + } + } + } + }, + "NotFoundExceptionResponse": { + "description": "Entity Not found.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "ListPoliciesResponse": { + "description": "List of policies.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + } + }, + "CreatePolicyDocumentResponse": { + "description": "Created policy document.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + }, + "PolicyDocumentResponse": { + "description": "Policy Document", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + }, + "GetDevicesResponse": { + "description": "SPINE devices returned.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "ID for device, must be url encoded. E.g. deviceId as specified by manufacturer.", + "type": "string", + "example": "27jslrNMHpUx266" + }, + "url": { + "description": "URL of the device.", + "type": "string" + }, + "parentURL": { + "description": "URL of parent device.", + "type": "string" + }, + "deviceAddress": { + "description": "SPINE DeviceAddress.", + "type": "string", + "pattern": "d:_(i:[1-9][0-9]*|n:[a-zA-Z0-9-]+)_[^\\p{Cc}\\p{Cf}\\p{Z}]+", + "example": "d:_n:NaTeYtMjnNGtQqQvbuJT4AoSY-LBq_;:7Jbs,L\"Qz.hQg" + }, + "type": { + "description": "Type of the device.", + "type": "string", + "example": "washer" + }, + "label": { + "description": "User-defined label via an external app e.g Home Connect.", + "type": "string", + "example": "My new dishwasher" + }, + "bindings": { + "description": "List of bindings.", + "type": "array", + "items": { + "type": "object", + "properties": { + "bindingId": { + "description": "ID of binding entry, must be unique in path. The bindingId is provided by the server and must not specified on client side.", + "type": "string", + "readOnly": true, + "example": "jaxbv2" + }, + "type": { + "description": "The resource type for which the binding is created.", + "type": "string", + "enum": [ + "powerSequence" + ], + "example": "powerSequence" + }, + "url": { + "description": "Convenience pointer to endpoint for this binding. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "readOnly": true, + "example": "https://api.eebus.org/devices/1041A421/bindings/jaxbv2" + }, + "name": { + "description": "User-friendly name of binding partner.", + "type": "string", + "example": "bindingName" + }, + "validity": { + "description": "A Binding is valid for 24 hours and will be released if not renewed in time. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2021-07-24T23:59:59Z" + } + }, + "required": [ + "type", + "name" + ], + "x-readme-ref-name": "binding" + }, + "x-readme-ref-name": "bindings" + }, + "usecases": { + "description": "List of supported use-cases for this device.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "description": "Semantic short name of the use-case.", + "type": "string", + "enum": [ + "fswg" + ], + "readOnly": true, + "example": "fswg" + }, + "actor": { + "description": "The actor's role in the current scenario.", + "type": "string", + "enum": [ + "server", + "client" + ], + "readOnly": true, + "example": "server" + } + }, + "required": [ + "name", + "actor" + ], + "x-readme-ref-name": "usecase" + }, + "x-readme-ref-name": "usecases" + }, + "resources": { + "description": "List of resources available on this device.", + "type": "array", + "items": { + "description": "A specific resource describes a capability (e.g. flexible start of white goods).", + "type": "object", + "properties": { + "url": { + "description": "URL of the resource.", + "type": "string", + "example": "https://api.eebus.org/devices/1041A421/powerSequences" + }, + "type": { + "description": "Type of the resource.", + "type": "string", + "example": "powerSequence" + }, + "specialization": { + "description": "Specialization of the resource.", + "type": "string", + "example": "flexibleStart" + }, + "supportsBinding": { + "description": "Explicit definition whether the resource supports exclusive binding.", + "type": "boolean", + "example": true + }, + "data": { + "type": "array", + "items": { + "oneOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + { + "required": [ + "earliestStartTime", + "latestEndTime", + "powerTimeSlots" + ] + } + ], + "x-readme-ref-name": "PowerSequence" + } + ] + } + } + }, + "required": [ + "url", + "type", + "supportsBinding", + "data" + ], + "x-readme-ref-name": "resource" + }, + "x-readme-ref-name": "resources" + } + }, + "required": [ + "id", + "url", + "type", + "bindings", + "usecases", + "resources" + ], + "x-readme-ref-name": "device" + } + }, + "example": { + "homeconnect": [ + { + "id": "27jslrNMHpUx266", + "url": "homeconnect-device-url", + "parentURL": "string", + "deviceAddress": "d:_n:NaTeYtMjnNGtQqQvbuJT4AoSY-LBq_;:7Jbs,L\"Qz.hQg", + "type": "washer", + "label": "My New Dishwasher", + "bindings": [ + { + "bindingId": "jaxbv2", + "type": "powerSequence", + "url": "https://api.eebus.org/devices/1041A421/bindings/jaxbv2", + "name": "bindingName", + "validity": "2021-07-24T23:59:59Z" + } + ], + "usecases": [ + { + "name": "fswg", + "actor": "server" + } + ], + "resources": [ + { + "url": "https://api.eebus.org/devices/1041A421/powerSequences", + "type": "powerSequence", + "specialization": "flexibleStart", + "supportsBinding": true, + "data": [ + { + "sequenceId": 1, + "state": "scheduled", + "activeSlotNumber": 0, + "sequenceRemoteControllable": true, + "startTime": "2021-06-24T12:00:00Z", + "endTime": "2021-06-24T13:40:00Z", + "earliestStartTime": "2021-06-24T06:20:00Z", + "latestEndTime": "2021-06-24T19:00:00Z", + "isPausable": false, + "isStoppable": false, + "valueSource": "empiricalValue", + "taskIdentifier": 0, + "powerTimeSlots": [ + { + "slotId": 1, + "defaultDuration": "00:23:00", + "powerMin": 100, + "powerExpectedValue": 200, + "powerMax": 1000 + } + ] + } + ] + } + ] + } + ] + }, + "x-readme-ref-name": "devices" + } + } + } + }, + "DeviceNotFoundResponse": { + "description": "Device Not found", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + } + } + } + }, + "GetUserPolicyDocumentsResponse": { + "description": "The user's policies.", + "content": { + "application/vnd.gridx.v2+json": { + "schema": { + "type": "array", + "items": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + } + } + } + } + } + }, + "securitySchemes": { + "BearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + }, + "schemas": { + "PlatformMapping": { + "title": "PlatformMapping", + "description": "Represents a 1:1 mapping from a XENON account to a Platform workspace and application.", + "type": "object", + "required": [ + "applicationID", + "workspaceID", + "accountID" + ], + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true, + "description": "Unique identifier of a XENON account." + }, + "applicationID": { + "type": "string", + "format": "uuid", + "example": "7af138d7-717d-486e-8ad1-1d4ed4b1669e", + "description": "Unique identifier of the corresponding platform application." + }, + "workspaceID": { + "type": "string", + "format": "uuid", + "example": "2549665c-5067-49ad-af6a-9c74e74095e8", + "description": "Unique identifier of the corresponding platform workspace." + } + }, + "x-readme-ref-name": "PlatformMapping" + }, + "ScanConfigurationSet": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "x-readme-ref-name": "ScanConfigurationSet" + }, + "ScanConfigurationSetStrict": { + "allOf": [ + { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "x-readme-ref-name": "ScanConfigurationSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ScanConfigurationSetStrict" + }, + "ScanConfiguration": { + "title": "ScanConfiguration", + "description": "ScanConfiguration determines the behavior of a scan.", + "type": "object", + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "The account ID the configuration belongs to.", + "readOnly": true + }, + "configuration": { + "description": "The names of the scanners in this configuration.", + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the configuration was updated the last time." + } + }, + "x-readme-ref-name": "ScanConfiguration" + }, + "ChargePlan": { + "title": "ChargePlan", + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "x-readme-ref-name": "ChargePlan" + }, + "File": { + "title": "File", + "description": "Used to represent a bunch of data related to files in the S3 bucket.\n", + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "size": { + "type": "number" + }, + "modified": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "key", + "size", + "modified" + ], + "x-readme-ref-name": "File" + }, + "FileCreate": { + "allOf": [ + { + "title": "File", + "description": "Used to represent a bunch of data related to files in the S3 bucket.\n", + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "size": { + "type": "number" + }, + "modified": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "key", + "size", + "modified" + ], + "x-readme-ref-name": "File" + }, + { + "type": "object", + "properties": { + "link": { + "description": "URI location of the uploaded file", + "type": "string" + } + }, + "required": [ + "link" + ] + } + ], + "x-readme-ref-name": "FileCreate" + }, + "EnergyTariff": { + "title": "Energy Tariff", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID to identify the energy tariff.", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829d33", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom" + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "periods": { + "type": "array", + "items": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + } + } + }, + "x-readme-ref-name": "EnergyTariff" + }, + "EnergyTariffStrict": { + "allOf": [ + { + "title": "Energy Tariff", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID to identify the energy tariff.", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829d33", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom" + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "periods": { + "type": "array", + "items": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + } + } + }, + "x-readme-ref-name": "EnergyTariff" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EnergyTariffStrict" + }, + "EnergyTariffPeriod": { + "title": "Energy Tariff Period", + "type": "object", + "properties": { + "day": { + "type": "integer", + "description": "Numeric day of week. 1 means Monday and 7 means Sunday.", + "example": 1 + }, + "from": { + "type": "integer", + "description": "Time of day in seconds at which the period starts, e.g. 07:00 = 7*60*60 = 25200.", + "example": 25200 + }, + "to": { + "type": "integer", + "description": "Time of day in seconds at which the period ends, e.g. 20:00 = 20*60*60 = 72000.", + "example": 72000 + }, + "feedinPrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "description": "Price in cents per kWh (ct/kWh) for consumed energy in the period [from, to)." + } + }, + "x-readme-ref-name": "EnergyTariffPeriod" + }, + "EnergyMarketData": { + "title": "Energy Market Data", + "type": "object", + "properties": { + "priceUnit": { + "type": "string", + "description": "Currency unit which the prices are (ct/kWh).", + "example": "EUR/MWh" + }, + "averagePriceDay": { + "type": "number", + "format": "double", + "description": "Average price of the second to last day in EUR/MWh.", + "example": 33.6 + }, + "periodStart": { + "type": "string", + "description": "Starting date at which the prices are fetched in RFC3339 format.", + "example": "2020-09-24T00:00:00Z" + }, + "periodEnd": { + "type": "string", + "description": "Ending date at which the prices are fetched in RFC3339 format.", + "example": "2022-09-27T00:00:00Z" + }, + "totalPrices": { + "description": "Contains an array of arrays in the format [time, price].\n\nThe fetched prices are in the following order:\n* Average prices for each day between [PeriodStart, SecondToLastDay].\n* Prices for the second to last day from the given interval with resolution 1h.\n* Price for the last day of the given interval with resolution 1h.\n", + "type": "array", + "items": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "example": [ + [ + "2022-09-25T22:00:00Z", + 2.5 + ], + [ + "2022-09-25T23:00:00Z", + 1 + ], + [ + "2022-09-26T00:00:00Z", + 2 + ], + [ + "2022-09-26T01:00:00Z", + 3 + ], + [ + "2022-09-26T02:00:00Z", + 4 + ], + [ + "2022-09-26T23:00:00Z", + 1 + ], + [ + "2022-09-27T00:00:00Z", + 2 + ], + [ + "2022-09-27T01:00:00Z", + 3 + ], + [ + "2022-09-27T02:00:00Z", + 4 + ] + ] + } + }, + "x-readme-ref-name": "EnergyMarketData" + }, + "GeneralException": { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + "NotFoundException": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Not Found", + "description": "Not Found indicates that the entity was not found.", + "example": { + "message": "Not Found" + } + } + ], + "x-readme-ref-name": "NotFoundException" + }, + "InvalidException": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Validation", + "description": "Validation indicates that the request body contains fields which\ndoes not pass the validation.\n", + "type": "object", + "required": [ + "message", + "details" + ], + "example": { + "message": "Validation failed", + "details": [ + "email is not valid" + ] + } + } + ], + "x-readme-ref-name": "InvalidException" + }, + "InternalException": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ServerSideError - Internal Server Error", + "description": "Internal Server Error", + "example": { + "message": "Internal Server Error" + } + } + ], + "x-readme-ref-name": "InternalException" + }, + "AccountSolution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + }, + "AbstractAccount": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + "AccountKind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "AbstractLocation": { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + "Address": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "Account": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "ForbiddenException": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "UnauthorizedError - Forbidden Error", + "description": "Forbidden Error", + "example": { + "message": "Bad credentials" + } + } + ], + "x-readme-ref-name": "ForbiddenException" + }, + "AccountUpdate": { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountUpdate" + }, + "AccountUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AccountUpdateStrict" + }, + "BadRequestException": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Bad Request", + "description": "Bad Request indicates that the request body is not a valid JSON or\nit contains a invalid json type.\n", + "example": { + "message": "Problems parsing JSON" + } + } + ], + "x-readme-ref-name": "BadRequestException" + }, + "BadGateway": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "BadGatewayError", + "description": "Indicates that there has been an error from an upstream server.", + "example": { + "message": "Bad Gateway" + } + } + ], + "x-readme-ref-name": "BadGateway" + }, + "AbstractAPIToken": { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + "APIToken": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + "AbstractPolicyGroup": { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + "PolicyGroup": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + }, + "Language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + }, + "UserWithoutAuth": { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + "User": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "OrganizationalAPIToken": { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + }, + "APITokenCreation": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + } + ], + "x-readme-ref-name": "APITokenCreation" + }, + "OrganizationalAPITokenCreation": { + "title": "OrganizationalAPITokenCreation", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + } + ], + "x-readme-ref-name": "APITokenCreation" + }, + { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Used to specify the email address associated with the user responsible for the organizational token upon its creation (account email is used by default).", + "example": "john@doe.com" + }, + "groups": { + "type": "array", + "description": "Used to specify the permissions assigned to the organizational token.", + "items": { + "type": "string", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + } + } + } + ], + "x-readme-ref-name": "OrganizationalAPITokenCreation" + }, + "OrganizationalAPITokenCreationStrict": { + "allOf": [ + { + "title": "OrganizationalAPITokenCreation", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + } + ], + "x-readme-ref-name": "APITokenCreation" + }, + { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Used to specify the email address associated with the user responsible for the organizational token upon its creation (account email is used by default).", + "example": "john@doe.com" + }, + "groups": { + "type": "array", + "description": "Used to specify the permissions assigned to the organizational token.", + "items": { + "type": "string", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + } + } + } + ], + "x-readme-ref-name": "OrganizationalAPITokenCreation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "OrganizationalAPITokenCreationStrict" + }, + "OrganizationalAPITokenWithSecret": { + "title": "OrganizationalAPITokenWithSecret", + "allOf": [ + { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + }, + { + "properties": { + "token": { + "type": "string", + "description": "This token can be used for authenticating further requests as an alternative to Bearer Authentication.\n\nExample: Set the header field `Authorization` to `Token gxo_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0`. \nTo set the permissions of it, you can assign a group to the newly created associated organizational user, see `userID`.\n\n**ATTENTION**: Please keep the token secret and treat it like a password! The token is only available immediately after creation and can not be retrieved again afterwards.\n", + "example": "gxo_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0" + } + }, + "required": [ + "token" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPITokenWithSecret" + }, + "OrganizationalAPITokenStrict": { + "allOf": [ + { + "title": "OrganizationalAPIToken", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "user": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "Reference to the user to which the API token belongs. Can be used to set the token's \"scope\" by assigning groups to the user.", + "example": "123ee525-669f-45de-9bca-bf5a51829de3" + } + }, + "required": [ + "user", + "userID" + ] + } + ], + "x-readme-ref-name": "OrganizationalAPIToken" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "OrganizationalAPITokenStrict" + }, + "AccountKindWithDefault": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "default": "b2b", + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKindWithDefault" + }, + "AccountCreate": { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. If not set, defaults to the authenticated account." + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "default": "b2b", + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKindWithDefault" + }, + "groups": { + "type": "array", + "description": "the IDs of the policy groups that the account should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountCreate" + }, + "AccountCreateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. If not set, defaults to the authenticated account." + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "default": "b2b", + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKindWithDefault" + }, + "groups": { + "type": "array", + "description": "the IDs of the policy groups that the account should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "AccountCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AccountCreateStrict" + }, + "MoveAccount": { + "title": "Move Account", + "type": "object", + "required": [ + "targetID" + ], + "properties": { + "targetID": { + "description": "AccountID of the target account that the account should be moved into.", + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + } + }, + "x-readme-ref-name": "MoveAccount" + }, + "MoveAccountStrict": { + "allOf": [ + { + "title": "Move Account", + "type": "object", + "required": [ + "targetID" + ], + "properties": { + "targetID": { + "description": "AccountID of the target account that the account should be moved into.", + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + } + }, + "x-readme-ref-name": "MoveAccount" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "MoveAccountStrict" + }, + "SystemSolution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "SystemCurtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "Location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "MetadataWizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "SyncEntitySettings": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "DerAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "MetadataEMS": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "MetadataEnergy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "MetadataEnergySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "MetadataSmartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + }, + "AbstractSystemMetadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + "AbstractSystem": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + "PositivePower": { + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "AbstractEVChargingSchedule": { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + "EVChargingSchedule": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + }, + "AbstractGateway": { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + "GatewayType": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "ConnectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "AdditionalIdentifier": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "ScannerName": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + }, + "Gateway": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + }, + "SystemWithoutProductOption": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + "EmbeddedAccounts": { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + "AbstractProductOption": { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + "AbstractProductFunctionality": { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + "ProductFunctionality": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + }, + "ProductOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "SystemMetadataWithRabotCharge": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + }, + "System": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + }, + "SystemWithUsers": { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + }, + { + "properties": { + "users": { + "description": "The users belonging to this system.\nOnly set if `embed` query parameter includes `user`.\n", + "type": "array", + "readOnly": true, + "items": { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + } + } + } + } + ], + "x-readme-ref-name": "SystemWithUsers" + }, + "SystemAccountAssignment": { + "title": "System-Account assignment", + "type": "object", + "required": [ + "uuids" + ], + "properties": { + "moveSystemsAndCustomers": { + "description": "- `true`: Moves the system from the origin account to the target account (accountID parameter) and its parent accounts. The customers that belong to that account are also moved to the target account.\n- `false`: Assigns the system to the target account (accountID parameter) and its parent accounts.\n", + "type": "boolean" + }, + "moveVendorID": { + "description": "`true` by default when moveSystemsAndCustomers is `true`.\n - `true`: Updates the vendorID of the gateway of the specified system to the target accountID.\n - `false`: Does not update the vendorID of the gateway of the specified system.\n", + "type": "boolean" + }, + "uuids": { + "description": "System IDs that will be moved to the target account.", + "type": "array", + "items": { + "type": "string", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + } + }, + "x-readme-ref-name": "SystemAccountAssignment" + }, + "SystemAccountAssignmentStrict": { + "allOf": [ + { + "title": "System-Account assignment", + "type": "object", + "required": [ + "uuids" + ], + "properties": { + "moveSystemsAndCustomers": { + "description": "- `true`: Moves the system from the origin account to the target account (accountID parameter) and its parent accounts. The customers that belong to that account are also moved to the target account.\n- `false`: Assigns the system to the target account (accountID parameter) and its parent accounts.\n", + "type": "boolean" + }, + "moveVendorID": { + "description": "`true` by default when moveSystemsAndCustomers is `true`.\n - `true`: Updates the vendorID of the gateway of the specified system to the target accountID.\n - `false`: Does not update the vendorID of the gateway of the specified system.\n", + "type": "boolean" + }, + "uuids": { + "description": "System IDs that will be moved to the target account.", + "type": "array", + "items": { + "type": "string", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + } + }, + "x-readme-ref-name": "SystemAccountAssignment" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemAccountAssignmentStrict" + }, + "SystemAccountUnAssignment": { + "title": "System-Account unassignment", + "type": "object", + "required": [ + "uuids" + ], + "properties": { + "moveSystemsAndCustomers": { + "description": "- `true`: Unassigns the system from the given account (accountID parameter). Moves the customer account to the parent account of the account the system is unassigned from (accountID parameter).\n- `false`: Unassigns the system from the given account (accountID parameter).\n", + "type": "boolean" + }, + "moveVendorID": { + "description": "`true` by default when moveSystemsAndCustomers is `true`.\n\n - `true`: Updates the vendorID of the gateway of the specified system to the target accounts' parentID.\n - `false`: Does not update the vendorID of the gateway of the specified system.\n", + "type": "boolean" + }, + "uuids": { + "description": "System IDs that will be removed from the target account.", + "type": "array", + "items": { + "type": "string", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + } + } + }, + "x-readme-ref-name": "SystemAccountUnAssignment" + }, + "PolicyGroupCreate": { + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "policies": { + "type": "array", + "description": "the ID's of the policy documents that the group should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + } + }, + "required": [ + "name" + ] + } + ], + "x-readme-ref-name": "PolicyGroupCreate" + }, + "PolicyGroupCreateStrict": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "policies": { + "type": "array", + "description": "the ID's of the policy documents that the group should be assigned to.", + "example": [ + "532365fc-5a0e-4323-bc66-4ce9f1308480" + ], + "items": { + "type": "string", + "format": "uuid" + } + } + }, + "required": [ + "name" + ] + } + ], + "x-readme-ref-name": "PolicyGroupCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyGroupCreateStrict" + }, + "AbstractCustomer": { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "properties": { + "deliveryAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customerID": { + "type": "string", + "description": "Uniquely identifies the customer." + }, + "meterID": { + "type": "string" + }, + "wizardCompleted": { + "type": "boolean", + "description": "True if the wizard has been completed." + }, + "lastRequestAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the last request has been made by the customer. This field might not be always up-to-date and it might take some time for changes to be propagated.", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "AbstractCustomer" + }, + "CustomerWithoutAuth": { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "properties": { + "deliveryAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customerID": { + "type": "string", + "description": "Uniquely identifies the customer." + }, + "meterID": { + "type": "string" + }, + "wizardCompleted": { + "type": "boolean", + "description": "True if the wizard has been completed." + }, + "lastRequestAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the last request has been made by the customer. This field might not be always up-to-date and it might take some time for changes to be propagated.", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "AbstractCustomer" + } + ], + "x-readme-ref-name": "CustomerWithoutAuth" + }, + "PolicyGroupWithCustomers": { + "allOf": [ + { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + }, + { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "title": "Customer", + "description": "Represents an end-customer user.", + "type": "object", + "allOf": [ + { + "properties": { + "deliveryAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customerID": { + "type": "string", + "description": "Uniquely identifies the customer." + }, + "meterID": { + "type": "string" + }, + "wizardCompleted": { + "type": "boolean", + "description": "True if the wizard has been completed." + }, + "lastRequestAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the last request has been made by the customer. This field might not be always up-to-date and it might take some time for changes to be propagated.", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "AbstractCustomer" + } + ], + "x-readme-ref-name": "CustomerWithoutAuth" + } + } + } + } + ], + "x-readme-ref-name": "PolicyGroupWithCustomers" + }, + "AbstractPolicyDocument": { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + "AbstractPolicyStatement": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + "PolicyStatement": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + }, + "PolicyDocument": { + "title": "Policy Document", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "id": { + "type": "string", + "readOnly": true, + "format": "uuid", + "description": "Unique identifier of the policy document.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy was last updated in UTC (RFC 3339 format).", + "readOnly": true + }, + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "type": "object", + "allOf": [ + { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was created in UTC (RFC 3339 format).", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Date when the policy statement was last updated in UTC (RFC 3339 format).", + "readOnly": true + } + }, + "required": [ + "id", + "name", + "action", + "resource", + "fields", + "createdAt" + ] + } + ], + "x-readme-ref-name": "PolicyStatement" + } + } + }, + "required": [ + "id", + "statements", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyDocument" + }, + "AbstractNotification": { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + "Notification": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + }, + "Filter": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + }, + "NotificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "AbstractNotificationsRule": { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + "NotificationsRule": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "NotificationsRule" + }, + "NotificationsRuleSetStrict": { + "allOf": [ + { + "title": "NotificationsRule", + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "filters": { + "type": "array", + "items": { + "title": "Filter", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "condition": { + "type": "string" + } + }, + "x-readme-ref-name": "Filter" + } + }, + "notificationType": { + "title": "NotificationType", + "type": "object", + "properties": { + "email": { + "type": "object", + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, + "sms": { + "type": "object", + "properties": { + "phonenumber": { + "type": "string" + } + }, + "required": [ + "phonenumber" + ] + }, + "dashboardNotification": { + "type": "object", + "properties": { + "userID": { + "type": "string" + }, + "endUser": { + "type": "boolean" + } + }, + "required": [ + "userID" + ] + }, + "webhook": { + "type": "object", + "properties": { + "targetURL": { + "type": "string" + }, + "secret": { + "type": "string" + } + }, + "required": [ + "targetURL", + "secret" + ] + }, + "mobile": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "os": { + "type": "string" + }, + "deviceToken": { + "type": "string" + } + } + } + }, + "x-readme-ref-name": "NotificationType" + }, + "locale": { + "type": "string" + } + }, + "x-readme-ref-name": "AbstractNotificationsRule" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationsRuleSetStrict" + }, + "AbstractBiddingZone": { + "type": "object", + "description": "The bidding zone determines from which electricity market bidding zone the raw market prices for\nmarket data tariffs are used.\n\nThe bidding zone is the ENTSOE-E Area EIC codes (Y).\nSee https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/ & https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/\nfor available codes.\n", + "properties": { + "biddingZone": { + "example": "10Y1001A1001A44P", + "type": "string" + } + }, + "required": [ + "biddingZone" + ], + "x-readme-ref-name": "AbstractBiddingZone" + }, + "BiddingZone": { + "allOf": [ + { + "type": "object", + "description": "The bidding zone determines from which electricity market bidding zone the raw market prices for\nmarket data tariffs are used.\n\nThe bidding zone is the ENTSOE-E Area EIC codes (Y).\nSee https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/ & https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/\nfor available codes.\n", + "properties": { + "biddingZone": { + "example": "10Y1001A1001A44P", + "type": "string" + } + }, + "required": [ + "biddingZone" + ], + "x-readme-ref-name": "AbstractBiddingZone" + }, + { + "type": "object", + "properties": { + "biddingZone": { + "nullable": true + } + } + } + ], + "x-readme-ref-name": "BiddingZone" + }, + "BiddingZoneSet": { + "allOf": [ + { + "type": "object", + "description": "The bidding zone determines from which electricity market bidding zone the raw market prices for\nmarket data tariffs are used.\n\nThe bidding zone is the ENTSOE-E Area EIC codes (Y).\nSee https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/ & https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/\nfor available codes.\n", + "properties": { + "biddingZone": { + "example": "10Y1001A1001A44P", + "type": "string" + } + }, + "required": [ + "biddingZone" + ], + "x-readme-ref-name": "AbstractBiddingZone" + }, + { + "type": "object", + "properties": { + "biddingZone": { + "nullable": false + } + } + } + ], + "x-readme-ref-name": "BiddingZoneSet" + }, + "BiddingZoneSetStrict": { + "allOf": [ + { + "allOf": [ + { + "type": "object", + "description": "The bidding zone determines from which electricity market bidding zone the raw market prices for\nmarket data tariffs are used.\n\nThe bidding zone is the ENTSOE-E Area EIC codes (Y).\nSee https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/ & https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/\nfor available codes.\n", + "properties": { + "biddingZone": { + "example": "10Y1001A1001A44P", + "type": "string" + } + }, + "required": [ + "biddingZone" + ], + "x-readme-ref-name": "AbstractBiddingZone" + }, + { + "type": "object", + "properties": { + "biddingZone": { + "nullable": false + } + } + } + ], + "x-readme-ref-name": "BiddingZoneSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "BiddingZoneSetStrict" + }, + "PolicyDocumentAssign": { + "title": "Assign Policy Document to Account", + "description": "Holds the data required to assign an existing policy document by its ID to an existing account.\n", + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy document to be assigned to the account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + }, + "x-readme-ref-name": "PolicyDocumentAssign" + }, + "PolicyDocumentAssignStrict": { + "allOf": [ + { + "title": "Assign Policy Document to Account", + "description": "Holds the data required to assign an existing policy document by its ID to an existing account.\n", + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy document to be assigned to the account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + }, + "x-readme-ref-name": "PolicyDocumentAssign" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentAssignStrict" + }, + "NotificationStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Uniquely identifies the notification.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "userID": { + "type": "string", + "format": "uuid", + "description": "User ID of the recipient.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was created in UTC in RFC3339 format.", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the notification was updated in UTC in RFC3339 format.", + "readOnly": true + } + }, + "required": [ + "id", + "userID", + "content", + "eventType", + "timestamp", + "read", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Notification" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationStrict" + }, + "Assets": { + "description": "A List of Assets and metadata about the list.", + "type": "object", + "properties": { + "assets": { + "type": "array", + "items": { + "description": "An Asset as its defined for the gridX Platform.", + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "name": { + "type": "string", + "example": "Some Human-Readable Asset Name" + }, + "applicationId": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "system": { + "description": "Minimal information about the System that the Asset belongs to.", + "type": "object", + "readOnly": true, + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "name": { + "type": "string", + "example": "GridBox at Office", + "readOnly": true + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "AssetSystem" + }, + "status": { + "type": "string", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ], + "description": "An asset is considered as `AVAILABLE` if it sent a heartbeat in the past 5 minutes. Respectively, if there \nhasn't been a heartbeat in the past 5 minutes, the asset is considered as `UNAVAILABLE`. In case there isn't\na heartbeat (e.g. in case of a new Asset), the status will be `UNKNOWN`.\n", + "default": "UNKNOWN" + }, + "manufacturer": { + "type": "string", + "example": "TQ-Systems", + "readOnly": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "readOnly": true + }, + "serialNumber": { + "type": "string", + "example": "3cdae5c3c30c53b9", + "readOnly": true + }, + "priority": { + "type": "boolean", + "nullable": true + }, + "lastHeartbeatReceivedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "At what time the last heartbeat was received.", + "nullable": true + }, + "driverVersion": { + "type": "string", + "example": "v1.0.1", + "readOnly": true + }, + "type": { + "type": "string", + "enum": [ + "CONTAINER", + "EVSTATION", + "HEAT_PUMP", + "HEATER", + "INVERTER", + "IO_DEVICE", + "METER", + "UNKNOWN" + ] + }, + "kind": { + "type": "string", + "enum": [ + "BATTERY", + "BTTP", + "CLUSTER", + "CONTAINER", + "EVSTATION", + "FUEL_CELL", + "GRID", + "HEAT_PUMP", + "HEAT_PUMP_EXTERNAL", + "HEATER", + "HEATING", + "HYBRID", + "IO_DEVICE", + "MISC", + "PV", + "PV_EXTERNAL", + "UNKNOWN", + "WIND_TURBINE" + ] + }, + "metadata": { + "example": "\"{\"reverse_flow\": false, \"aux_meter_type\": \"SIMULATION_AUX_METER_TYPE\"}\"" + }, + "networkSettings": { + "description": "Provides information about how to connect to the asset. The data varies depending on the driver.", + "type": "object", + "properties": { + "address": { + "type": "string", + "example": "wss://SMA3009885376.local:4712/ship/" + }, + "port": { + "type": "integer", + "example": 1234, + "minimum": 0, + "maximum": 65535 + } + }, + "x-readme-ref-name": "NetworkSettings" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "system", + "type" + ], + "x-readme-ref-name": "Asset" + } + }, + "metadata": { + "type": "object", + "readOnly": true, + "description": "Provides information about the returned object, such as length of the list and distinct values.", + "properties": { + "counts": { + "type": "object", + "description": "This will only be available if the response is a list or contains multiple items. It provides multiple \n\"counts\" of the list that is being returned.\n", + "properties": { + "total": { + "readOnly": true, + "description": "The total number of objects in the list, regardless of any query parameters such as filtering or \npagination.\n", + "type": "integer", + "example": 321 + }, + "filtered": { + "readOnly": true, + "description": "The number of objects in the list after the filters have been applied. This ignores pagination and will \nshow how many objects are available with the given filters. This number will always be less than or \nequal to the `total` count.\n", + "type": "integer", + "example": 123 + } + } + } + }, + "x-readme-ref-name": "AssetsMetadata" + } + }, + "required": [ + "assets" + ], + "x-readme-ref-name": "Assets" + }, + "Asset": { + "description": "An Asset as its defined for the gridX Platform.", + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "name": { + "type": "string", + "example": "Some Human-Readable Asset Name" + }, + "applicationId": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "system": { + "description": "Minimal information about the System that the Asset belongs to.", + "type": "object", + "readOnly": true, + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "name": { + "type": "string", + "example": "GridBox at Office", + "readOnly": true + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "AssetSystem" + }, + "status": { + "type": "string", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ], + "description": "An asset is considered as `AVAILABLE` if it sent a heartbeat in the past 5 minutes. Respectively, if there \nhasn't been a heartbeat in the past 5 minutes, the asset is considered as `UNAVAILABLE`. In case there isn't\na heartbeat (e.g. in case of a new Asset), the status will be `UNKNOWN`.\n", + "default": "UNKNOWN" + }, + "manufacturer": { + "type": "string", + "example": "TQ-Systems", + "readOnly": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "readOnly": true + }, + "serialNumber": { + "type": "string", + "example": "3cdae5c3c30c53b9", + "readOnly": true + }, + "priority": { + "type": "boolean", + "nullable": true + }, + "lastHeartbeatReceivedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "At what time the last heartbeat was received.", + "nullable": true + }, + "driverVersion": { + "type": "string", + "example": "v1.0.1", + "readOnly": true + }, + "type": { + "type": "string", + "enum": [ + "CONTAINER", + "EVSTATION", + "HEAT_PUMP", + "HEATER", + "INVERTER", + "IO_DEVICE", + "METER", + "UNKNOWN" + ] + }, + "kind": { + "type": "string", + "enum": [ + "BATTERY", + "BTTP", + "CLUSTER", + "CONTAINER", + "EVSTATION", + "FUEL_CELL", + "GRID", + "HEAT_PUMP", + "HEAT_PUMP_EXTERNAL", + "HEATER", + "HEATING", + "HYBRID", + "IO_DEVICE", + "MISC", + "PV", + "PV_EXTERNAL", + "UNKNOWN", + "WIND_TURBINE" + ] + }, + "metadata": { + "example": "\"{\"reverse_flow\": false, \"aux_meter_type\": \"SIMULATION_AUX_METER_TYPE\"}\"" + }, + "networkSettings": { + "description": "Provides information about how to connect to the asset. The data varies depending on the driver.", + "type": "object", + "properties": { + "address": { + "type": "string", + "example": "wss://SMA3009885376.local:4712/ship/" + }, + "port": { + "type": "integer", + "example": 1234, + "minimum": 0, + "maximum": 65535 + } + }, + "x-readme-ref-name": "NetworkSettings" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "system", + "type" + ], + "x-readme-ref-name": "Asset" + }, + "AssetSystem": { + "description": "Minimal information about the System that the Asset belongs to.", + "type": "object", + "readOnly": true, + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "name": { + "type": "string", + "example": "GridBox at Office", + "readOnly": true + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "AssetSystem" + }, + "NetworkSettings": { + "description": "Provides information about how to connect to the asset. The data varies depending on the driver.", + "type": "object", + "properties": { + "address": { + "type": "string", + "example": "wss://SMA3009885376.local:4712/ship/" + }, + "port": { + "type": "integer", + "example": 1234, + "minimum": 0, + "maximum": 65535 + } + }, + "x-readme-ref-name": "NetworkSettings" + }, + "AssetsMetadata": { + "type": "object", + "readOnly": true, + "description": "Provides information about the returned object, such as length of the list and distinct values.", + "properties": { + "counts": { + "type": "object", + "description": "This will only be available if the response is a list or contains multiple items. It provides multiple \n\"counts\" of the list that is being returned.\n", + "properties": { + "total": { + "readOnly": true, + "description": "The total number of objects in the list, regardless of any query parameters such as filtering or \npagination.\n", + "type": "integer", + "example": 321 + }, + "filtered": { + "readOnly": true, + "description": "The number of objects in the list after the filters have been applied. This ignores pagination and will \nshow how many objects are available with the given filters. This number will always be less than or \nequal to the `total` count.\n", + "type": "integer", + "example": 123 + } + } + } + }, + "x-readme-ref-name": "AssetsMetadata" + }, + "AbstractCluster": { + "type": "object", + "properties": { + "priority": { + "description": "The higher the priority, the more energy the appliances will get; a cluster with higher priority will be curtailed least.", + "type": "integer", + "format": "int", + "example": 1 + }, + "name": { + "description": "The cluster's name meant to be displayable to the user.", + "type": "string", + "example": "E Corp HQ" + }, + "strategy": { + "description": "Identifies the specific curtailment approach within the cluster.", + "type": "string", + "enum": [ + "SERIES", + "EQUALLY", + "FIRST_COME_FIRST_SERVE", + "LAST_COME_FIRST_SERVE", + "ROUND_ROBIN", + "AI", + "PROPORTIONAL" + ] + }, + "priorities": { + "description": "Defines the priority for the EMS.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY", + "HEATER", + "EV", + "HEATPUMP" + ] + } + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "integer" + }, + "maxPowerL1": { + "description": "The maximum power in W for phase L1.", + "type": "integer" + }, + "maxPowerL2": { + "description": "The maximum power in W for phase L2.", + "type": "integer" + }, + "maxPowerL3": { + "description": "The maximum power in W for phase L3.", + "type": "integer" + }, + "maxPowerMargin": { + "description": "The maximum power safety margin in W.", + "type": "integer" + }, + "maxPowerMarginL1": { + "description": "The maximum power safety margin in W for phase L1.", + "type": "integer" + }, + "maxPowerMarginL2": { + "description": "The maximum power safety margin in W for phase L2.", + "type": "integer" + }, + "maxPowerMarginL3": { + "description": "The maximum power safety margin in W for phase L3.", + "type": "integer" + }, + "maxPowerWorstCase": { + "description": "The assumed maximum power in W in case of a lost connection.", + "type": "integer" + }, + "maxPowerWorstCaseL1": { + "description": "The assumed maximum power in W in case of a lost connection for phase L1.", + "type": "integer" + }, + "maxPowerWorstCaseL2": { + "description": "The assumed maximum power in W in case of a lost connection for phase L2.", + "type": "integer" + }, + "maxPowerWorstCaseL3": { + "description": "The assumed maximum power in W in case of a lost connection for phase L3.", + "type": "integer" + }, + "dynamicPowerDistribution": { + "description": "Specifies whether dynamic power distribution should be enabled or not.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractCluster" + }, + "AbstractClusterStrict": { + "allOf": [ + { + "type": "object", + "properties": { + "priority": { + "description": "The higher the priority, the more energy the appliances will get; a cluster with higher priority will be curtailed least.", + "type": "integer", + "format": "int", + "example": 1 + }, + "name": { + "description": "The cluster's name meant to be displayable to the user.", + "type": "string", + "example": "E Corp HQ" + }, + "strategy": { + "description": "Identifies the specific curtailment approach within the cluster.", + "type": "string", + "enum": [ + "SERIES", + "EQUALLY", + "FIRST_COME_FIRST_SERVE", + "LAST_COME_FIRST_SERVE", + "ROUND_ROBIN", + "AI", + "PROPORTIONAL" + ] + }, + "priorities": { + "description": "Defines the priority for the EMS.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY", + "HEATER", + "EV", + "HEATPUMP" + ] + } + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "integer" + }, + "maxPowerL1": { + "description": "The maximum power in W for phase L1.", + "type": "integer" + }, + "maxPowerL2": { + "description": "The maximum power in W for phase L2.", + "type": "integer" + }, + "maxPowerL3": { + "description": "The maximum power in W for phase L3.", + "type": "integer" + }, + "maxPowerMargin": { + "description": "The maximum power safety margin in W.", + "type": "integer" + }, + "maxPowerMarginL1": { + "description": "The maximum power safety margin in W for phase L1.", + "type": "integer" + }, + "maxPowerMarginL2": { + "description": "The maximum power safety margin in W for phase L2.", + "type": "integer" + }, + "maxPowerMarginL3": { + "description": "The maximum power safety margin in W for phase L3.", + "type": "integer" + }, + "maxPowerWorstCase": { + "description": "The assumed maximum power in W in case of a lost connection.", + "type": "integer" + }, + "maxPowerWorstCaseL1": { + "description": "The assumed maximum power in W in case of a lost connection for phase L1.", + "type": "integer" + }, + "maxPowerWorstCaseL2": { + "description": "The assumed maximum power in W in case of a lost connection for phase L2.", + "type": "integer" + }, + "maxPowerWorstCaseL3": { + "description": "The assumed maximum power in W in case of a lost connection for phase L3.", + "type": "integer" + }, + "dynamicPowerDistribution": { + "description": "Specifies whether dynamic power distribution should be enabled or not.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractCluster" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "AbstractClusterStrict" + }, + "Cluster": { + "allOf": [ + { + "type": "object", + "properties": { + "priority": { + "description": "The higher the priority, the more energy the appliances will get; a cluster with higher priority will be curtailed least.", + "type": "integer", + "format": "int", + "example": 1 + }, + "name": { + "description": "The cluster's name meant to be displayable to the user.", + "type": "string", + "example": "E Corp HQ" + }, + "strategy": { + "description": "Identifies the specific curtailment approach within the cluster.", + "type": "string", + "enum": [ + "SERIES", + "EQUALLY", + "FIRST_COME_FIRST_SERVE", + "LAST_COME_FIRST_SERVE", + "ROUND_ROBIN", + "AI", + "PROPORTIONAL" + ] + }, + "priorities": { + "description": "Defines the priority for the EMS.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY", + "HEATER", + "EV", + "HEATPUMP" + ] + } + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "integer" + }, + "maxPowerL1": { + "description": "The maximum power in W for phase L1.", + "type": "integer" + }, + "maxPowerL2": { + "description": "The maximum power in W for phase L2.", + "type": "integer" + }, + "maxPowerL3": { + "description": "The maximum power in W for phase L3.", + "type": "integer" + }, + "maxPowerMargin": { + "description": "The maximum power safety margin in W.", + "type": "integer" + }, + "maxPowerMarginL1": { + "description": "The maximum power safety margin in W for phase L1.", + "type": "integer" + }, + "maxPowerMarginL2": { + "description": "The maximum power safety margin in W for phase L2.", + "type": "integer" + }, + "maxPowerMarginL3": { + "description": "The maximum power safety margin in W for phase L3.", + "type": "integer" + }, + "maxPowerWorstCase": { + "description": "The assumed maximum power in W in case of a lost connection.", + "type": "integer" + }, + "maxPowerWorstCaseL1": { + "description": "The assumed maximum power in W in case of a lost connection for phase L1.", + "type": "integer" + }, + "maxPowerWorstCaseL2": { + "description": "The assumed maximum power in W in case of a lost connection for phase L2.", + "type": "integer" + }, + "maxPowerWorstCaseL3": { + "description": "The assumed maximum power in W in case of a lost connection for phase L3.", + "type": "integer" + }, + "dynamicPowerDistribution": { + "description": "Specifies whether dynamic power distribution should be enabled or not.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractCluster" + }, + { + "properties": { + "id": { + "description": "Identifier of the cluster.", + "type": "string", + "format": "uuid", + "readOnly": true + }, + "systemID": { + "description": "Identifier of the system.", + "type": "string", + "format": "uuid" + }, + "createdAt": { + "description": "Time at which the cluster was created in UTC using the ISO 8601 full-time format.", + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the cluster was updated in UTC using the ISO 8601 full-time format.", + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50Z", + "readOnly": true + }, + "dynamicPowerDistribution": { + "default": false + }, + "clusters": { + "description": "Clusters that belong to the cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Cluster" + } + }, + "appliances": { + "description": "Appliances that belong to the cluster.", + "type": "array", + "items": { + "title": "Appliance", + "description": "Appliance represents a monitor-/controllable device such as Inverters,\nMeters and Heat Pumps.\n", + "readOnly": true, + "oneOf": [ + { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "INVERTER": "#/components/schemas/Inverter", + "METER": "#/components/schemas/Meter", + "HEAT_PUMP": "#/components/schemas/HeatPump", + "EVSTATION": "#/components/schemas/EVStation", + "ELECTROLYZER": "#/components/schemas/Electrolyzer", + "IO_DEVICE": "#/components/schemas/IODevice", + "HEATER": "#/components/schemas/Heater", + "CONTAINER": "#/components/schemas/Container" + } + }, + "x-readme-ref-name": "Appliance" + } + } + }, + "required": [ + "id" + ] + } + ], + "x-readme-ref-name": "Cluster" + }, + "ClusterSet": { + "allOf": [ + { + "type": "object", + "properties": { + "priority": { + "description": "The higher the priority, the more energy the appliances will get; a cluster with higher priority will be curtailed least.", + "type": "integer", + "format": "int", + "example": 1 + }, + "name": { + "description": "The cluster's name meant to be displayable to the user.", + "type": "string", + "example": "E Corp HQ" + }, + "strategy": { + "description": "Identifies the specific curtailment approach within the cluster.", + "type": "string", + "enum": [ + "SERIES", + "EQUALLY", + "FIRST_COME_FIRST_SERVE", + "LAST_COME_FIRST_SERVE", + "ROUND_ROBIN", + "AI", + "PROPORTIONAL" + ] + }, + "priorities": { + "description": "Defines the priority for the EMS.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY", + "HEATER", + "EV", + "HEATPUMP" + ] + } + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "integer" + }, + "maxPowerL1": { + "description": "The maximum power in W for phase L1.", + "type": "integer" + }, + "maxPowerL2": { + "description": "The maximum power in W for phase L2.", + "type": "integer" + }, + "maxPowerL3": { + "description": "The maximum power in W for phase L3.", + "type": "integer" + }, + "maxPowerMargin": { + "description": "The maximum power safety margin in W.", + "type": "integer" + }, + "maxPowerMarginL1": { + "description": "The maximum power safety margin in W for phase L1.", + "type": "integer" + }, + "maxPowerMarginL2": { + "description": "The maximum power safety margin in W for phase L2.", + "type": "integer" + }, + "maxPowerMarginL3": { + "description": "The maximum power safety margin in W for phase L3.", + "type": "integer" + }, + "maxPowerWorstCase": { + "description": "The assumed maximum power in W in case of a lost connection.", + "type": "integer" + }, + "maxPowerWorstCaseL1": { + "description": "The assumed maximum power in W in case of a lost connection for phase L1.", + "type": "integer" + }, + "maxPowerWorstCaseL2": { + "description": "The assumed maximum power in W in case of a lost connection for phase L2.", + "type": "integer" + }, + "maxPowerWorstCaseL3": { + "description": "The assumed maximum power in W in case of a lost connection for phase L3.", + "type": "integer" + }, + "dynamicPowerDistribution": { + "description": "Specifies whether dynamic power distribution should be enabled or not.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractCluster" + }, + { + "properties": { + "systemID": { + "description": "Identifier of the system.", + "type": "string", + "format": "uuid" + } + }, + "required": [ + "systemID" + ] + } + ], + "x-readme-ref-name": "ClusterSet" + }, + "ClusterSetStrict": { + "allOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "priority": { + "description": "The higher the priority, the more energy the appliances will get; a cluster with higher priority will be curtailed least.", + "type": "integer", + "format": "int", + "example": 1 + }, + "name": { + "description": "The cluster's name meant to be displayable to the user.", + "type": "string", + "example": "E Corp HQ" + }, + "strategy": { + "description": "Identifies the specific curtailment approach within the cluster.", + "type": "string", + "enum": [ + "SERIES", + "EQUALLY", + "FIRST_COME_FIRST_SERVE", + "LAST_COME_FIRST_SERVE", + "ROUND_ROBIN", + "AI", + "PROPORTIONAL" + ] + }, + "priorities": { + "description": "Defines the priority for the EMS.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY", + "HEATER", + "EV", + "HEATPUMP" + ] + } + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "integer" + }, + "maxPowerL1": { + "description": "The maximum power in W for phase L1.", + "type": "integer" + }, + "maxPowerL2": { + "description": "The maximum power in W for phase L2.", + "type": "integer" + }, + "maxPowerL3": { + "description": "The maximum power in W for phase L3.", + "type": "integer" + }, + "maxPowerMargin": { + "description": "The maximum power safety margin in W.", + "type": "integer" + }, + "maxPowerMarginL1": { + "description": "The maximum power safety margin in W for phase L1.", + "type": "integer" + }, + "maxPowerMarginL2": { + "description": "The maximum power safety margin in W for phase L2.", + "type": "integer" + }, + "maxPowerMarginL3": { + "description": "The maximum power safety margin in W for phase L3.", + "type": "integer" + }, + "maxPowerWorstCase": { + "description": "The assumed maximum power in W in case of a lost connection.", + "type": "integer" + }, + "maxPowerWorstCaseL1": { + "description": "The assumed maximum power in W in case of a lost connection for phase L1.", + "type": "integer" + }, + "maxPowerWorstCaseL2": { + "description": "The assumed maximum power in W in case of a lost connection for phase L2.", + "type": "integer" + }, + "maxPowerWorstCaseL3": { + "description": "The assumed maximum power in W in case of a lost connection for phase L3.", + "type": "integer" + }, + "dynamicPowerDistribution": { + "description": "Specifies whether dynamic power distribution should be enabled or not.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractCluster" + }, + { + "properties": { + "systemID": { + "description": "Identifier of the system.", + "type": "string", + "format": "uuid" + } + }, + "required": [ + "systemID" + ] + } + ], + "x-readme-ref-name": "ClusterSet" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ClusterSetStrict" + }, + "ApplianceConnectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "ApplianceStatus": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "ApplianceType": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "ApplianceInactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "ApplianceName": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "ApplianceReverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "ApplianceRoom": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "ApplianceSerialNumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "Network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "ApplianceParent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "LoadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "AbstractSensorSettings": { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + "SensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "Source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "CommissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "ApplianceState": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "StateTransition": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + }, + "AbstractState": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + "State": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "AbstractEnergyManagementSettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + "EnergyManagementSettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "AbstractCryptoSetting": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + "CryptoSetting": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + }, + "BaseAppliance": { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + "InverterKind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "AbstractBatteryInformation": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + "AbstractInverter": { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + "HardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "BatteryInformation": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + }, + "Inverter": { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + "AbstractMeter": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + "MeterKind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "Meter": { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + "AbstractHeatPumpInformation": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + "AbstractHeatPump": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + "HeatPumpInformation": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + }, + "HeatPump": { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + "EVSEID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "EVLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + }, + "AbstractEVStation": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + }, + "EVStation": { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + "AbstractElectrolyzer": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + }, + "Electrolyzer": { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + "IODeviceInputAction": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + }, + "IODeviceInputChannel": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + }, + "IODeviceOutputActionSGReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + }, + "IODeviceOutputAction": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + }, + "IODeviceOutputChannel": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + }, + "AbstractIODeviceInformation": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + "AbstractIODevice": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + "IODeviceInformation": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + }, + "IODevice": { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + "AbstractHeater": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + "Heater": { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + "AbstractContainer": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + "Container": { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + }, + "Appliance": { + "title": "Appliance", + "description": "Appliance represents a monitor-/controllable device such as Inverters,\nMeters and Heat Pumps.\n", + "readOnly": true, + "oneOf": [ + { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "INVERTER": "#/components/schemas/Inverter", + "METER": "#/components/schemas/Meter", + "HEAT_PUMP": "#/components/schemas/HeatPump", + "EVSTATION": "#/components/schemas/EVStation", + "ELECTROLYZER": "#/components/schemas/Electrolyzer", + "IO_DEVICE": "#/components/schemas/IODevice", + "HEATER": "#/components/schemas/Heater", + "CONTAINER": "#/components/schemas/Container" + } + }, + "x-readme-ref-name": "Appliance" + }, + "Message": { + "title": "Message", + "description": "Message represents a string.", + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "Message" + }, + "AuthEvent": { + "title": "AuthEvent", + "description": "AuthEvent represents auth events such as login, password reset.", + "type": "object", + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "type": { + "type": "string" + }, + "ip": { + "type": "string", + "format": "ip", + "example": "192.168.178.153", + "description": "IP is the IP address of the person who created the event" + } + }, + "x-readme-ref-name": "AuthEvent" + }, + "CustomerAccount": { + "title": "Customer Account", + "description": "Represents an end-customer account.", + "type": "object", + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + { + "properties": { + "kind": { + "example": "end-user" + } + } + } + ], + "x-readme-ref-name": "CustomerAccount" + }, + "UnauthorizedException": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Unauthorized", + "description": "The client isn't authorized to access the requested resource.", + "example": { + "message": "Unauthorized" + } + } + ], + "x-readme-ref-name": "UnauthorizedException" + }, + "CustomerAccountUpdate": { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "CustomerAccountUpdate" + }, + "CustomerAccountUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "customization": { + "description": "Customization can be used to store arbitrary data." + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + } + } + } + ], + "x-readme-ref-name": "CustomerAccountUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "CustomerAccountUpdateStrict" + }, + "GSPs": { + "description": "List of GSP features.", + "type": "array", + "items": { + "description": "GSP-feature.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enabled is true if the GSP-feature is enabled" + }, + "feature": { + "type": "string", + "description": "Name of the GSP-feature.", + "enum": [ + "14a-lpc" + ], + "x-readme-ref-name": "GSPFeature" + } + }, + "required": [ + "enabled", + "feature" + ], + "x-readme-ref-name": "GSP" + }, + "x-readme-ref-name": "GSPs" + }, + "GSP": { + "description": "GSP-feature.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enabled is true if the GSP-feature is enabled" + }, + "feature": { + "type": "string", + "description": "Name of the GSP-feature.", + "enum": [ + "14a-lpc" + ], + "x-readme-ref-name": "GSPFeature" + } + }, + "required": [ + "enabled", + "feature" + ], + "x-readme-ref-name": "GSP" + }, + "GSPFeature": { + "type": "string", + "description": "Name of the GSP-feature.", + "enum": [ + "14a-lpc" + ], + "x-readme-ref-name": "GSPFeature" + }, + "GSP14ASignal": { + "description": "GSP 14A signal status for a GSP-feature.", + "type": "object", + "properties": { + "consumptionPowerLimit": { + "type": "integer", + "example": 57000000, + "description": "Value of the current consumption power limit set by the grid control box in mW, null means no power limit.", + "nullable": true + }, + "receivedFromDSO": { + "type": "string", + "example": "2024-09-11T12:19:52Z", + "format": "date-time", + "description": "The time at which the GSP 14A signal was received at from DSO, in UTC using the ISO 8601 full-time format.", + "nullable": true + }, + "validUntil": { + "type": "string", + "example": "2024-09-11T12:19:52Z", + "format": "date-time", + "description": "The time the GSP 14A signal is valid until, null means valid indefinitely, in UTC using the ISO 8601 full-time format.", + "nullable": true + }, + "sentByGridBox": { + "type": "string", + "example": "2024-09-11T12:19:52Z", + "format": "date-time", + "description": "The time at which the GSP 14A event was sent to us by the GridBox, in UTC using the ISO 8601 full-time format." + }, + "lpcServerState": { + "type": "string", + "description": "The current state of connection between the GridBox with the device serving the consumptionPowerLimit.", + "enum": [ + "INIT", + "LIMITED", + "UNLIMITED_CONTROLLED", + "UNLIMITED_AUTONOMOUS", + "FAILSAFE" + ] + } + }, + "required": [ + "consumptionPowerLimit", + "receivedFromDSO", + "validUntil", + "sentByGridBox", + "lpcServerState" + ], + "x-readme-ref-name": "GSP14ASignal" + }, + "AssetFeatures": { + "description": "Asset GSP features.", + "type": "array", + "items": { + "description": "Asset GSP feature.", + "type": "object", + "properties": { + "assetID": { + "description": "Unique identifier of an asset.", + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd" + }, + "features": { + "type": "array", + "items": { + "description": "GSP-feature.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enabled is true if the GSP-feature is enabled" + }, + "feature": { + "type": "string", + "description": "Name of the GSP-feature.", + "enum": [ + "14a-lpc" + ], + "x-readme-ref-name": "GSPFeature" + } + }, + "required": [ + "enabled", + "feature" + ], + "x-readme-ref-name": "GSP" + } + } + }, + "x-readme-ref-name": "AssetFeature" + }, + "x-readme-ref-name": "AssetFeatures" + }, + "AssetFeature": { + "description": "Asset GSP feature.", + "type": "object", + "properties": { + "assetID": { + "description": "Unique identifier of an asset.", + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd" + }, + "features": { + "type": "array", + "items": { + "description": "GSP-feature.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enabled is true if the GSP-feature is enabled" + }, + "feature": { + "type": "string", + "description": "Name of the GSP-feature.", + "enum": [ + "14a-lpc" + ], + "x-readme-ref-name": "GSPFeature" + } + }, + "required": [ + "enabled", + "feature" + ], + "x-readme-ref-name": "GSP" + } + } + }, + "x-readme-ref-name": "AssetFeature" + }, + "GSPFeatureEnabledStrict": { + "description": "GSP en/disablement.", + "type": "object", + "properties": { + "enabled": { + "description": "En/disables a GSP-feature.", + "type": "boolean", + "example": true + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "x-readme-ref-name": "GSPFeatureEnabledStrict" + }, + "GSPAssetIDsStrict": { + "description": "Array of Asset IDs.", + "type": "object", + "properties": { + "assetIDs": { + "description": "Array of Asset IDs", + "type": "array", + "items": { + "type": "string", + "example": "4ef41512-8445-4b90-aa53-8f8549b3f4bd" + } + } + }, + "required": [ + "assetIDs" + ], + "additionalProperties": false, + "x-readme-ref-name": "GSPAssetIDsStrict" + }, + "AbstractImportPowerLimit": { + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + }, + "x-readme-ref-name": "AbstractImportPowerLimit" + }, + "ImportPowerLimit": { + "allOf": [ + { + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + }, + "x-readme-ref-name": "AbstractImportPowerLimit" + }, + { + "properties": { + "internalDeviceID": { + "type": "string", + "description": "Unique ID to identify the gateway the import power limit belongs to.", + "example": "aeb639cf0793e81f0804c6647af7f0900a847921c0596726f1afdfd04a3a3186", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the import power limit was updated in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "numberOfPhases", + "internalDeviceID", + "createdAt", + "updatedAt", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "importEVMarginTotal", + "importEVMarginPhase", + "maxImportEVMarginL1", + "maxImportEVMarginL2", + "maxImportEVMarginL3", + "maxImportEVWorstCase", + "maxImportEVWorstCaseL1", + "maxImportEVWorstCaseL2", + "maxImportEVWorstCaseL3" + ] + } + ], + "x-readme-ref-name": "ImportPowerLimit" + }, + "ImportPowerLimitSet": { + "title": "Import power limit", + "type": "object", + "properties": { + "numberOfPhases": { + "type": "integer", + "description": "Number of phases the import power limit is set for. 1 or 3. Default is 3.", + "enum": [ + 1, + 3 + ], + "example": 3, + "default": 3, + "format": "int32" + }, + "maxImportTotal": { + "type": "integer", + "description": "Maximum total import power in W.", + "format": "int64" + }, + "maxImportL1": { + "type": "integer", + "description": "Maximum total import power in the first phase in W.", + "format": "int64" + }, + "maxImportL2": { + "type": "integer", + "description": "Maximum total import power in the second phase in W.", + "format": "int64" + }, + "maxImportL3": { + "type": "integer", + "description": "Maximum total import power in the third phase in W.", + "format": "int64" + }, + "importEVMarginTotal": { + "type": "integer", + "format": "int64" + }, + "importEVMarginPhase": { + "type": "integer", + "format": "int64" + }, + "maxImportEVMarginL1": { + "type": "integer", + "description": "Maximum import power margin in the first phase in W.", + "format": "int64" + }, + "maxImportEVMarginL2": { + "type": "integer", + "description": "Maximum import power margin in the second phase in W.", + "format": "int64" + }, + "maxImportEVMarginL3": { + "type": "integer", + "description": "Maximum import power margin in the third phase in W.", + "format": "int64" + }, + "maxImportEVWorstCase": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost.", + "format": "int64" + }, + "maxImportEVWorstCaseL1": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the first phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL2": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the second phase.", + "format": "int64" + }, + "maxImportEVWorstCaseL3": { + "type": "integer", + "description": "The assumed maximum charging power in W for all EVs in case the connection to the grid connection point is lost for the third phase.", + "format": "int64" + } + }, + "x-readme-ref-name": "AbstractImportPowerLimit" + }, + "PowerLimitDynamic": { + "title": "Import power limits stored with the dynamic API.", + "type": "object", + "properties": { + "maxImportMeasuredTimestamp": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "maxImportTotal": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in mW." + }, + "maxImportL1": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the first phase in mW." + }, + "maxImportL2": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the second phase in mW." + }, + "maxImportL3": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the third phase in mW." + }, + "maxImportEvMarginTotal": { + "type": "integer", + "format": "int64", + "description": "maxImportTotal - importEVMarginTotal is the maximum import power considered in total in mW." + }, + "maxImportEvMarginL1": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the first phase in mW." + }, + "maxImportEvMarginL2": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the second phase in mW." + }, + "maxImportEvMarginL3": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the third phase in mW." + }, + "maxImportEvMarginWorstCaseTotal": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost." + }, + "maxImportEvMarginWorstCaseL1": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the first phase." + }, + "maxImportEvMarginWorstCaseL2": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the second phase." + }, + "maxImportEvMarginWorstCaseL3": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the third phase." + } + }, + "required": [ + "maxImportMeasuredTimestamp", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "maxImportEvMarginTotal", + "maxImportEvMarginL1", + "maxImportEvMarginL2", + "maxImportEvMarginL3", + "maxImportEvMarginWorstCaseTotal", + "maxImportEvMarginWorstCaseL1", + "maxImportEvMarginWorstCaseL2", + "maxImportEvMarginWorstCaseL3" + ], + "x-readme-ref-name": "PowerLimitDynamic" + }, + "HistoricalPowerLimits": { + "title": "Historical import power limit", + "type": "object", + "properties": { + "systemID": { + "type": "string", + "format": "uuid", + "description": "Unique ID to identify the system the import power limits belong to.", + "readOnly": true, + "example": "512654ea-5328-4c79-8ed7-b4136aa31679" + }, + "data": { + "type": "array", + "items": { + "title": "Import power limits stored with the dynamic API.", + "type": "object", + "properties": { + "maxImportMeasuredTimestamp": { + "type": "string", + "description": "Time at which the import power limit was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "maxImportTotal": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in mW." + }, + "maxImportL1": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the first phase in mW." + }, + "maxImportL2": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the second phase in mW." + }, + "maxImportL3": { + "type": "integer", + "format": "int64", + "description": "Maximum total import power in the third phase in mW." + }, + "maxImportEvMarginTotal": { + "type": "integer", + "format": "int64", + "description": "maxImportTotal - importEVMarginTotal is the maximum import power considered in total in mW." + }, + "maxImportEvMarginL1": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the first phase in mW." + }, + "maxImportEvMarginL2": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the second phase in mW." + }, + "maxImportEvMarginL3": { + "type": "integer", + "format": "int64", + "description": "Maximum import power margin in the third phase in mW." + }, + "maxImportEvMarginWorstCaseTotal": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost." + }, + "maxImportEvMarginWorstCaseL1": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the first phase." + }, + "maxImportEvMarginWorstCaseL2": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the second phase." + }, + "maxImportEvMarginWorstCaseL3": { + "type": "integer", + "format": "int64", + "description": "The assumed maximum charging power in mW for all EVs in case the connection to the grid connection point is lost for the third phase." + } + }, + "required": [ + "maxImportMeasuredTimestamp", + "maxImportTotal", + "maxImportL1", + "maxImportL2", + "maxImportL3", + "maxImportEvMarginTotal", + "maxImportEvMarginL1", + "maxImportEvMarginL2", + "maxImportEvMarginL3", + "maxImportEvMarginWorstCaseTotal", + "maxImportEvMarginWorstCaseL1", + "maxImportEvMarginWorstCaseL2", + "maxImportEvMarginWorstCaseL3" + ], + "x-readme-ref-name": "PowerLimitDynamic" + } + } + }, + "required": [ + "systemID", + "data" + ], + "x-readme-ref-name": "HistoricalPowerLimits" + }, + "GridConnectionPointForecasts": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the validity period for the forecast.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T22:10:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the validity period for the forecast.\n" + }, + "periods": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "importActivePower": { + "type": "number", + "description": "The forecasted import active power in Watts.\n" + }, + "exportActivePower": { + "type": "number", + "description": "The forecasted export active power in Watts.\n" + } + }, + "x-readme-ref-name": "GridConnectionPointPeriod" + } + }, + "lastUpdated": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Last time when the forecast was updated.\n" + } + }, + "x-readme-ref-name": "GridConnectionPointForecasts" + }, + "GridConnectionPointPeriod": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "importActivePower": { + "type": "number", + "description": "The forecasted import active power in Watts.\n" + }, + "exportActivePower": { + "type": "number", + "description": "The forecasted export active power in Watts.\n" + } + }, + "x-readme-ref-name": "GridConnectionPointPeriod" + }, + "StatusHistory": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the validity period for the status history.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T22:10:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the validity period for the status history.\n" + }, + "periods": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "status": { + "type": "string", + "enum": [ + "ONLINE", + "SUBOPTIMAL", + "OFFLINE", + "DISABLED", + "INITIALIZING" + ], + "example": "ONLINE", + "description": "Operational status of Time-of-Use for a specific run.\n\n* `ONLINE` - Time-of-Use optimization is running successfully.\n* `SUBOPTIMAL` - Time-of-Use optimization is running suboptimally.\n* `OFFLINE` - Time-of-Use optimization failed.\n* `DISABLED` - Time-of-Use optimization is disabled for the system.\n* `INITIALIZING` - Time-of-Use optimization is initializing, it may take up to 48h.\n", + "x-readme-ref-name": "StatusValue" + }, + "error_code": { + "type": "string", + "enum": [ + "STATIC_PRICES", + "MISSING_PRICES", + "INCOMPLETE_PRICES", + "MISSING_APPLIANCES", + "MISSING_GRID_METER", + "MULTIPLE_GRID_METERS", + "MULTIPLE_BATTERIES", + "MULTIPLE_EVCS", + "MULTIPLE_HEAT_PUMPS", + "MULTIPLE_PVS_CURTAILMENT", + "MISSING_CONTROLLABLE_APPLIANCE", + "OFFLINE_APPLIANCE", + "EMS_NOT_ENABLED", + "EMS_CONSENT_NOT_GIVEN", + "UNKNOWN_INVERTER", + "INTERNAL_ERROR" + ], + "example": "INTERNAL_ERROR", + "description": "Most recent error causing a failure of Time-of-Use specific run.\n* `STATIC_PRICES` - Time-of-Use failing due to import and export prices are constant.\n* `MISSING_PRICES` - Time-of-Use failing due to missing import and export prices.\n* `INCOMPLETE_PRICES` - Time-of-Use failing due to incomplete import and export prices.\n* `MISSING_APPLIANCES` - Time-of-Use failing due to missing appliances in a system.\n* `MISSING_GRID_METER` - Time-of-Use failing due to missing grid meter.\n* `MULTIPLE_GRID_METERS` - Time-of-Use failing due to multiple grid meters within a system.\n* `MULTIPLE_BATTERIES` - Time-of-Use failing due to multiple batteries within a system.\n* `MULTIPLE_EVCS` - Time-of-Use failing due to multiple EV charging stations within a system.\n* `MULTIPLE_HEAT_PUMPS` - Time-of-Use failing due to multiple heat pumps within a system.\n* `MULTIPLE_PVS_CURTAILMENT` - Time-of-Use failing due to multiple PVs within a system with PV curtailment enabled.\n* `MISSING_CONTROLLABLE_APPLIANCE` - Time-of-Use failing due to missing controllable device (battery, EV or heat pump).\n* `OFFLINE_APPLIANCE` - Time-of-Use failing due to an offline appliance.\n* `EMS_NOT_ENABLED` - Time-of-Use failing due to energy management not being enabled on the system.\n* `EMS_CONSENT_NOT_GIVEN` - Time-of-Use failing due to consent to energy management not being given for the system.\n* `UNKNOWN_INVERTER` - Time-of-Use failing due to an unknown inverter.\n* `INTERNAL_ERROR` - Time-of-Use failing due to an unknown, internal issue.\n", + "x-readme-ref-name": "ToUErrorCode" + }, + "warnings": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "MISSING_EV_CONFIG", + "MISSING_EV_PROFILE", + "UNSUPPORTED_CHARGE_MODE_QUICK", + "UNSUPPORTED_CHARGE_MODE_SURPLUS", + "UNSUPPORTED_CHARGE_MODE_SAFETY", + "UNSUPPORTED_CHARGE_MODE_UNKNOWN" + ] + }, + "example": [ + "MISSING_EV_CONFIG" + ], + "description": "All the relevant warnings that occurred during a Time-of-Use specific run.\n\n* `MISSING_EV_CONFIG` - Time-of-Use not working optimally due to missing EV configuration.\n* `MISSING_EV_PROFILE` - Time-of-Use not working optimally due to missing EV profile.\n* `UNSUPPORTED_CHARGE_MODE_QUICK` - Time-of-Use not working optimally due to EV set to Quick Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SURPLUS` - Time-of-Use not working optimally due to EV set to Surplus Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SAFETY` - Time-of-Use not working optimally due to EV set to Safety Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_UNKNOWN` - Time-of-Use not working optimally due to EV set to unknown charge mode.\n", + "x-readme-ref-name": "ToUWarnings" + } + }, + "x-readme-ref-name": "RunStatus" + }, + "x-readme-ref-name": "RunStatuses" + } + }, + "x-readme-ref-name": "StatusHistory" + }, + "RunStatuses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "status": { + "type": "string", + "enum": [ + "ONLINE", + "SUBOPTIMAL", + "OFFLINE", + "DISABLED", + "INITIALIZING" + ], + "example": "ONLINE", + "description": "Operational status of Time-of-Use for a specific run.\n\n* `ONLINE` - Time-of-Use optimization is running successfully.\n* `SUBOPTIMAL` - Time-of-Use optimization is running suboptimally.\n* `OFFLINE` - Time-of-Use optimization failed.\n* `DISABLED` - Time-of-Use optimization is disabled for the system.\n* `INITIALIZING` - Time-of-Use optimization is initializing, it may take up to 48h.\n", + "x-readme-ref-name": "StatusValue" + }, + "error_code": { + "type": "string", + "enum": [ + "STATIC_PRICES", + "MISSING_PRICES", + "INCOMPLETE_PRICES", + "MISSING_APPLIANCES", + "MISSING_GRID_METER", + "MULTIPLE_GRID_METERS", + "MULTIPLE_BATTERIES", + "MULTIPLE_EVCS", + "MULTIPLE_HEAT_PUMPS", + "MULTIPLE_PVS_CURTAILMENT", + "MISSING_CONTROLLABLE_APPLIANCE", + "OFFLINE_APPLIANCE", + "EMS_NOT_ENABLED", + "EMS_CONSENT_NOT_GIVEN", + "UNKNOWN_INVERTER", + "INTERNAL_ERROR" + ], + "example": "INTERNAL_ERROR", + "description": "Most recent error causing a failure of Time-of-Use specific run.\n* `STATIC_PRICES` - Time-of-Use failing due to import and export prices are constant.\n* `MISSING_PRICES` - Time-of-Use failing due to missing import and export prices.\n* `INCOMPLETE_PRICES` - Time-of-Use failing due to incomplete import and export prices.\n* `MISSING_APPLIANCES` - Time-of-Use failing due to missing appliances in a system.\n* `MISSING_GRID_METER` - Time-of-Use failing due to missing grid meter.\n* `MULTIPLE_GRID_METERS` - Time-of-Use failing due to multiple grid meters within a system.\n* `MULTIPLE_BATTERIES` - Time-of-Use failing due to multiple batteries within a system.\n* `MULTIPLE_EVCS` - Time-of-Use failing due to multiple EV charging stations within a system.\n* `MULTIPLE_HEAT_PUMPS` - Time-of-Use failing due to multiple heat pumps within a system.\n* `MULTIPLE_PVS_CURTAILMENT` - Time-of-Use failing due to multiple PVs within a system with PV curtailment enabled.\n* `MISSING_CONTROLLABLE_APPLIANCE` - Time-of-Use failing due to missing controllable device (battery, EV or heat pump).\n* `OFFLINE_APPLIANCE` - Time-of-Use failing due to an offline appliance.\n* `EMS_NOT_ENABLED` - Time-of-Use failing due to energy management not being enabled on the system.\n* `EMS_CONSENT_NOT_GIVEN` - Time-of-Use failing due to consent to energy management not being given for the system.\n* `UNKNOWN_INVERTER` - Time-of-Use failing due to an unknown inverter.\n* `INTERNAL_ERROR` - Time-of-Use failing due to an unknown, internal issue.\n", + "x-readme-ref-name": "ToUErrorCode" + }, + "warnings": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "MISSING_EV_CONFIG", + "MISSING_EV_PROFILE", + "UNSUPPORTED_CHARGE_MODE_QUICK", + "UNSUPPORTED_CHARGE_MODE_SURPLUS", + "UNSUPPORTED_CHARGE_MODE_SAFETY", + "UNSUPPORTED_CHARGE_MODE_UNKNOWN" + ] + }, + "example": [ + "MISSING_EV_CONFIG" + ], + "description": "All the relevant warnings that occurred during a Time-of-Use specific run.\n\n* `MISSING_EV_CONFIG` - Time-of-Use not working optimally due to missing EV configuration.\n* `MISSING_EV_PROFILE` - Time-of-Use not working optimally due to missing EV profile.\n* `UNSUPPORTED_CHARGE_MODE_QUICK` - Time-of-Use not working optimally due to EV set to Quick Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SURPLUS` - Time-of-Use not working optimally due to EV set to Surplus Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SAFETY` - Time-of-Use not working optimally due to EV set to Safety Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_UNKNOWN` - Time-of-Use not working optimally due to EV set to unknown charge mode.\n", + "x-readme-ref-name": "ToUWarnings" + } + }, + "x-readme-ref-name": "RunStatus" + }, + "x-readme-ref-name": "RunStatuses" + }, + "RunStatus": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:15:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "status": { + "type": "string", + "enum": [ + "ONLINE", + "SUBOPTIMAL", + "OFFLINE", + "DISABLED", + "INITIALIZING" + ], + "example": "ONLINE", + "description": "Operational status of Time-of-Use for a specific run.\n\n* `ONLINE` - Time-of-Use optimization is running successfully.\n* `SUBOPTIMAL` - Time-of-Use optimization is running suboptimally.\n* `OFFLINE` - Time-of-Use optimization failed.\n* `DISABLED` - Time-of-Use optimization is disabled for the system.\n* `INITIALIZING` - Time-of-Use optimization is initializing, it may take up to 48h.\n", + "x-readme-ref-name": "StatusValue" + }, + "error_code": { + "type": "string", + "enum": [ + "STATIC_PRICES", + "MISSING_PRICES", + "INCOMPLETE_PRICES", + "MISSING_APPLIANCES", + "MISSING_GRID_METER", + "MULTIPLE_GRID_METERS", + "MULTIPLE_BATTERIES", + "MULTIPLE_EVCS", + "MULTIPLE_HEAT_PUMPS", + "MULTIPLE_PVS_CURTAILMENT", + "MISSING_CONTROLLABLE_APPLIANCE", + "OFFLINE_APPLIANCE", + "EMS_NOT_ENABLED", + "EMS_CONSENT_NOT_GIVEN", + "UNKNOWN_INVERTER", + "INTERNAL_ERROR" + ], + "example": "INTERNAL_ERROR", + "description": "Most recent error causing a failure of Time-of-Use specific run.\n* `STATIC_PRICES` - Time-of-Use failing due to import and export prices are constant.\n* `MISSING_PRICES` - Time-of-Use failing due to missing import and export prices.\n* `INCOMPLETE_PRICES` - Time-of-Use failing due to incomplete import and export prices.\n* `MISSING_APPLIANCES` - Time-of-Use failing due to missing appliances in a system.\n* `MISSING_GRID_METER` - Time-of-Use failing due to missing grid meter.\n* `MULTIPLE_GRID_METERS` - Time-of-Use failing due to multiple grid meters within a system.\n* `MULTIPLE_BATTERIES` - Time-of-Use failing due to multiple batteries within a system.\n* `MULTIPLE_EVCS` - Time-of-Use failing due to multiple EV charging stations within a system.\n* `MULTIPLE_HEAT_PUMPS` - Time-of-Use failing due to multiple heat pumps within a system.\n* `MULTIPLE_PVS_CURTAILMENT` - Time-of-Use failing due to multiple PVs within a system with PV curtailment enabled.\n* `MISSING_CONTROLLABLE_APPLIANCE` - Time-of-Use failing due to missing controllable device (battery, EV or heat pump).\n* `OFFLINE_APPLIANCE` - Time-of-Use failing due to an offline appliance.\n* `EMS_NOT_ENABLED` - Time-of-Use failing due to energy management not being enabled on the system.\n* `EMS_CONSENT_NOT_GIVEN` - Time-of-Use failing due to consent to energy management not being given for the system.\n* `UNKNOWN_INVERTER` - Time-of-Use failing due to an unknown inverter.\n* `INTERNAL_ERROR` - Time-of-Use failing due to an unknown, internal issue.\n", + "x-readme-ref-name": "ToUErrorCode" + }, + "warnings": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "MISSING_EV_CONFIG", + "MISSING_EV_PROFILE", + "UNSUPPORTED_CHARGE_MODE_QUICK", + "UNSUPPORTED_CHARGE_MODE_SURPLUS", + "UNSUPPORTED_CHARGE_MODE_SAFETY", + "UNSUPPORTED_CHARGE_MODE_UNKNOWN" + ] + }, + "example": [ + "MISSING_EV_CONFIG" + ], + "description": "All the relevant warnings that occurred during a Time-of-Use specific run.\n\n* `MISSING_EV_CONFIG` - Time-of-Use not working optimally due to missing EV configuration.\n* `MISSING_EV_PROFILE` - Time-of-Use not working optimally due to missing EV profile.\n* `UNSUPPORTED_CHARGE_MODE_QUICK` - Time-of-Use not working optimally due to EV set to Quick Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SURPLUS` - Time-of-Use not working optimally due to EV set to Surplus Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SAFETY` - Time-of-Use not working optimally due to EV set to Safety Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_UNKNOWN` - Time-of-Use not working optimally due to EV set to unknown charge mode.\n", + "x-readme-ref-name": "ToUWarnings" + } + }, + "x-readme-ref-name": "RunStatus" + }, + "StatusValue": { + "type": "string", + "enum": [ + "ONLINE", + "SUBOPTIMAL", + "OFFLINE", + "DISABLED", + "INITIALIZING" + ], + "example": "ONLINE", + "description": "Operational status of Time-of-Use for a specific run.\n\n* `ONLINE` - Time-of-Use optimization is running successfully.\n* `SUBOPTIMAL` - Time-of-Use optimization is running suboptimally.\n* `OFFLINE` - Time-of-Use optimization failed.\n* `DISABLED` - Time-of-Use optimization is disabled for the system.\n* `INITIALIZING` - Time-of-Use optimization is initializing, it may take up to 48h.\n", + "x-readme-ref-name": "StatusValue" + }, + "KPIHistory": { + "type": "object", + "properties": { + "periods": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-22T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "touCost": { + "type": "number", + "description": "ToU cost for the requested interval.\n" + }, + "touCostCurrency": { + "type": "string", + "description": "A currency for a ToU cost for the requested interval.\n" + }, + "ssoCost": { + "type": "number", + "description": "SSO cost for the requested interval.\n" + }, + "ssoCostCurrency": { + "type": "string", + "description": "A currency for a SSO cost for the requested interval.\n" + }, + "errorCode": { + "type": "string", + "description": "Error code describing the reason of a failed saving calculation run.\n" + } + }, + "description": "Time-of-Use KPI record.\n", + "x-readme-ref-name": "KPI" + }, + "description": "Time-of-Use KPI collection.\n", + "x-readme-ref-name": "KPIs" + } + }, + "description": "Time-of-Use KPI history for the system for which the request is made.\n", + "x-readme-ref-name": "KPIHistory" + }, + "KPIs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-22T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "touCost": { + "type": "number", + "description": "ToU cost for the requested interval.\n" + }, + "touCostCurrency": { + "type": "string", + "description": "A currency for a ToU cost for the requested interval.\n" + }, + "ssoCost": { + "type": "number", + "description": "SSO cost for the requested interval.\n" + }, + "ssoCostCurrency": { + "type": "string", + "description": "A currency for a SSO cost for the requested interval.\n" + }, + "errorCode": { + "type": "string", + "description": "Error code describing the reason of a failed saving calculation run.\n" + } + }, + "description": "Time-of-Use KPI record.\n", + "x-readme-ref-name": "KPI" + }, + "description": "Time-of-Use KPI collection.\n", + "x-readme-ref-name": "KPIs" + }, + "KPI": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the beginning of the period.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-22T00:00:00Z", + "description": "Timestamp in RFC3339 format that marks the end of the period.\n" + }, + "touCost": { + "type": "number", + "description": "ToU cost for the requested interval.\n" + }, + "touCostCurrency": { + "type": "string", + "description": "A currency for a ToU cost for the requested interval.\n" + }, + "ssoCost": { + "type": "number", + "description": "SSO cost for the requested interval.\n" + }, + "ssoCostCurrency": { + "type": "string", + "description": "A currency for a SSO cost for the requested interval.\n" + }, + "errorCode": { + "type": "string", + "description": "Error code describing the reason of a failed saving calculation run.\n" + } + }, + "description": "Time-of-Use KPI record.\n", + "x-readme-ref-name": "KPI" + }, + "SystemCreate": { + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "type": "object", + "properties": { + "priorities": { + "readOnly": true + }, + "curtailmentStrategy": { + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "SystemCreate" + }, + "SystemCreateStrict": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "type": "object", + "properties": { + "priorities": { + "readOnly": true + }, + "curtailmentStrategy": { + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "SystemCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemCreateStrict" + }, + "SystemUpdate": { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "type": "object", + "properties": { + "productOption": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + } + } + } + } + ], + "x-readme-ref-name": "SystemUpdate" + }, + "SystemUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "type": "object", + "properties": { + "productOption": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + } + } + } + } + ], + "x-readme-ref-name": "SystemUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "SystemUpdateStrict" + }, + "GatewayWithSystem": { + "allOf": [ + { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + }, + { + "properties": { + "system": { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + } + } + } + ], + "x-readme-ref-name": "GatewayWithSystem" + }, + "GatewayUpdate": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "name": { + "nullable": true + } + } + } + ], + "x-readme-ref-name": "GatewayUpdate" + }, + "GatewayUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "name": { + "nullable": true + } + } + } + ], + "x-readme-ref-name": "GatewayUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "GatewayUpdateStrict" + }, + "GatewayCreate": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-Z0-9]{16}$" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + } + }, + "required": [ + "startcode" + ] + } + ], + "x-readme-ref-name": "GatewayCreate" + }, + "GatewayCreateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-Z0-9]{16}$" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + } + }, + "required": [ + "startcode" + ] + } + ], + "x-readme-ref-name": "GatewayCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "GatewayCreateStrict" + }, + "Scanner": { + "title": "Scanner", + "description": "Represents a scanner within a scan.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a scanner.", + "type": "string", + "format": "uuid", + "example": "7992f38a-df67-49d9-9f2f-98c63015a20c" + }, + "name": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + }, + "startedAt": { + "description": "The time at which the scan has started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "The time at which the scan has finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id", + "name", + "startedAt", + "finishedAt" + ], + "x-readme-ref-name": "Scanner" + }, + "Scan": { + "title": "Scan", + "description": "Represents a group of scanners than have to run on a specific gridbox.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a scan.", + "type": "string", + "format": "uuid", + "example": "9ee88ee2-49f4-434d-a96f-67aca96aaa0a" + }, + "startedAt": { + "description": "The time at which the scan has started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "The time at which the scan has finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "scanners": { + "description": "Represents a list of scanners that have to run.", + "type": "array", + "items": { + "title": "Scanner", + "description": "Represents a scanner within a scan.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a scanner.", + "type": "string", + "format": "uuid", + "example": "7992f38a-df67-49d9-9f2f-98c63015a20c" + }, + "name": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + }, + "startedAt": { + "description": "The time at which the scan has started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "The time at which the scan has finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id", + "name", + "startedAt", + "finishedAt" + ], + "x-readme-ref-name": "Scanner" + } + }, + "appliances": { + "description": "Represents a list of appliances that have been detected during a scan.", + "type": "array", + "items": { + "title": "Appliance", + "description": "Appliance represents a monitor-/controllable device such as Inverters,\nMeters and Heat Pumps.\n", + "readOnly": true, + "oneOf": [ + { + "title": "Inverter", + "description": "Inverter represents a monitor-/controllable inverter. It can be of kind:\n- `PV`/`PV_EXTERNAL`: used as photovoltaic only.\n- `BATTERY`: used as battery only.\n- `HYBRID`: used as both photovoltaic and battery.\n- `UNKNOWN`: default, when the inverter kind is not determined.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "enum": [ + "INVERTER" + ], + "type": "string", + "x-go-type-skip-optional-pointer": true + }, + "kind": { + "description": "Indicates the role of the inverter.\n\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible\nin accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID" + ], + "x-readme-ref-name": "InverterKind" + }, + "manufacturer": { + "type": "string", + "example": "SMA", + "description": "Manufacturer of the appliance." + }, + "model": { + "type": "string", + "example": "Sunny Boy Storage 2.5", + "description": "Model of the appliance." + }, + "firmware": { + "type": "string", + "example": "2.4.23.R", + "description": "Firmware version of the appliance." + }, + "inverter": { + "type": "object", + "description": "The inverter specific information.", + "properties": { + "maxActivePowerOutput": { + "description": "Maximum active power output of the inverter in mW; set manually. Zero if not set.", + "type": "integer" + }, + "type": { + "description": "Describes the specific type of the inverter.", + "type": "string", + "example": "SUNGROW_SG_20_RT" + } + } + }, + "nominalPowerLimit": { + "description": "Designed maximal power output of the inverter in mW.", + "type": "integer" + }, + "hybridCalcMode": { + "description": "The calculation mode for inverters of HYBRID kind.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + } + }, + "x-readme-ref-name": "AbstractInverter" + }, + { + "required": [ + "kind", + "inverter" + ], + "properties": { + "hardwareStatus": { + "title": "Hardware Status", + "type": "object", + "description": "HardwareStatus provides information about the condition of the inverter and in case of issues, \npossible follow-up actions the user/installer can perform to resolve them.\n", + "properties": { + "state": { + "type": "string", + "enum": [ + "UNKNOWN", + "OK", + "WARNING", + "ERROR" + ], + "description": "State of the inverter." + }, + "action": { + "type": "string", + "description": "Recommended action to resolve ERROR/WARNING state.", + "enum": [ + "CONSULT_DEVICE_READOUT", + "CONTACT_INSTALLER", + "CONTACT_MANUFACTURER", + "CONTACT_GRID_OPERATOR" + ] + }, + "errorCode": { + "type": "string", + "description": "Inverter manufacturer/model dependent error code formatted as it would be shown on display." + }, + "description": { + "type": "string", + "description": "Contains details about the inverter ERROR and WARNING states.", + "enum": [ + "OTHER", + "GRID_FAULT", + "INSULATION_FAILURE", + "INTERFERENCE_DEVICE", + "FAN_FAULT", + "WAIT_FOR_UPDATE", + "SOFTWARE_FAULT", + "HARDWARE_FAULT", + "PARAMETER_FAULT", + "HIGH_TEMPERATURE", + "HIGH_DC_VOLTAGE", + "LOW_DC_POWER", + "DC_OVERCURRENT", + "INSTALLATION_FAULT", + "COMMUNICATION_FAULT", + "BATTERY_FAULT" + ] + }, + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-15T00:00:00Z" + } + }, + "x-readme-ref-name": "HardwareStatus" + }, + "inverter": { + "required": [ + "type" + ] + }, + "battery": { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "allOf": [ + { + "title": "Battery Information", + "type": "object", + "description": "The battery specific information for inverters of BATTERY and HYBRID kind.", + "properties": { + "maxCharge": { + "type": "integer", + "title": "Battery's maximum charge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "maxDischarge": { + "type": "integer", + "title": "Battery's maximum discharge", + "format": "int64", + "minimum": 0, + "example": 501, + "x-readme-ref-name": "PositivePower" + }, + "controllable": { + "type": "boolean", + "description": "Controllable is true if the battery charging/discharging can be controlled." + }, + "dischargeLimit": { + "type": "integer", + "description": "DischargeLimit is the minimum state of charge in % from 0-100 to discharge to." + }, + "rechargeLimit": { + "type": "integer", + "description": "RechargeLimit is the state of charge in % from 0-100 to which the battery needs to \nrecharge before allowing discharging again.\n" + }, + "controlSettings": { + "type": "object", + "description": "Indicates the currently desired control settings for the battery.", + "required": [ + "value", + "command" + ], + "properties": { + "value": { + "type": "integer", + "description": "Represents the charge/discharge power in mW." + }, + "command": { + "type": "string", + "description": "Represents the current control command.", + "enum": [ + "none", + "charge", + "discharge" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractBatteryInformation" + }, + { + "required": [ + "controllable" + ] + } + ], + "x-readme-ref-name": "BatteryInformation" + } + } + } + ], + "x-readme-ref-name": "Inverter" + }, + { + "title": "Meter", + "description": "Meter represents a monitor-/controllable meter.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "METER" + ], + "x-go-type-skip-optional-pointer": true + }, + "model": { + "type": "string", + "example": "B-control Energy Manager 300", + "description": "Model of the meter." + }, + "firmware": { + "type": "string", + "example": "2.03", + "description": "Firmware version of the meter." + }, + "auxMeter": { + "type": "object", + "description": "The meter specific information.", + "properties": { + "location": { + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "description": "Indicates that the meter is in front of given location for measuring the consumption and production.\n" + }, + "type": { + "description": "Describes the specific type of the meter.", + "type": "string", + "example": "SE_SINGLE_PHASE" + }, + "modbusAddress": { + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractMeter" + }, + { + "type": "object", + "required": [ + "auxMeter", + "kind" + ], + "properties": { + "kind": { + "description": "Indicates what the meter measures.\nSetting the kind impacts the system measurements. So it's best to set it up correctly as early as possible in accordance to the actual installation in order for the measurement calculation to be correct (best during commissioning).", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "GRID", + "BATTERY", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "PV_EXTERNAL", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ], + "x-readme-ref-name": "MeterKind" + }, + "manufacturer": { + "type": "string", + "example": "TQ Systems", + "description": "Manufacturer of the meter." + }, + "auxMeter": { + "required": [ + "location", + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Meter" + }, + { + "title": "Heat Pump", + "description": "Heat Pump represents a monitor-/controllable heat pump.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Stiebel Eltron", + "description": "Manufacturer of the heat pump." + }, + "model": { + "type": "string", + "example": "WPMsystem", + "description": "Model of the heat pump." + }, + "firmware": { + "type": "string", + "example": "mac_02:80:ad:24:d5:ab", + "description": "Firmware version of the heat pump." + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + } + }, + "x-readme-ref-name": "AbstractHeatPump" + }, + { + "required": [ + "heatPump" + ], + "properties": { + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "allOf": [ + { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + { + "required": [ + "type", + "controllable", + "behindGCP", + "withOwnTariff", + "userControlEnabled" + ] + } + ], + "x-readme-ref-name": "HeatPumpInformation" + } + } + } + ], + "x-readme-ref-name": "HeatPump" + }, + { + "title": "EV Charging Station", + "description": "EV Charging Station represents a monitor-/controllable electric vehicle charging station.\n", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "EVSTATION" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Echarge Hardy Barth", + "description": "Manufacturer of the ev charging station." + }, + "model": { + "type": "string", + "example": "eCHARGE/PV", + "description": "Model of the ev charging station." + }, + "firmware": { + "type": "string", + "example": "0.38-78000001", + "description": "Firmware version of the ev charging station." + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + } + }, + "x-readme-ref-name": "AbstractEVStation" + } + ], + "x-readme-ref-name": "EVStation" + }, + { + "title": "Electrolyzer", + "description": "Electrolyzer represents a monitor-/controllable electrolyzer.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ELECTROLYZER" + ], + "x-go-type-skip-optional-pointer": true + } + }, + "x-readme-ref-name": "AbstractElectrolyzer" + } + ], + "x-readme-ref-name": "Electrolyzer" + }, + { + "title": "IO Device", + "description": "IO devices represent configuration options that can be applied for appliances of the fieldbus coupler type", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "IO_DEVICE" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Siemens AG", + "description": "Manufacturer of the io device." + }, + "model": { + "type": "string", + "example": "Siemens AG 7KM2200-2EA30-1EA1", + "description": "Model of the io device." + }, + "firmware": { + "type": "string", + "example": "HW 3 SW V3.2.2", + "description": "Firmware version of the io device." + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "AbstractIODevice" + }, + { + "properties": { + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "allOf": [ + { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + }, + { + "required": [ + "type" + ] + } + ], + "x-readme-ref-name": "IODeviceInformation" + } + } + } + ], + "x-readme-ref-name": "IODevice" + }, + { + "title": "Heater", + "description": "Heater represents a monitor-/controllable heater.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "HEATER" + ], + "x-go-type-skip-optional-pointer": true + }, + "firmware": { + "type": "string", + "example": "101.3", + "description": "Firmware version of the heater." + }, + "heater": { + "description": "The heater specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heater.", + "type": "string", + "enum": [ + "UNKNOWN", + "MY_PV_AC_THOR", + "SIMULATION", + "EXT_IO_DEVICE_ELECTRIC" + ] + }, + "medium": { + "description": "The medium the heater is working with.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ] + }, + "nominalPower": { + "description": "The nominal power of the heater.", + "type": "integer" + } + } + } + }, + "x-readme-ref-name": "AbstractHeater" + }, + { + "required": [ + "heater" + ], + "properties": { + "manufacturer": { + "type": "string", + "example": "my-PV", + "description": "Manufacturer of the heater." + }, + "heater": { + "required": [ + "type", + "medium" + ] + } + } + } + ], + "x-readme-ref-name": "Heater" + }, + { + "title": "Container", + "description": "Container represents a container appliance, used to group multiple child appliances.", + "allOf": [ + { + "title": "Base Appliance", + "description": "BaseAppliance contains fields that all appliances have in common.\n\nSpecific appliance types extend this schema and add new fields.\n", + "type": "object", + "required": [ + "id", + "inactive", + "createdAt", + "updatedAt", + "type", + "position", + "reverseFlow", + "connectionStatus", + "state" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "description": "Uniquely identifies the appliance." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the appliance was updated the last time." + }, + "connectionStatus": { + "title": "Appliance connection status", + "type": "object", + "readOnly": true, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status of an appliance.\n \nThe connection status of an appliance is determined by the gateway. The gateway regularly\nsends the connection status of all connected appliances.\n\nIt is one of:\n- `AVAILABLE`: Appliance was reported as available by the gateway.\n- `UNAVAILABLE`: Appliance was reported as unavailable by the gateway.\n- `UNKNOWN`: The gateway didn't report a status for the appliance.\n\nIn case the connection status of the gateway this appliance belongs to is `TEMPORARILY_UNAVAILABLE` or `UNAVAILABLE`\nthe status is always `UNAVAILABLE`. \n", + "enum": [ + "AVAILABLE", + "UNAVAILABLE", + "UNKNOWN" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "No longer supported. \n\nWill be set approximately to a value matching the status field.\nIf the appliance is `AVAILABLE`, it will be the current datetime.\nIf the appliance is `UNAVAILABLE`, it will be a datetime 24 hours in the past. \n" + } + }, + "x-readme-ref-name": "ApplianceConnectionStatus" + }, + "status": { + "description": "Status of the appliance. This field is set dynamically in the appliance handler.\n\n**Deprecated** - Use `ConnectionStatus` instead.\n", + "type": "string", + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "deprecated": true, + "x-readme-ref-name": "ApplianceStatus" + }, + "type": { + "type": "string", + "example": "INVERTER", + "description": "Describes the 'physical' type of the appliance.\n\nSee `kind` for further distinction of the type in terms of the appliance's purpose/role,\ne.g. appliance with type=INVERTER and kind=BATTERY represents a battery inverter.\n", + "x-go-type-skip-optional-pointer": true, + "x-readme-ref-name": "ApplianceType" + }, + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "serialnumber": { + "type": "string", + "example": "1901000652", + "description": "Serialnumber of the appliance.", + "x-readme-ref-name": "ApplianceSerialNumber" + }, + "network": { + "title": "Network", + "description": "Represents a network connection.", + "type": "object", + "properties": { + "interface": { + "type": "string", + "example": "eth0", + "description": "Used network interface such as \"eth0\", \"vpn0\" etc." + }, + "address": { + "type": "string", + "example": "192.168.178.153", + "description": "IP address of the device." + }, + "port": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Port used for the connection." + }, + "protocol": { + "type": "string", + "example": "tcp/modbus", + "description": "Protocol used for the connection." + } + }, + "x-readme-ref-name": "Network" + }, + "parent": { + "type": "string", + "format": "uuid", + "description": "Specifies the parent appliance ID, for an appliance which is a child of a `CONTAINER` or `INVERTER` of kind `HYBRID`.", + "x-readme-ref-name": "ApplianceParent" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "sensorSettings": { + "title": "Sensor Settings", + "type": "object", + "allOf": [ + { + "title": "Sensor Settings", + "type": "object", + "properties": { + "sensorL1": { + "type": "integer" + }, + "sensorL2": { + "type": "integer" + }, + "sensorL3": { + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractSensorSettings" + }, + { + "required": [ + "createdAt", + "updatedAt" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "SensorSettings" + }, + "source": { + "title": "Source", + "type": "object", + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "description": "Specifies who created the appliance. This can be one of:\n- `GRIDBOX` if the appliance was found during a scan using a gridBox.\n- `API` if a user of the gridX API used the 'Create Appliance' endpoint\n to create this appliance.\n- `UNKNOWN` otherwise.\n", + "enum": [ + "UNKNOWN", + "GRIDBOX", + "API" + ], + "example": "API" + }, + "uri": { + "type": "string", + "description": "Contains an URI identifying the exact resource that created this appliance.\n\nIf origin is 'GRID_BOX' the value will point to the gateway object of the gridBox. If\norigin is 'API' the value will specify the user that made the request to the gridX API.\nThe 'UNKNOWN' origin should not occur in practice and is reserved for special cases (for now).\n", + "example": "accounts/b30510fa-a8a5-475f-a75d-82a46cb62582/users/b30510fa-a8a5-475f-a75d-82a46cb62582" + } + }, + "x-readme-ref-name": "Source" + }, + "commissioningKind": { + "title": "Commissioning Kind", + "description": "Indicates special requirements to be fulfilled during the commissioning for this appliance.\n\nIf empty or unset (default), the appliance can be commissioned as regular.\n- `property:CryptoSettings` means that the appliance property `CryptoSettings` needs to be set, e.g. for authenticating towards it with an appliance-specific API token.\n- `flow:Pairing` means that a coupling or pairing flow has to be initiated and run-through in order for the appliance to behave correctly.\n", + "type": "string", + "enum": [ + "property:CryptoSettings", + "flow:Pairing" + ], + "x-readme-ref-name": "CommissioningKind" + }, + "state": { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "allOf": [ + { + "title": "State", + "description": "Contains information about the appliance's state.", + "type": "object", + "properties": { + "current": { + "description": "The state the appliance is currently in.", + "example": "SCANNED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "transitions": { + "description": "List with all the possible state transitions an appliance can go through. \nAn appliance can go from a `starting` state to a `target` state.\n", + "type": "array", + "items": { + "title": "State Transition", + "description": "Defines the properties of a transition an appliance can go through.", + "type": "object", + "required": [ + "start", + "target" + ], + "properties": { + "start": { + "description": "The starting state of the appliance.", + "example": "CONNECTING", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "target": { + "description": "The target state of the appliance.", + "example": "DISCONNECTED", + "title": "Appliance State", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + }, + "x-readme-ref-name": "StateTransition" + } + } + }, + "x-readme-ref-name": "AbstractState" + }, + { + "required": [ + "current", + "desired" + ], + "properties": { + "desired": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + } + } + } + ], + "x-readme-ref-name": "State" + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "allOf": [ + { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + { + "required": [ + "updatedAt" + ], + "properties": { + "updatedAt": { + "description": "Specifies when the energy management settings were updated the last time.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "EnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + }, + { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the crypto key was updated the last time." + } + } + } + ], + "x-readme-ref-name": "CryptoSetting" + } + } + }, + "x-readme-ref-name": "BaseAppliance" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "CONTAINER" + ], + "x-go-type-skip-optional-pointer": true + }, + "manufacturer": { + "type": "string", + "example": "Loxone", + "description": "Manufacturer of the container." + }, + "model": { + "type": "string", + "example": "Miniserver", + "description": "Model of the container." + }, + "container": { + "description": "The container specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the container.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS" + ] + } + } + } + }, + "x-readme-ref-name": "AbstractContainer" + }, + { + "required": [ + "container" + ], + "properties": { + "container": { + "required": [ + "type" + ] + } + } + } + ], + "x-readme-ref-name": "Container" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "INVERTER": "#/components/schemas/Inverter", + "METER": "#/components/schemas/Meter", + "HEAT_PUMP": "#/components/schemas/HeatPump", + "EVSTATION": "#/components/schemas/EVStation", + "ELECTROLYZER": "#/components/schemas/Electrolyzer", + "IO_DEVICE": "#/components/schemas/IODevice", + "HEATER": "#/components/schemas/Heater", + "CONTAINER": "#/components/schemas/Container" + } + }, + "x-readme-ref-name": "Appliance" + } + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "Scan" + }, + "JobType": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "JobState": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + }, + "AbstractJob": { + "description": "Represents an application-based job on the gridBox.", + "type": "object", + "properties": { + "type": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "requestedAt": { + "description": "Represents the time at which the job was requested.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "state": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + } + }, + "x-readme-ref-name": "AbstractJob" + }, + "JobExecution": { + "title": "Job Execution", + "description": "Represents an execution of a job.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a job execution.", + "type": "string", + "format": "uuid", + "example": "5830cd32-a194-4b9d-bea3-c2332f27167f" + }, + "jobID": { + "description": "Unique identifier of a job.", + "type": "string", + "format": "uuid" + }, + "succeeded": { + "description": "Indicates that the execution was successful.", + "type": "boolean" + }, + "error": { + "description": "A possible error message.", + "type": "string" + }, + "startedAt": { + "description": "Represents the time at which the execution was started at the gridbox.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the execution was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "JobExecution" + }, + "JobWithExecutions": { + "type": "object", + "allOf": [ + { + "description": "Represents an application-based job on the gridBox.", + "type": "object", + "properties": { + "type": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "requestedAt": { + "description": "Represents the time at which the job was requested.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "state": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + } + }, + "x-readme-ref-name": "AbstractJob" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a job.", + "example": "d90fc059-b1d0-4277-a347-43609e232f4f" + }, + "receivedAt": { + "description": "Represents the time at which the job was received by the gateway.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "startedAt": { + "description": "Represents the time at which the job was started.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the job was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "executions": { + "description": "Represents a set of job executions.", + "type": "array", + "items": { + "title": "Job Execution", + "description": "Represents an execution of a job.", + "type": "object", + "properties": { + "id": { + "description": "Unique identifier of a job execution.", + "type": "string", + "format": "uuid", + "example": "5830cd32-a194-4b9d-bea3-c2332f27167f" + }, + "jobID": { + "description": "Unique identifier of a job.", + "type": "string", + "format": "uuid" + }, + "succeeded": { + "description": "Indicates that the execution was successful.", + "type": "boolean" + }, + "error": { + "description": "A possible error message.", + "type": "string" + }, + "startedAt": { + "description": "Represents the time at which the execution was started at the gridbox.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "finishedAt": { + "description": "Represents the time at which the execution was finished.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + } + }, + "required": [ + "id" + ], + "x-readme-ref-name": "JobExecution" + } + } + }, + "required": [ + "id", + "state", + "type", + "executions" + ] + } + ], + "x-readme-ref-name": "JobWithExecutions" + }, + "JobCreation": { + "type": "object", + "allOf": [ + { + "description": "Represents an application-based job on the gridBox.", + "type": "object", + "properties": { + "type": { + "description": "Represents the kind of the job. A job can be of type:\n- `UNKNOWN_TYPE`\n- `RESET`: Indicates that the application has to be reset.\n- `SCAN`: Indicates that the application should start a scan.\n- `RESTART`: Indicates that the application should restart.\n", + "type": "string", + "enum": [ + "UNKNOWN_TYPE", + "SCAN", + "RESET", + "RESTART" + ], + "example": "RESET", + "x-readme-ref-name": "JobType" + }, + "requestedAt": { + "description": "Represents the time at which the job was requested.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-04-15T00:00:00Z" + }, + "state": { + "type": "string", + "description": "Represents the current state of the job. It can be one of:\n* `UNKNOWN_STATE`\n* `PENDING`: Indicates that the job waits to be fetched.\n* `RECEIVED`: Indicates that the job has reached the gridbox.\n* `STARTED`: Indicates that the job has been started.\n* `DONE`: Indicates that the job is done.\n* `ERROR`: Indicates that the job has failed.\n* `CANCELED`: Indicates that the job was remotely cancelled.It might only have an impact if the state is still pending.\n", + "enum": [ + "UNKNOWN_STATE", + "PENDING", + "RECEIVED", + "STARTED", + "DONE", + "ERROR", + "CANCELED" + ], + "example": "PENDING", + "x-readme-ref-name": "JobState" + } + }, + "x-readme-ref-name": "AbstractJob" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a job.", + "example": "d90fc059-b1d0-4277-a347-43609e232f4f" + } + }, + "required": [ + "state", + "type" + ] + } + ], + "x-readme-ref-name": "JobCreation" + }, + "ApplianceUpdate": { + "title": "Appliance Update", + "description": "ApplianceUpdate contains fields of an appliance that can be updated.\n", + "type": "object", + "properties": { + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "kind": { + "description": "Indicates the specific kind or role of the appliance.\nOnly settable for appliances of type `INVERTER` or `METER`.\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID", + "GRID", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ] + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + } + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "desiredState": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "ApplianceUpdate" + }, + "ApplianceUpdateStrict": { + "allOf": [ + { + "title": "Appliance Update", + "description": "ApplianceUpdate contains fields of an appliance that can be updated.\n", + "type": "object", + "properties": { + "inactive": { + "type": "boolean", + "x-readme-ref-name": "ApplianceInactive" + }, + "name": { + "type": "string", + "description": "Name of the appliance.", + "x-readme-ref-name": "ApplianceName" + }, + "reverseFlow": { + "description": "If true, changes the energy flow's direction.\n\nIf during installation the input/output wiring is mixed up, set it to true in order to compensate for that.\nThis impact the consumption/production calculation as follows: \nIt switches the algebraic sign of the appliance's measurements, e.g. if an appliance measurement showed supply (+), it will change to feed-in (-) after this field is set to true (and vice versa).\n", + "type": "boolean", + "x-readme-ref-name": "ApplianceReverseFlow" + }, + "room": { + "type": "string", + "description": "The physical room/location of the appliance in the building.", + "x-readme-ref-name": "ApplianceRoom" + }, + "loadSettings": { + "title": "Load Settings", + "description": "Configure load of appliance.", + "type": "object", + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "If true, disable electrical load of the appliance (e.g. stops charging for EV charging station)." + } + }, + "x-readme-ref-name": "LoadSettings" + }, + "kind": { + "description": "Indicates the specific kind or role of the appliance.\nOnly settable for appliances of type `INVERTER` or `METER`.\n", + "type": "string", + "enum": [ + "UNKNOWN", + "PV", + "PV_EXTERNAL", + "BATTERY", + "HYBRID", + "GRID", + "HEAT_PUMP", + "FUEL_CELL", + "HEAT_PUMP_EXTERNAL", + "EVSTATION", + "BTTP", + "HEATING", + "MISC", + "CLUSTER", + "WIND_TURBINE" + ] + }, + "energySettings": { + "title": "Energy Management Settings", + "description": "Contains energy management information", + "type": "object", + "properties": { + "minControlInterval": { + "type": "integer" + }, + "socMax": { + "description": "The maximum state of charge an energy storage can be charged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMax": { + "description": "The threshold above which no charging is allowed once SoC max is reached, in a range from [0-100] in %.\nMust be smaller than or equal to socMax.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socMin": { + "description": "The minimum state of charge an energy storage can be discharged to in a range from [0-100] in %.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socLockMin": { + "description": "The threshold below which no discharging is allowed once SoC min is reached, in a range from [0-100] in %.\nMust be larger than or equal to socMin.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "socDeepDischarge": { + "description": "The lowest state of charge an energy storage can reach, in a range from [0-100] in %.\nBelow this it is not usable and a forced recharge to at least socMin is required.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100 + }, + "phaseMapping": { + "description": "Contains three indices representing the actual phases on the grid connection point this appliance is connected to. \nNote that the first phase has index 0 and last phase index 2.\nThe index of the sequence is the phase on the gcp and the values are the appliance phases. Unused phases are marked with -1.\n", + "type": "array", + "nullable": true, + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "temperatureExtremeMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is an energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureExtremeMin": { + "description": "The minimum temperature the system can reach in °C.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMax": { + "description": "The temperature to which the system should be heated up to in °C, if there is no energy surplus.\n", + "type": "number", + "format": "double" + }, + "temperatureComfortMin": { + "description": "The temperature at which the system starts to heat up to in °C.\n", + "type": "number", + "format": "double" + }, + "surplusThreshold": { + "description": "The supply surplus threshold for the EMS to activate the appliance.", + "type": "integer" + } + }, + "x-readme-ref-name": "AbstractEnergyManagementSettings" + }, + "cryptoSettings": { + "title": "Crypto Settings", + "description": "Contains a list of crypto setting keys that are associated with the appliance.", + "type": "array", + "items": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "description": "Crypto key data that is accessible to the appliance.", + "type": "string" + } + }, + "x-readme-ref-name": "AbstractCryptoSetting" + } + }, + "evLoadManagementParameters": { + "title": "EvLoadManagementParameters", + "description": "Load management configuration for EV charging stations.\n\n**Deprecated** - Use the system's EV charging station configuration instead.\n", + "deprecated": true, + "type": "object", + "properties": { + "enabled": { + "description": "Indicates whether the load management is enabled.", + "type": "boolean" + }, + "maxPower": { + "description": "The maximum power in W.", + "type": "number", + "format": "double", + "minimum": 0 + } + }, + "x-readme-ref-name": "EVLoadManagementParameters" + }, + "evseID": { + "description": "The EVSE-ID related to the charge point.", + "type": "string", + "x-readme-ref-name": "EVSEID" + }, + "desiredState": { + "title": "Appliance State", + "description": "State an appliance can be in.", + "type": "string", + "enum": [ + "UNKNOWN_APPLIANCE_STATE", + "SCANNED", + "CONNECTING", + "VERIFYING", + "UNTRUSTED", + "CONNECTED", + "DISCONNECTED" + ], + "x-readme-ref-name": "ApplianceState" + }, + "heatPump": { + "title": "Heat Pump Information", + "description": "The heat pump specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the heat pump.", + "type": "string", + "enum": [ + "UNKNOWN", + "EEBUS", + "SIMULATION", + "INNOTEC", + "XNET_CLOUD", + "EXT_IO_DEVICE", + "EXT_IO_DEVICE_DHW", + "STIEBEL_ELTRON_WPMSYSTEM", + "SAIA_PCD_E_LINE", + "DAIKIN_HOMEHUB" + ] + }, + "controllable": { + "description": "Specifies whether this appliance is controllable by the EMS.", + "type": "boolean" + }, + "behindGCP": { + "description": "Specifies whether this heat pump exists behind a GCP meter.", + "type": "boolean" + }, + "withOwnTariff": { + "description": "Specifies whether this heat pump has its own meter and tariff.", + "type": "boolean" + }, + "userControlEnabled": { + "description": "Specifies whether EMS control of this appliance is enabled by the user.", + "type": "boolean" + } + }, + "x-readme-ref-name": "AbstractHeatPumpInformation" + }, + "ioDevice": { + "title": "IO Device Information", + "description": "The io device specific information.", + "type": "object", + "properties": { + "type": { + "description": "Describes the specific type of the device.", + "type": "string", + "enum": [ + "UNKNOWN", + "WAGO", + "SGREADY", + "JANITZA_UMG604", + "RUTENBECK_TCR_IP4", + "SIEMENS_PAC_7KM_2200", + "JANITZA", + "SHELLY" + ] + }, + "inChannelsCount": { + "type": "integer", + "description": "The number of input ports on the device, real physical ports you can connect a cable to." + }, + "outChannelsCount": { + "type": "integer", + "description": "The number of output ports on the device, real physical ports you can connect a cable to." + }, + "inputChannels": { + "type": "array", + "description": "Input channels of the fieldbus coupler, containing actions.", + "items": { + "title": "IO Device Input Channel", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "BitMask used to identify the channel." + }, + "bitValue": { + "type": "string", + "format": "base64", + "description": "BitValue used to trigger the action." + }, + "actions": { + "type": "array", + "items": { + "title": "IO Device Input Action", + "description": "One individual input action, that can be registered to a channel of a fieldbus coppler appliance.", + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the action." + }, + "value": { + "type": "number", + "description": "Value of the action. Unit must be derived from Name." + } + }, + "x-readme-ref-name": "IODeviceInputAction" + } + } + }, + "x-readme-ref-name": "IODeviceInputChannel" + } + }, + "outputChannels": { + "type": "array", + "description": "Output channels of the IODevice, containing actions. An output channel must not always use exactly one port, but can use multiple physical connections.\nSGReady heat pumps for example are connected using two output ports (which are grouped in one OutputChannel).\n", + "items": { + "title": "IO Device Output Channel", + "description": "Represents one output channel of the IODevice.", + "type": "object", + "properties": { + "bitMask": { + "type": "string", + "format": "base64", + "description": "Bit mask identifying the output channel." + }, + "actions": { + "type": "array", + "description": "Actions (name/value pairs) that are applied to the channel when enabled.", + "items": { + "title": "IO Device Output Action", + "description": "An individual output action, that can be registered to an output channel of an IODevice.", + "type": "object", + "properties": { + "bitValue": { + "type": "string", + "format": "base64", + "description": "The value to write to the IODevice's output channel. Each action has its own bit value, to allow arbitrary combinations to be written to the output channel." + }, + "sgReady": { + "title": "IO Device Output Action SGReady", + "description": "Used to specify a connection to a heat pump supporting the SGReady standard.", + "type": "object", + "required": [ + "pMin", + "pMax", + "state", + "applianceID" + ], + "properties": { + "pMin": { + "type": "number" + }, + "pMax": { + "type": "number" + }, + "state": { + "description": "Represents one state of the sg ready standard.", + "type": "string", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "applianceID": { + "type": "string", + "format": "uuid" + } + }, + "x-readme-ref-name": "IODeviceOutputActionSGReady" + } + }, + "x-readme-ref-name": "IODeviceOutputAction" + } + } + }, + "x-readme-ref-name": "IODeviceOutputChannel" + } + } + }, + "x-readme-ref-name": "AbstractIODeviceInformation" + } + }, + "x-readme-ref-name": "ApplianceUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ApplianceUpdateStrict" + }, + "AbstractEVChargingStationConfiguration": { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + }, + "EVChargingStationConfiguration": { + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + }, + { + "required": [ + "applianceID", + "createdAt", + "updatedAt", + "chargingEnabled", + "chargingRemoteControllable", + "lockEnabled", + "minRequestedSoc", + "departureTimestamp", + "userSoc", + "userTotalCapacity", + "maxPowerCalculated", + "maxChargePower", + "minChargePower" + ], + "properties": { + "applianceID": { + "type": "string", + "format": "uuid", + "description": "ID of the EV charging station this configuration belongs to. \n" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the configuration was updated the last time." + } + } + } + ], + "x-readme-ref-name": "EVChargingStationConfiguration" + }, + "EVChargingStationConfigurationCreation": { + "type": "object", + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + } + ], + "x-readme-ref-name": "EVChargingStationConfigurationCreation" + }, + "EVChargingStationConfigurationCreationStrict": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + } + ], + "x-readme-ref-name": "EVChargingStationConfigurationCreation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EVChargingStationConfigurationCreationStrict" + }, + "EVChargingStationConfigurationUpdate": { + "type": "object", + "allOf": [ + { + "title": "EV Charging Station Configuration", + "description": "Configure the charge mode and other settings considered by the EMS and applied to the EV charging station.\n", + "type": "object", + "properties": { + "issueTimestamp": { + "type": "string", + "format": "date-time", + "deprecated": true, + "description": "Specifies when the configuration was send or received the last time by the EMS.\n\n**Deprecated** - No longer updated, always returns the current date.\n" + }, + "chargingEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging is allowed." + }, + "chargingRemoteControllable": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether charging may be controlled via network connection." + }, + "lockEnabled": { + "type": "boolean", + "nullable": true, + "description": "Specifies whether the plug is locked." + }, + "minRequestedSoc": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 100, + "format": "double", + "description": "The minimum SoC the EV shall have and keep to guarantee the range for the next usage.\n\nThis is set by the user and needed for `DEPARTURE_TIME_EV` and `MIN_EV` charge modes.\nIf this value is set, the `userTotalCapacity` needs to be set, too.\nValue is between 0.0 - 100.0 in %.\n", + "example": 30 + }, + "departureTimestamp": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The departure time of the EV for the `DEPARTURE_TIME_EV` charge mode.\n\nOnly the time of the day is considered, not the exact date. \nIf the time of day is in the past it is interpreted as tomorrow and if it in the future it is today.\n" + }, + "estimatedDepartureTimestamp": { + "type": "string", + "format": "date-time", + "description": "The estimated timestamp when the desired SoC is reached.\n\nOptimally, the timestamp is close to the user's wanted `departureTimestamp`.\nThe estimated timestamp is calculated by the EMS and takes into account the current SoC of the EV and the fact that the EV power can be curtailed by the DLM.\n" + }, + "userSoc": { + "type": "number", + "format": "double", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\n", + "example": 50 + }, + "userTotalCapacity": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The size of the EV's battery in Wh.\n\nIf this cannot be determined directly from the hardware, then the user enters it during the onboarding process.\nThe value is needed to calculate the energy that needs to be charged to fulfill the `minRequestedSoc`.\n", + "minimum": 0, + "example": 82000 + }, + "chargeMode": { + "type": "string", + "description": "Defines how the EV shall be charged.\n * `FORCED_EV`: EV will be charged with full power until 100% SoC. This is the default behaviour, also if there is no configuration set. It does not require any additional fields to be set. Also commonly referred to as \"Quick Charge\".\n * `MIN_EV`: EV will be charged with full power until the specified `minRequestedSoc` (must be provided). Also commonly referred to as \"Safety Charge\".\n * `DEPARTURE_TIME_EV`: EV will be charged until `departureTimestamp` to the `minRequestedSoc`. This means that initially it charges with surplus energy, but if it is not enough it will charge with full power to meet the requested `departureTimestamp`. Also commonly referred to as \"Program Charge\".\n * `SURPLUS_EV`: EV will only be charged with surplus energy regardless of SoC level. It does not require any additional fields to be set. Also commonly referred to as \"Solar Charge\".\n", + "enum": [ + "FORCED_EV", + "MIN_EV", + "DEPARTURE_TIME_EV", + "SURPLUS_EV" + ] + }, + "maxPowerCalculated": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum potential total charge power in Watt is calculated by the gridBox in usual setups.\n\nThe total power is defined as sum of all phases' power.\nIt considers the maximum power supported by the EV and that the power can be curtailed by the DLM.\n", + "minimum": 0, + "example": 8000 + }, + "maxChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The maximum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV charging power will not exceed the specified value.\n", + "minimum": 0, + "example": 8000 + }, + "minChargePower": { + "type": "number", + "format": "double", + "nullable": true, + "description": "The minimum total power that the EV should be charged with in Watt.\n\nThe total power is defined as sum of all phases' power.\nEV will only be charged if the total power is above the specified value.\n", + "minimum": 0, + "example": 2070 + }, + "minChargePowerPerPhase": { + "type": "number", + "format": "double", + "description": "The minimum power that the EV should be charged with in Watt for one phase.\n\nEV will only be charged if **one** of the phases' power is above the specified value.\n", + "minimum": 0, + "example": 1840 + }, + "evProfileID": { + "description": "Represents the ID of the EV profile that is going to be used in the next charging session.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + } + }, + "x-readme-ref-name": "AbstractEVChargingStationConfiguration" + } + ], + "x-readme-ref-name": "EVChargingStationConfigurationUpdate" + }, + "AbstractElectricVehicleProfile": { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + "ElectricVehicleProfile": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + }, + "systemID": { + "description": "Unique identifier of the system that this EV profile belongs to.", + "type": "string", + "format": "uuid", + "example": "938b84d9-17e9-44e5-b422-4fb95ea3550b" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was created in UTC using the RFC3339 format.", + "example": "2022-11-10T23:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the EV profile was updated the last time in UTC using the RFC3339 format.", + "example": "2022-11-12T23:20:50Z" + }, + "chargingStationApplianceIDs": { + "readOnly": true, + "title": "ChargingStationApplianceIDs", + "description": "ChargingStationApplianceIDs represents the charging station appliances the EV is assigned to.\n", + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "example": [ + "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "e3bb9553-78a6-4f4f-98d5-5c5f9012251d" + ] + } + }, + "required": [ + "id", + "systemID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "ElectricVehicleProfile" + }, + "ElectricVehicleProfileCreate": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + } + } + } + ], + "x-readme-ref-name": "ElectricVehicleProfileCreate" + }, + "ElectricVehicleProfileCreateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of an EV profile.", + "example": "51c0c70f-dfcc-4520-b535-0ecc44c75e12" + } + } + } + ], + "x-readme-ref-name": "ElectricVehicleProfileCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "ElectricVehicleProfileCreateStrict" + }, + "ElectricVehicleProfileUpdate": { + "allOf": [ + { + "title": "ElectricVehicleProfile", + "description": "Represents data related to an EV Profile.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the EV profile.", + "example": "My profile" + }, + "manufacturer": { + "type": "string", + "description": "The manufacturer of the EV.", + "example": "Tesla" + }, + "model": { + "type": "string", + "description": "The model of the EV (manufacturer-dependent).", + "example": "Model-3" + }, + "color": { + "type": "string", + "description": "The color of the EV.", + "example": "red" + }, + "capacity": { + "type": "number", + "description": "Battery capacity of the EV in Wh.", + "example": 12000 + }, + "averageConsumption": { + "type": "number", + "description": "The average consumption of the EV provided in Wh/100km.", + "example": 30000 + }, + "phasesCount": { + "type": "number", + "format": "int64", + "description": "The number of phases used for charging the EV (range 1-3).", + "example": 1 + }, + "minChargePower": { + "description": "The minimum total power that the EV should be charged with in Watt. \n\nIf the EV Profile is assigned to a charging station, this configuration will be applied, \notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "example": 8000 + }, + "userSoc": { + "description": "The State of Charge (SoC) level read and set by the user for the connected EV.\n\nThis is needed in cases where the SoC cannot be determined automatically.\nValue is between 0.0 - 100.0 in %.\nIf the EV Profile is assigned to a charging station, this configuration will be applied,\notherwise, the [EV Charging Station Configuration](https://developer.gridx.ai/reference/get_gateways-gatewayid-appliances-applianceid-ev-configuration) will be used.\n", + "type": "number", + "format": "double", + "minimum": 0, + "maximum": 100, + "example": 50 + }, + "image": { + "description": "Image to be used when displaying the EV profile in base64 encoding. Format must be `jpeg` or `png`.", + "type": "string", + "example": "data:image/jpeg;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + }, + "minChargePowerPerPhase": { + "type": "number", + "description": "Defines the minimum charge power in W for one phase set by the user.", + "example": 2070 + }, + "minRequestedSoc": { + "type": "number", + "description": "The minimum state of charge the EV shall have and keep to guarantee the range for the next usage. This is set by the user. The value ranges from 0.0 - 100.0 in %.", + "example": 70 + } + }, + "x-readme-ref-name": "AbstractElectricVehicleProfile" + } + ], + "x-readme-ref-name": "ElectricVehicleProfileUpdate" + }, + "EVChargingScheduleCreation": { + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "required": [ + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingScheduleCreation" + }, + "EVChargingScheduleCreationStrict": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "required": [ + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingScheduleCreation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EVChargingScheduleCreationStrict" + }, + "AbstractPowerLimitSchedule": { + "title": "Power Limit Schedule", + "description": "A Power Limit Schedule is a schedule that defines recurring import power limits, \nwhich should be applied to the grid meter.\n\nThe schedule is recurring inside the interval bounds defined by `from` and `to`.\n\nThere can be only one active timeframe for every point in time.\nSchedules can overlap, but they must not have overlapping timeframes. \n", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Name of this schedule. Must be unique for this system." + }, + "from": { + "type": "string", + "format": "date-time", + "description": "From when the schedule applies (inclusive)." + }, + "to": { + "type": "string", + "format": "date-time", + "description": "Until when the schedule applies (exclusive)." + }, + "timezone": { + "type": "string", + "description": "Fully qualified identifier of the timezone ([IANA timezone database identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) this schedule should be applied in.\nUsed to determine time of day of the timeframes.\n" + }, + "timeframes": { + "description": "List of timeframes containing which import limit should be applied at which time of the day.\n\nThey must not overlap in this schedule and also not with timeframes of other schedules of this system.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "from", + "to", + "maxPower" + ], + "properties": { + "from": { + "description": "Time of day from when the limit of this timeframe should be applied (inclusive).\n", + "type": "string", + "example": "00:00" + }, + "to": { + "description": "Time of day until when the limit of this timeframe should be applied (exclusive).\n", + "type": "string", + "example": "14:00" + }, + "maxPower": { + "description": "Max import power in Watt to apply to the grid meter during this timeframe.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 100000 + } + } + } + }, + "recurrence": { + "type": "object", + "description": "Recurrence rules for this schedule.\n\nInspired by [RFC5545](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10) and supporting a small subset of it.\n", + "required": [ + "frequency" + ], + "properties": { + "frequency": { + "description": "Type of recurrence rule.", + "type": "string", + "enum": [ + "DAILY" + ] + }, + "byDayOfWeek": { + "description": "Specifies a list of weekdays this rule should apply to.\nOnly valid for `frequency=DAILY`.\n\nOmitting it is the same as selecting all days.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "SU", + "MO", + "TU", + "WE", + "TH", + "FR", + "SA" + ] + } + } + } + } + }, + "x-readme-ref-name": "AbstractPowerLimitSchedule" + }, + "PowerLimitSchedule": { + "allOf": [ + { + "title": "Power Limit Schedule", + "description": "A Power Limit Schedule is a schedule that defines recurring import power limits, \nwhich should be applied to the grid meter.\n\nThe schedule is recurring inside the interval bounds defined by `from` and `to`.\n\nThere can be only one active timeframe for every point in time.\nSchedules can overlap, but they must not have overlapping timeframes. \n", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Name of this schedule. Must be unique for this system." + }, + "from": { + "type": "string", + "format": "date-time", + "description": "From when the schedule applies (inclusive)." + }, + "to": { + "type": "string", + "format": "date-time", + "description": "Until when the schedule applies (exclusive)." + }, + "timezone": { + "type": "string", + "description": "Fully qualified identifier of the timezone ([IANA timezone database identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) this schedule should be applied in.\nUsed to determine time of day of the timeframes.\n" + }, + "timeframes": { + "description": "List of timeframes containing which import limit should be applied at which time of the day.\n\nThey must not overlap in this schedule and also not with timeframes of other schedules of this system.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "from", + "to", + "maxPower" + ], + "properties": { + "from": { + "description": "Time of day from when the limit of this timeframe should be applied (inclusive).\n", + "type": "string", + "example": "00:00" + }, + "to": { + "description": "Time of day until when the limit of this timeframe should be applied (exclusive).\n", + "type": "string", + "example": "14:00" + }, + "maxPower": { + "description": "Max import power in Watt to apply to the grid meter during this timeframe.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 100000 + } + } + } + }, + "recurrence": { + "type": "object", + "description": "Recurrence rules for this schedule.\n\nInspired by [RFC5545](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10) and supporting a small subset of it.\n", + "required": [ + "frequency" + ], + "properties": { + "frequency": { + "description": "Type of recurrence rule.", + "type": "string", + "enum": [ + "DAILY" + ] + }, + "byDayOfWeek": { + "description": "Specifies a list of weekdays this rule should apply to.\nOnly valid for `frequency=DAILY`.\n\nOmitting it is the same as selecting all days.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "SU", + "MO", + "TU", + "WE", + "TH", + "FR", + "SA" + ] + } + } + } + } + }, + "x-readme-ref-name": "AbstractPowerLimitSchedule" + }, + { + "required": [ + "id", + "title", + "from", + "to", + "timezone", + "timeframes", + "recurrence", + "status", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique ID of this schedule." + }, + "timeframes": { + "minItems": 1 + }, + "status": { + "description": "Status of the schedule.\n\n- `ACTIVE`: A timeframe of this schedule is currently being applied.\n- `OUTDATED`: No more timeframes from this schedule will be applied.\n- `UPCOMING`: A timeframe of this schedule will be applied in the future.\n", + "type": "string", + "enum": [ + "ACTIVE", + "OUTDATED", + "UPCOMING" + ] + }, + "createdAt": { + "description": "When the Power Limit Schedule was created.", + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "description": "When the Power Limit Schedule was last updated.", + "type": "string", + "format": "date-time" + } + } + } + ], + "x-readme-ref-name": "PowerLimitSchedule" + }, + "PowerLimitScheduleUpdate": { + "allOf": [ + { + "title": "Power Limit Schedule", + "description": "A Power Limit Schedule is a schedule that defines recurring import power limits, \nwhich should be applied to the grid meter.\n\nThe schedule is recurring inside the interval bounds defined by `from` and `to`.\n\nThere can be only one active timeframe for every point in time.\nSchedules can overlap, but they must not have overlapping timeframes. \n", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Name of this schedule. Must be unique for this system." + }, + "from": { + "type": "string", + "format": "date-time", + "description": "From when the schedule applies (inclusive)." + }, + "to": { + "type": "string", + "format": "date-time", + "description": "Until when the schedule applies (exclusive)." + }, + "timezone": { + "type": "string", + "description": "Fully qualified identifier of the timezone ([IANA timezone database identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) this schedule should be applied in.\nUsed to determine time of day of the timeframes.\n" + }, + "timeframes": { + "description": "List of timeframes containing which import limit should be applied at which time of the day.\n\nThey must not overlap in this schedule and also not with timeframes of other schedules of this system.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "from", + "to", + "maxPower" + ], + "properties": { + "from": { + "description": "Time of day from when the limit of this timeframe should be applied (inclusive).\n", + "type": "string", + "example": "00:00" + }, + "to": { + "description": "Time of day until when the limit of this timeframe should be applied (exclusive).\n", + "type": "string", + "example": "14:00" + }, + "maxPower": { + "description": "Max import power in Watt to apply to the grid meter during this timeframe.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 100000 + } + } + } + }, + "recurrence": { + "type": "object", + "description": "Recurrence rules for this schedule.\n\nInspired by [RFC5545](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10) and supporting a small subset of it.\n", + "required": [ + "frequency" + ], + "properties": { + "frequency": { + "description": "Type of recurrence rule.", + "type": "string", + "enum": [ + "DAILY" + ] + }, + "byDayOfWeek": { + "description": "Specifies a list of weekdays this rule should apply to.\nOnly valid for `frequency=DAILY`.\n\nOmitting it is the same as selecting all days.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "SU", + "MO", + "TU", + "WE", + "TH", + "FR", + "SA" + ] + } + } + } + } + }, + "x-readme-ref-name": "AbstractPowerLimitSchedule" + } + ], + "x-readme-ref-name": "PowerLimitScheduleUpdate" + }, + "PowerLimitScheduleUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Power Limit Schedule", + "description": "A Power Limit Schedule is a schedule that defines recurring import power limits, \nwhich should be applied to the grid meter.\n\nThe schedule is recurring inside the interval bounds defined by `from` and `to`.\n\nThere can be only one active timeframe for every point in time.\nSchedules can overlap, but they must not have overlapping timeframes. \n", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Name of this schedule. Must be unique for this system." + }, + "from": { + "type": "string", + "format": "date-time", + "description": "From when the schedule applies (inclusive)." + }, + "to": { + "type": "string", + "format": "date-time", + "description": "Until when the schedule applies (exclusive)." + }, + "timezone": { + "type": "string", + "description": "Fully qualified identifier of the timezone ([IANA timezone database identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) this schedule should be applied in.\nUsed to determine time of day of the timeframes.\n" + }, + "timeframes": { + "description": "List of timeframes containing which import limit should be applied at which time of the day.\n\nThey must not overlap in this schedule and also not with timeframes of other schedules of this system.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "from", + "to", + "maxPower" + ], + "properties": { + "from": { + "description": "Time of day from when the limit of this timeframe should be applied (inclusive).\n", + "type": "string", + "example": "00:00" + }, + "to": { + "description": "Time of day until when the limit of this timeframe should be applied (exclusive).\n", + "type": "string", + "example": "14:00" + }, + "maxPower": { + "description": "Max import power in Watt to apply to the grid meter during this timeframe.", + "type": "integer", + "format": "int64", + "minimum": 0, + "example": 100000 + } + } + } + }, + "recurrence": { + "type": "object", + "description": "Recurrence rules for this schedule.\n\nInspired by [RFC5545](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10) and supporting a small subset of it.\n", + "required": [ + "frequency" + ], + "properties": { + "frequency": { + "description": "Type of recurrence rule.", + "type": "string", + "enum": [ + "DAILY" + ] + }, + "byDayOfWeek": { + "description": "Specifies a list of weekdays this rule should apply to.\nOnly valid for `frequency=DAILY`.\n\nOmitting it is the same as selecting all days.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "SU", + "MO", + "TU", + "WE", + "TH", + "FR", + "SA" + ] + } + } + } + } + }, + "x-readme-ref-name": "AbstractPowerLimitSchedule" + } + ], + "x-readme-ref-name": "PowerLimitScheduleUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PowerLimitScheduleUpdateStrict" + }, + "TariffV2StaticPeriodTime": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "TariffV2StaticPeriod": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + }, + "AbstractMarketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + "AbstractTariffV2": { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + "MarketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + }, + "TariffV2": { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + { + "properties": { + "systemID": { + "type": "string", + "description": "ID of the system the tariff is assigned to", + "format": "uuid", + "example": "3a07b17f-da57-4d61-b9e4-17c4fcd861c4", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the tariff was created using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Time at which the tariff was updated using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + }, + "currency": { + "default": "EUR" + }, + "marketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + } + }, + "required": [ + "name", + "feedinType", + "offtakeType", + "systemID", + "createdAt", + "updatedAt", + "currency" + ] + } + ], + "x-readme-ref-name": "TariffV2" + }, + "TariffV2Creation": { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + { + "type": "object", + "properties": { + "marketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + } + }, + "required": [ + "feedinType", + "offtakeType" + ] + } + ], + "x-readme-ref-name": "TariffV2Creation" + }, + "TariffV2CreationStrict": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + }, + { + "type": "object", + "properties": { + "marketDataSettings": { + "allOf": [ + { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + }, + { + "required": [ + "feedinOffset", + "offtakeOffset", + "providerFee", + "vat" + ] + } + ], + "x-readme-ref-name": "MarketDataSettings" + } + }, + "required": [ + "feedinType", + "offtakeType" + ] + } + ], + "x-readme-ref-name": "TariffV2Creation" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TariffV2CreationStrict" + }, + "ConflictException": { + "readOnly": true, + "allOf": [ + { + "title": "General Exception", + "description": "Represents a general error structure returned by our REST API.", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message represents the message reported to the user." + }, + "details": { + "type": "array", + "description": "Details represents detail information for the user to fix this\nproblem\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "message" + ], + "x-readme-ref-name": "GeneralException" + }, + { + "title": "ClientError - Conflict", + "description": "Conflict indicates that the client is attempting to create a resource that already exists.\n", + "type": "object", + "example": { + "message": "Resource already exists" + } + } + ], + "x-readme-ref-name": "ConflictException" + }, + "TariffV2Update": { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + } + ], + "x-readme-ref-name": "TariffV2Update" + }, + "TariffV2UpdateStrict": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "Energy TariffV2", + "type": "object", + "description": "Represents an energy tariff.\nThe tariff contains settings which specify where to take prices from and how the end prices will be calculated.\n\nIf `feedinType` or `offtakeType` is `MARKET_DATA`, `marketDataSettings` is required.\nIf `feedinType` or `offtakeType` is `STATIC` `staticPeriods` is required.\n\nFor **external tariffs**, `feedinType` and `offtakeType` **both** have to be set to `EXTERNAL`.\nExternal tariffs are tariffs where the prices are sent directly via API and not calculated.\nThe price periods are sent with the `/systems/{systemID}/tariff/prices` endpoint.\n", + "properties": { + "name": { + "type": "string", + "description": "Name of the energy tariff, to be chosen freely.", + "example": "E.ON Strom", + "nullable": true + }, + "currency": { + "type": "string", + "description": "Currency code (ISO 4217).", + "example": "EUR" + }, + "feedinType": { + "type": "string", + "description": "Type of feed-in tariff.", + "example": "STATIC", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "offtakeType": { + "type": "string", + "description": "Type of off-take tariff.", + "example": "MARKET_DATA", + "enum": [ + "MARKET_DATA", + "STATIC", + "EXTERNAL" + ] + }, + "staticPeriods": { + "description": "Weekly recurring periods with static prices. Used for example for completely static, day/night and weekend tariffs.\n\nStatic periods have to form a closed loop. The loop must cover the whole week:\nA period has to end at the start of the next period. The end of the last period has to be the start of the first period.\n", + "type": "array", + "items": { + "title": "TariffV2 Static period", + "description": "Contains the tariff periods for a tariff with either OfftakeType or FeedinType `STATIC`. \n\nThe period is active between `from` and `to`. `from` is included in the interval, `to` is excluded.\n", + "type": "object", + "properties": { + "from": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "to": { + "title": "TariffV2 static period time", + "description": "Contains the information when a static period of a TariffV2 starts or ends.\nDescribed by the weekday and the seconds of this day.", + "type": "object", + "properties": { + "weekday": { + "description": "The weekdays index (Sunday=0, ...)", + "type": "integer", + "minimum": 0, + "maximum": 6, + "example": 0 + }, + "secondsOfDay": { + "description": "The second of the weekday until the period is valid/which the period is valid from", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "example": 0 + } + }, + "required": [ + "weekday", + "secondsOfDay" + ], + "x-readme-ref-name": "TariffV2StaticPeriodTime" + }, + "feedinPrice": { + "description": "Price per kWh fed into the grid in the currency of the tariff.", + "type": "number", + "example": 0.09, + "default": 0 + }, + "offtakePrice": { + "description": "Price per kWh consumed from the grid in the currency of the tariff.", + "type": "number", + "example": 0.4, + "default": 0 + } + }, + "required": [ + "from", + "to" + ], + "x-readme-ref-name": "TariffV2StaticPeriod" + } + }, + "marketDataSettings": { + "title": "Market Data Settings", + "type": "object", + "description": "Settings specific to market-data-based tariffs.", + "properties": { + "feedinOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for feed-in tariffs.", + "example": 2.5 + }, + "offtakeOffset": { + "type": "number", + "description": "Sets the fee per kWh on top of market prices for off-take tariffs.", + "example": 2.5 + }, + "providerFee": { + "type": "number", + "description": "Additional fee per kWh on top, after applying VAT.", + "example": 10 + }, + "vat": { + "type": "number", + "description": "The VAT is the value-added tax rate expressed as a decimal number.", + "example": 0.12 + } + }, + "x-readme-ref-name": "AbstractMarketDataSettings" + } + }, + "x-readme-ref-name": "AbstractTariffV2" + } + ], + "x-readme-ref-name": "TariffV2Update" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TariffV2UpdateStrict" + }, + "AbstractEndpriceTariffV2Period": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + }, + "AbstractEndpriceTariffV2": { + "title": "End-price Tariff V2", + "description": "Represent a tariff v2 with end price periods.\nEnd prices are prices with applied offset, VAT and provider fee.\nIn contrast to normal \"TariffV2\" EndpriceTariffV2 always is for a particular interval\nand contains all periods for this interval.\n", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code (ISO 4217)", + "example": "EUR" + }, + "periods": { + "description": "List of periods containing end prices over non-overlapping periods. \nThe periods are sorted chronologically.\n", + "type": "array", + "items": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + } + } + }, + "x-readme-ref-name": "AbstractEndpriceTariffV2" + }, + "EndpriceTariffV2Period": { + "allOf": [ + { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + }, + { + "type": "object", + "required": [ + "marketPrice" + ] + } + ], + "x-readme-ref-name": "EndpriceTariffV2Period" + }, + "EndpriceTariffV2": { + "allOf": [ + { + "title": "End-price Tariff V2", + "description": "Represent a tariff v2 with end price periods.\nEnd prices are prices with applied offset, VAT and provider fee.\nIn contrast to normal \"TariffV2\" EndpriceTariffV2 always is for a particular interval\nand contains all periods for this interval.\n", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code (ISO 4217)", + "example": "EUR" + }, + "periods": { + "description": "List of periods containing end prices over non-overlapping periods. \nThe periods are sorted chronologically.\n", + "type": "array", + "items": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + } + } + }, + "x-readme-ref-name": "AbstractEndpriceTariffV2" + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the underlying TariffV2.", + "nullable": true + }, + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the contained periods starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the contained period ends in the RFC3339 format.\n" + }, + "periods": { + "items": { + "allOf": [ + { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + }, + { + "type": "object", + "required": [ + "marketPrice" + ] + } + ], + "x-readme-ref-name": "EndpriceTariffV2Period" + } + } + }, + "required": [ + "name", + "currency", + "from", + "to", + "periods" + ] + } + ], + "x-readme-ref-name": "EndpriceTariffV2" + }, + "EndPriceTariffV2Set": { + "allOf": [ + { + "title": "End-price Tariff V2", + "description": "Represent a tariff v2 with end price periods.\nEnd prices are prices with applied offset, VAT and provider fee.\nIn contrast to normal \"TariffV2\" EndpriceTariffV2 always is for a particular interval\nand contains all periods for this interval.\n", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code (ISO 4217)", + "example": "EUR" + }, + "periods": { + "description": "List of periods containing end prices over non-overlapping periods. \nThe periods are sorted chronologically.\n", + "type": "array", + "items": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + } + } + }, + "x-readme-ref-name": "AbstractEndpriceTariffV2" + }, + { + "type": "object", + "properties": { + "currency": { + "description": "Currency code (ISO 4217)\nIf not set, the currency of the tariff is used.\n" + }, + "periods": { + "minItems": 1 + } + }, + "required": [ + "periods" + ] + } + ], + "x-readme-ref-name": "EndPriceTariffV2Set" + }, + "EndPriceTariffV2SetStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "End-price Tariff V2", + "description": "Represent a tariff v2 with end price periods.\nEnd prices are prices with applied offset, VAT and provider fee.\nIn contrast to normal \"TariffV2\" EndpriceTariffV2 always is for a particular interval\nand contains all periods for this interval.\n", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code (ISO 4217)", + "example": "EUR" + }, + "periods": { + "description": "List of periods containing end prices over non-overlapping periods. \nThe periods are sorted chronologically.\n", + "type": "array", + "items": { + "title": "End-price Tariff V2 Period", + "type": "object", + "description": "Represents a period of a TariffV2 with end prices.\nEnd prices are prices with applied offset, VAT and provider fee.\n", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period starts in the RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Time at which the period ends in the RFC3339 format.\n" + }, + "feedinPrice": { + "type": "number", + "format": "double", + "example": 0.09, + "description": "Price including offset, VAT and provider fee per kWh for fed in energy in the period [from, to)." + }, + "offtakePrice": { + "type": "number", + "format": "double", + "example": 0.4, + "description": "Price including offset, VAT and provider fee per kWh for consumed energy in the period [from, to)." + }, + "marketPrice": { + "type": "number", + "nullable": true, + "format": "double", + "example": 0.15, + "description": "Raw market price (Day-Ahead EPEX Spot price with 60min resolution) per kWh at the time of this period in the bidding zone of the system.\nReturned regardless if underlying tariff has a market data type or not (if available).\n\nFor static tariffs (both offtake & feedin =STATIC) this can be `null`, when there is no market price for the requested period.\n" + } + }, + "required": [ + "from", + "to", + "feedinPrice", + "offtakePrice" + ], + "x-readme-ref-name": "AbstractEndpriceTariffV2Period" + } + } + }, + "x-readme-ref-name": "AbstractEndpriceTariffV2" + }, + { + "type": "object", + "properties": { + "currency": { + "description": "Currency code (ISO 4217)\nIf not set, the currency of the tariff is used.\n" + }, + "periods": { + "minItems": 1 + } + }, + "required": [ + "periods" + ] + } + ], + "x-readme-ref-name": "EndPriceTariffV2Set" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "EndPriceTariffV2SetStrict" + }, + "DecisionInsight": { + "type": "object", + "properties": { + "motives": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY_CHARGE_TO_COVER_LOAD", + "BATTERY_CHARGE_TO_DISCHARGE_TO_GRID", + "BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD", + "BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID", + "BATTERY_KEEP_TO_COVER_LOAD", + "BATTERY_KEEP_TO_DISCHARGE_TO_GRID", + "BATTERY_DISCHARGE_TO_GRID", + "EV_CHARGE_IN_LOW_PRICES", + "EV_CHARGE_TO_SATISFY_DESIRED_SOC", + "EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER", + "HEAT_PUMP_RECOMMEND_ON_MOTIVE" + ] + }, + "example": [ + "BATTERY_CHARGE_TO_COVER_LOAD" + ], + "description": "Identifies the motivation behind a ToU decision. The following insights are implemented:\n1. `BATTERY_CHARGE_TO_COVER_LOAD`: Charge the battery in low `import_price` to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n2. `BATTERY_CHARGE_TO_DISCHARGE_TO_GRID`: Charge the battery in low `import_price` to discharge to grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n3. `BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD`: Charge the battery from surplus to cover load later at higher import prices.\n4. `BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID`: Charge the battery from surplus to discharge to grid at higher export prices.\n5. `BATTERY_KEEP_TO_COVER_LOAD`: Delay battery discharge to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n6. `BATTERY_KEEP_TO_DISCHARGE_TO_GRID`: Delay battery discharge to the grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n7. `BATTERY_DISCHARGE_TO_GRID`: Discharge the battery into the grid to benefit from high export prices.\n8. `EV_CHARGE_IN_LOW_PRICES`: Charge the EV earlier in low `import_price`. The desired SoC expected to be met at `end_time`.\n9. `EV_CHARGE_TO_SATISFY_DESIRED_SOC`: Force Charge the EV from grid to ensure that the desired SoC at pre-defined departure time (regardless of prices).\n10. `EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER`: Prevent EV charge to allow PV surplus export at high export prices, and charge EV from grid later at lower import prices.\n11. `HEAT_PUMP_RECOMMEND_ON_MOTIVE`: Request increased heat pump operation, to avoid potential higher price periods or to use PV surplus.\n" + }, + "importPrice": { + "type": "number", + "example": 0.1, + "description": "Current import price at which the decision is taken.\n" + }, + "breakEvenImportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum import price at which using the stored energy later becomes more profitable than importing from grid, while accounting for battery efficiency losses.\n" + }, + "averageImportPrice": { + "type": "number", + "example": 0.1, + "description": "Average import price at which the stored energy was utilized.\n" + }, + "exportPrice": { + "type": "number", + "example": 0.1, + "description": "Current export price at which the decision is taken.\n" + }, + "breakEvenExportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum export price at which selling the stored energy to grid later becomes profitable, while accounting for battery efficiency losses.\n" + }, + "averageExportPrice": { + "type": "number", + "example": 0.1, + "description": "Average export price at which the stored energy was utilized.\n" + }, + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Refers to the start time of an upcoming event justifying the current decision (e.g., start of battery discharge to cover load / to grid).\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T01:00:00Z", + "description": "Refers to the end time of an upcoming event justifying the current decision (e.g., end of battery discharge to cover load / to grid).\n" + } + }, + "x-readme-ref-name": "DecisionInsight" + }, + "Decision": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time" + }, + "to": { + "type": "string", + "format": "date-time" + }, + "case_name": { + "type": "string", + "enum": [ + "BATTERY_SELF_CONSUMPTION", + "BATTERY_NO_DISCHARGE", + "BATTERY_CHARGE_FROM_GRID", + "BATTERY_DISCHARGE_TO_GRID", + "BATTERY_NO_CHARGE", + "BATTERY_LIMIT_CHARGE", + "BATTERY_LIMIT_DISCHARGE", + "BATTERY_UNDEFINED_DECISION", + "EV_NO_DECISION", + "EV_CHARGE_FROM_GRID", + "EV_NO_CHARGE", + "EV_LIMIT_CHARGE", + "EV_LIMIT_DISCHARGE", + "EV_UNDEFINED_DECISION", + "HEATPUMP_RECOMMEND_ON", + "HEATPUMP_AUTO", + "PV_CURTAILMENT", + "PV_NO_DECISION" + ], + "example": "BATTERY_CHARGE_FROM_GRID", + "description": "Identifies underlying the decision case that this decision is based on.\nThe following cases are implemented:\n1. `BATTERY_SELF_CONSUMPTION`: No time-of-use decision applied for the battery. In this case, the default\nself-consumption maximization logic applies to the battery.\n2. `BATTERY_NO_DISCHARGE`: Do not discharge the battery, even if there is demand and no PV surplus.\nDemand is served with power from the grid, instead of discharging the battery.\n3. `BATTERY_CHARGE_FROM_GRID`: Charge the battery with power for the grid, instead of only\ncharging the PV surplus. The battery is forced to charge with maximum charging power.\n4. `BATTERY_DISCHARGE_TO_GRID`: Discharge the battery into the grid, instead of only discharging to serve demand. \nDischarge of the battery may coincide with PV surplus, to benefit from high grid export prices charging the PV \nsurplus. The battery is forced to discharge with maximum power.\n5. `BATTERY_NO_CHARGE`: Do not charge the battery, even if there is PV surplus. PV surplus is injected\ninto the grid, instead of charging the battery.\n6. `BATTERY_LIMIT_CHARGE`: Limit the charging power of the battery, even if there is additional PV surplus.\n7. `BATTERY_LIMIT_DISCHARGE`: Limit the discharging power of the battery, even if there is additional demand.\n8. `BATTERY_UNDEFINED_DECISION`: Decision applied to the battery, but the decision cannot be mapped to any\nother decision case. This case is used as a fallback for newly implemented decision cases.\nself-consumption maximization logic applies to the battery.\n9. `EV_NO_DECISION`: No time-of-use decision applied for the EV. In this case, the default\ncharge logic applies to the EV, depending on the charge mode.\n10. `EV_CHARGE_FROM_GRID`: Charge the EV with power for the grid, instead of only\ncharging the PV surplus. The EV is forced to charge with maximum charging power.\n11. `EV_NO_CHARGE`: Do not charge the EV, even if there is PV surplus.\n12. `EV_LIMIT_CHARGE`: Limit the charging power of the EV.\n13. `EV_LIMIT_DISCHARGE`: Limit the discharging power of the EV.\n14. `EV_UNDEFINED_DECISION`: Decision applied to the EV, but the decision cannot be mapped to any\nother decision case. This case is used as a fallback for newly implemented decision cases.\n15. `HEATPUMP_RECOMMEND_ON`: Recommending the heat pump to switch on.\n16. `HEATPUMP_AUTO`: The heat pump is set to run in its energy-efficient normal mode.\n17. `PV_CURTAILMENT`: The PV production is curtailed to avoid grid export during periods of negative feed-in prices. \n18. `PV_NO_DECISION`: No time-of-use decision applied for the PV. \n" + }, + "insight": { + "type": "object", + "properties": { + "motives": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY_CHARGE_TO_COVER_LOAD", + "BATTERY_CHARGE_TO_DISCHARGE_TO_GRID", + "BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD", + "BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID", + "BATTERY_KEEP_TO_COVER_LOAD", + "BATTERY_KEEP_TO_DISCHARGE_TO_GRID", + "BATTERY_DISCHARGE_TO_GRID", + "EV_CHARGE_IN_LOW_PRICES", + "EV_CHARGE_TO_SATISFY_DESIRED_SOC", + "EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER", + "HEAT_PUMP_RECOMMEND_ON_MOTIVE" + ] + }, + "example": [ + "BATTERY_CHARGE_TO_COVER_LOAD" + ], + "description": "Identifies the motivation behind a ToU decision. The following insights are implemented:\n1. `BATTERY_CHARGE_TO_COVER_LOAD`: Charge the battery in low `import_price` to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n2. `BATTERY_CHARGE_TO_DISCHARGE_TO_GRID`: Charge the battery in low `import_price` to discharge to grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n3. `BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD`: Charge the battery from surplus to cover load later at higher import prices.\n4. `BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID`: Charge the battery from surplus to discharge to grid at higher export prices.\n5. `BATTERY_KEEP_TO_COVER_LOAD`: Delay battery discharge to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n6. `BATTERY_KEEP_TO_DISCHARGE_TO_GRID`: Delay battery discharge to the grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n7. `BATTERY_DISCHARGE_TO_GRID`: Discharge the battery into the grid to benefit from high export prices.\n8. `EV_CHARGE_IN_LOW_PRICES`: Charge the EV earlier in low `import_price`. The desired SoC expected to be met at `end_time`.\n9. `EV_CHARGE_TO_SATISFY_DESIRED_SOC`: Force Charge the EV from grid to ensure that the desired SoC at pre-defined departure time (regardless of prices).\n10. `EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER`: Prevent EV charge to allow PV surplus export at high export prices, and charge EV from grid later at lower import prices.\n11. `HEAT_PUMP_RECOMMEND_ON_MOTIVE`: Request increased heat pump operation, to avoid potential higher price periods or to use PV surplus.\n" + }, + "importPrice": { + "type": "number", + "example": 0.1, + "description": "Current import price at which the decision is taken.\n" + }, + "breakEvenImportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum import price at which using the stored energy later becomes more profitable than importing from grid, while accounting for battery efficiency losses.\n" + }, + "averageImportPrice": { + "type": "number", + "example": 0.1, + "description": "Average import price at which the stored energy was utilized.\n" + }, + "exportPrice": { + "type": "number", + "example": 0.1, + "description": "Current export price at which the decision is taken.\n" + }, + "breakEvenExportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum export price at which selling the stored energy to grid later becomes profitable, while accounting for battery efficiency losses.\n" + }, + "averageExportPrice": { + "type": "number", + "example": 0.1, + "description": "Average export price at which the stored energy was utilized.\n" + }, + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Refers to the start time of an upcoming event justifying the current decision (e.g., start of battery discharge to cover load / to grid).\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T01:00:00Z", + "description": "Refers to the end time of an upcoming event justifying the current decision (e.g., end of battery discharge to cover load / to grid).\n" + } + }, + "x-readme-ref-name": "DecisionInsight" + }, + "isPriceBasedOptimization": { + "type": "boolean", + "description": "Indicates if the decision is based on price. In most cases, decisions not based on price correspond to the \"default\" decision for a particular appliance type." + } + }, + "required": [ + "from", + "to", + "case_name", + "isPriceBasedOptimization" + ], + "x-readme-ref-name": "Decision" + }, + "DecisionMetrics": { + "type": "object", + "properties": { + "percent_decision_taken": { + "type": "number", + "format": "double", + "example": 75, + "description": "Percentage of the taken decisions as a share of the total possible decisions during this time interval. Taken decisions are all decisions excluding \"no-decision\" cases.\n" + } + }, + "required": [ + "percent_decision_taken" + ], + "x-readme-ref-name": "DecisionMetrics" + }, + "Decisions": { + "type": "object", + "properties": { + "decisions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time" + }, + "to": { + "type": "string", + "format": "date-time" + }, + "case_name": { + "type": "string", + "enum": [ + "BATTERY_SELF_CONSUMPTION", + "BATTERY_NO_DISCHARGE", + "BATTERY_CHARGE_FROM_GRID", + "BATTERY_DISCHARGE_TO_GRID", + "BATTERY_NO_CHARGE", + "BATTERY_LIMIT_CHARGE", + "BATTERY_LIMIT_DISCHARGE", + "BATTERY_UNDEFINED_DECISION", + "EV_NO_DECISION", + "EV_CHARGE_FROM_GRID", + "EV_NO_CHARGE", + "EV_LIMIT_CHARGE", + "EV_LIMIT_DISCHARGE", + "EV_UNDEFINED_DECISION", + "HEATPUMP_RECOMMEND_ON", + "HEATPUMP_AUTO", + "PV_CURTAILMENT", + "PV_NO_DECISION" + ], + "example": "BATTERY_CHARGE_FROM_GRID", + "description": "Identifies underlying the decision case that this decision is based on.\nThe following cases are implemented:\n1. `BATTERY_SELF_CONSUMPTION`: No time-of-use decision applied for the battery. In this case, the default\nself-consumption maximization logic applies to the battery.\n2. `BATTERY_NO_DISCHARGE`: Do not discharge the battery, even if there is demand and no PV surplus.\nDemand is served with power from the grid, instead of discharging the battery.\n3. `BATTERY_CHARGE_FROM_GRID`: Charge the battery with power for the grid, instead of only\ncharging the PV surplus. The battery is forced to charge with maximum charging power.\n4. `BATTERY_DISCHARGE_TO_GRID`: Discharge the battery into the grid, instead of only discharging to serve demand. \nDischarge of the battery may coincide with PV surplus, to benefit from high grid export prices charging the PV \nsurplus. The battery is forced to discharge with maximum power.\n5. `BATTERY_NO_CHARGE`: Do not charge the battery, even if there is PV surplus. PV surplus is injected\ninto the grid, instead of charging the battery.\n6. `BATTERY_LIMIT_CHARGE`: Limit the charging power of the battery, even if there is additional PV surplus.\n7. `BATTERY_LIMIT_DISCHARGE`: Limit the discharging power of the battery, even if there is additional demand.\n8. `BATTERY_UNDEFINED_DECISION`: Decision applied to the battery, but the decision cannot be mapped to any\nother decision case. This case is used as a fallback for newly implemented decision cases.\nself-consumption maximization logic applies to the battery.\n9. `EV_NO_DECISION`: No time-of-use decision applied for the EV. In this case, the default\ncharge logic applies to the EV, depending on the charge mode.\n10. `EV_CHARGE_FROM_GRID`: Charge the EV with power for the grid, instead of only\ncharging the PV surplus. The EV is forced to charge with maximum charging power.\n11. `EV_NO_CHARGE`: Do not charge the EV, even if there is PV surplus.\n12. `EV_LIMIT_CHARGE`: Limit the charging power of the EV.\n13. `EV_LIMIT_DISCHARGE`: Limit the discharging power of the EV.\n14. `EV_UNDEFINED_DECISION`: Decision applied to the EV, but the decision cannot be mapped to any\nother decision case. This case is used as a fallback for newly implemented decision cases.\n15. `HEATPUMP_RECOMMEND_ON`: Recommending the heat pump to switch on.\n16. `HEATPUMP_AUTO`: The heat pump is set to run in its energy-efficient normal mode.\n17. `PV_CURTAILMENT`: The PV production is curtailed to avoid grid export during periods of negative feed-in prices. \n18. `PV_NO_DECISION`: No time-of-use decision applied for the PV. \n" + }, + "insight": { + "type": "object", + "properties": { + "motives": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "BATTERY_CHARGE_TO_COVER_LOAD", + "BATTERY_CHARGE_TO_DISCHARGE_TO_GRID", + "BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD", + "BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID", + "BATTERY_KEEP_TO_COVER_LOAD", + "BATTERY_KEEP_TO_DISCHARGE_TO_GRID", + "BATTERY_DISCHARGE_TO_GRID", + "EV_CHARGE_IN_LOW_PRICES", + "EV_CHARGE_TO_SATISFY_DESIRED_SOC", + "EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER", + "HEAT_PUMP_RECOMMEND_ON_MOTIVE" + ] + }, + "example": [ + "BATTERY_CHARGE_TO_COVER_LOAD" + ], + "description": "Identifies the motivation behind a ToU decision. The following insights are implemented:\n1. `BATTERY_CHARGE_TO_COVER_LOAD`: Charge the battery in low `import_price` to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n2. `BATTERY_CHARGE_TO_DISCHARGE_TO_GRID`: Charge the battery in low `import_price` to discharge to grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n3. `BATTERY_CHARGE_SURPLUS_TO_COVER_LOAD`: Charge the battery from surplus to cover load later at higher import prices.\n4. `BATTERY_CHARGE_SURPLUS_TO_DISCHARGE_TO_GRID`: Charge the battery from surplus to discharge to grid at higher export prices.\n5. `BATTERY_KEEP_TO_COVER_LOAD`: Delay battery discharge to cover load at higher import prices (> `break_even_import_price`) between `start_time` and `end_time`.\n6. `BATTERY_KEEP_TO_DISCHARGE_TO_GRID`: Delay battery discharge to the grid at higher export prices (> `break_even_export_price`) between `start_time` and `end_time`.\n7. `BATTERY_DISCHARGE_TO_GRID`: Discharge the battery into the grid to benefit from high export prices.\n8. `EV_CHARGE_IN_LOW_PRICES`: Charge the EV earlier in low `import_price`. The desired SoC expected to be met at `end_time`.\n9. `EV_CHARGE_TO_SATISFY_DESIRED_SOC`: Force Charge the EV from grid to ensure that the desired SoC at pre-defined departure time (regardless of prices).\n10. `EV_KEEP_TO_EXPORT_SURPLUS_AND_CHARGE_FROM_GRID_LATER`: Prevent EV charge to allow PV surplus export at high export prices, and charge EV from grid later at lower import prices.\n11. `HEAT_PUMP_RECOMMEND_ON_MOTIVE`: Request increased heat pump operation, to avoid potential higher price periods or to use PV surplus.\n" + }, + "importPrice": { + "type": "number", + "example": 0.1, + "description": "Current import price at which the decision is taken.\n" + }, + "breakEvenImportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum import price at which using the stored energy later becomes more profitable than importing from grid, while accounting for battery efficiency losses.\n" + }, + "averageImportPrice": { + "type": "number", + "example": 0.1, + "description": "Average import price at which the stored energy was utilized.\n" + }, + "exportPrice": { + "type": "number", + "example": 0.1, + "description": "Current export price at which the decision is taken.\n" + }, + "breakEvenExportPrice": { + "type": "number", + "example": 0.1, + "description": "Refers to the minimum export price at which selling the stored energy to grid later becomes profitable, while accounting for battery efficiency losses.\n" + }, + "averageExportPrice": { + "type": "number", + "example": 0.1, + "description": "Average export price at which the stored energy was utilized.\n" + }, + "from": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z", + "description": "Refers to the start time of an upcoming event justifying the current decision (e.g., start of battery discharge to cover load / to grid).\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2020-09-21T01:00:00Z", + "description": "Refers to the end time of an upcoming event justifying the current decision (e.g., end of battery discharge to cover load / to grid).\n" + } + }, + "x-readme-ref-name": "DecisionInsight" + }, + "isPriceBasedOptimization": { + "type": "boolean", + "description": "Indicates if the decision is based on price. In most cases, decisions not based on price correspond to the \"default\" decision for a particular appliance type." + } + }, + "required": [ + "from", + "to", + "case_name", + "isPriceBasedOptimization" + ], + "x-readme-ref-name": "Decision" + } + }, + "metrics": { + "type": "object", + "properties": { + "percent_decision_taken": { + "type": "number", + "format": "double", + "example": 75, + "description": "Percentage of the taken decisions as a share of the total possible decisions during this time interval. Taken decisions are all decisions excluding \"no-decision\" cases.\n" + } + }, + "required": [ + "percent_decision_taken" + ], + "x-readme-ref-name": "DecisionMetrics" + } + }, + "required": [ + "decisions", + "metrics" + ], + "x-readme-ref-name": "Decisions" + }, + "TimeOfUseSettings": { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + "TimeOfUseSettingsPut": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "properties": { + "enabledBatteryChargeFromGrid": { + "default": true + }, + "enabledDischargeFlexibilityToGrid": { + "default": false + } + }, + "required": [ + "enabled" + ] + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPut" + }, + "TimeOfUseSettingsPutStrict": { + "allOf": [ + { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "properties": { + "enabledBatteryChargeFromGrid": { + "default": true + }, + "enabledDischargeFlexibilityToGrid": { + "default": false + } + }, + "required": [ + "enabled" + ] + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPut" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPutStrict" + }, + "TimeOfUseSettingsPatchStrict": { + "allOf": [ + { + "description": "Settings for the Time-of-Use (ToU) optimization feature.", + "type": "object", + "properties": { + "enabled": { + "description": "If `true`, Time-of-Use (ToU) optimization is enabled for this system.\n", + "type": "boolean", + "example": false + }, + "enabledBatteryChargeFromGrid": { + "description": "If `true`, the Time-of-Use (ToU) optimization is allowed to trigger charging of the battery while\nsimultaneously importing electricity from the grid. Default: `true`\n", + "example": true, + "type": "boolean" + }, + "enabledDischargeFlexibilityToGrid": { + "description": "If `true`, the Time-of-Use optimization is allowed to trigger discharging of electricity from any\nflexibility (battery and EVCS, when EVCS discharge is supported) into the grid. Default: `false`\n", + "example": false, + "type": "boolean" + }, + "enabledPVCurtailment": { + "type": "boolean", + "example": false, + "description": "If `true`, the Time-of-Use optimization allows curtailment of PV generation to prevent energy surplus feed-in\nduring negative export prices. Default: `false`\n" + } + }, + "x-readme-ref-name": "TimeOfUseSettings" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "TimeOfUseSettingsPatchStrict" + }, + "ToUErrorCode": { + "type": "string", + "enum": [ + "STATIC_PRICES", + "MISSING_PRICES", + "INCOMPLETE_PRICES", + "MISSING_APPLIANCES", + "MISSING_GRID_METER", + "MULTIPLE_GRID_METERS", + "MULTIPLE_BATTERIES", + "MULTIPLE_EVCS", + "MULTIPLE_HEAT_PUMPS", + "MULTIPLE_PVS_CURTAILMENT", + "MISSING_CONTROLLABLE_APPLIANCE", + "OFFLINE_APPLIANCE", + "EMS_NOT_ENABLED", + "EMS_CONSENT_NOT_GIVEN", + "UNKNOWN_INVERTER", + "INTERNAL_ERROR" + ], + "example": "INTERNAL_ERROR", + "description": "Most recent error causing a failure of Time-of-Use specific run.\n* `STATIC_PRICES` - Time-of-Use failing due to import and export prices are constant.\n* `MISSING_PRICES` - Time-of-Use failing due to missing import and export prices.\n* `INCOMPLETE_PRICES` - Time-of-Use failing due to incomplete import and export prices.\n* `MISSING_APPLIANCES` - Time-of-Use failing due to missing appliances in a system.\n* `MISSING_GRID_METER` - Time-of-Use failing due to missing grid meter.\n* `MULTIPLE_GRID_METERS` - Time-of-Use failing due to multiple grid meters within a system.\n* `MULTIPLE_BATTERIES` - Time-of-Use failing due to multiple batteries within a system.\n* `MULTIPLE_EVCS` - Time-of-Use failing due to multiple EV charging stations within a system.\n* `MULTIPLE_HEAT_PUMPS` - Time-of-Use failing due to multiple heat pumps within a system.\n* `MULTIPLE_PVS_CURTAILMENT` - Time-of-Use failing due to multiple PVs within a system with PV curtailment enabled.\n* `MISSING_CONTROLLABLE_APPLIANCE` - Time-of-Use failing due to missing controllable device (battery, EV or heat pump).\n* `OFFLINE_APPLIANCE` - Time-of-Use failing due to an offline appliance.\n* `EMS_NOT_ENABLED` - Time-of-Use failing due to energy management not being enabled on the system.\n* `EMS_CONSENT_NOT_GIVEN` - Time-of-Use failing due to consent to energy management not being given for the system.\n* `UNKNOWN_INVERTER` - Time-of-Use failing due to an unknown inverter.\n* `INTERNAL_ERROR` - Time-of-Use failing due to an unknown, internal issue.\n", + "x-readme-ref-name": "ToUErrorCode" + }, + "ToUWarnings": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "MISSING_EV_CONFIG", + "MISSING_EV_PROFILE", + "UNSUPPORTED_CHARGE_MODE_QUICK", + "UNSUPPORTED_CHARGE_MODE_SURPLUS", + "UNSUPPORTED_CHARGE_MODE_SAFETY", + "UNSUPPORTED_CHARGE_MODE_UNKNOWN" + ] + }, + "example": [ + "MISSING_EV_CONFIG" + ], + "description": "All the relevant warnings that occurred during a Time-of-Use specific run.\n\n* `MISSING_EV_CONFIG` - Time-of-Use not working optimally due to missing EV configuration.\n* `MISSING_EV_PROFILE` - Time-of-Use not working optimally due to missing EV profile.\n* `UNSUPPORTED_CHARGE_MODE_QUICK` - Time-of-Use not working optimally due to EV set to Quick Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SURPLUS` - Time-of-Use not working optimally due to EV set to Surplus Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_SAFETY` - Time-of-Use not working optimally due to EV set to Safety Charge Mode, which is not supported.\n* `UNSUPPORTED_CHARGE_MODE_UNKNOWN` - Time-of-Use not working optimally due to EV set to unknown charge mode.\n", + "x-readme-ref-name": "ToUWarnings" + }, + "ToUReadinessReason": { + "type": "string", + "enum": [ + "UNKNOWN_REASON", + "UNSUPPORTED_SETUP_NO_APPLIANCES_FOUND", + "UNSUPPORTED_SETUP_MULTIPLE_BATTERIES", + "UNSUPPORTED_SETUP_MULTIPLE_EVCS", + "UNSUPPORTED_SETUP_MULTIPLE_GRID_METERS", + "UNSUPPORTED_SETUP_MULTIPLE_HEAT_PUMPS", + "UNSUPPORTED_SETUP_NO_GRID_METER", + "UNSUPPORTED_SETUP_NO_CONTROLLABLE_APPLIANCE", + "UNSUPPORTED_SETUP_UNKNOWN_APPLIANCE", + "UNSUPPORTED_APPLIANCE_PV_INVERTER", + "UNSUPPORTED_APPLIANCE_BATTERY_INVERTER", + "UNSUPPORTED_APPLIANCE_EVCS", + "UNSUPPORTED_APPLIANCE_HEAT_PUMP", + "SYSTEM_LOCATION_MISSING", + "TARIFF_PRICES_NOT_SET", + "TARIFF_PRICES_NOT_DYNAMIC", + "TARIFF_PRICES_BIDDING_ZONE_NOT_SET" + ], + "example": "UNSUPPORTED_SETUP_NO_APPLIANCES_FOUND", + "description": "Justification for ToU Readiness truth value.\n", + "x-readme-ref-name": "ToUReadinessReason" + }, + "ToUReadiness": { + "type": "object", + "properties": { + "isTouReady": { + "type": "boolean", + "example": false, + "description": "Truth value whether system is ready for ToU.\n" + }, + "reasons": { + "type": "array", + "description": "List of reasons detailing the cause(s) of the truth value of ToU Readiness\n", + "items": { + "type": "string", + "enum": [ + "UNKNOWN_REASON", + "UNSUPPORTED_SETUP_NO_APPLIANCES_FOUND", + "UNSUPPORTED_SETUP_MULTIPLE_BATTERIES", + "UNSUPPORTED_SETUP_MULTIPLE_EVCS", + "UNSUPPORTED_SETUP_MULTIPLE_GRID_METERS", + "UNSUPPORTED_SETUP_MULTIPLE_HEAT_PUMPS", + "UNSUPPORTED_SETUP_NO_GRID_METER", + "UNSUPPORTED_SETUP_NO_CONTROLLABLE_APPLIANCE", + "UNSUPPORTED_SETUP_UNKNOWN_APPLIANCE", + "UNSUPPORTED_APPLIANCE_PV_INVERTER", + "UNSUPPORTED_APPLIANCE_BATTERY_INVERTER", + "UNSUPPORTED_APPLIANCE_EVCS", + "UNSUPPORTED_APPLIANCE_HEAT_PUMP", + "SYSTEM_LOCATION_MISSING", + "TARIFF_PRICES_NOT_SET", + "TARIFF_PRICES_NOT_DYNAMIC", + "TARIFF_PRICES_BIDDING_ZONE_NOT_SET" + ], + "example": "UNSUPPORTED_SETUP_NO_APPLIANCES_FOUND", + "description": "Justification for ToU Readiness truth value.\n", + "x-readme-ref-name": "ToUReadinessReason" + } + } + }, + "required": [ + "isTouReady" + ], + "x-readme-ref-name": "ToUReadiness" + }, + "Measurement": { + "title": "Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "example": "2018-04-01T00:10:00Z", + "description": "Date and time at which the data point was observed.\nFor power values the data point is written after the aggregated \ntime span. For energy values the observation is stored at the \nbeginning of the aggregated time span.\n" + }, + "grid": { + "type": "number", + "format": "double", + "description": "Grid is the measured power/energy at the grid connection point.\n\nFor power values, Positive values indicate supply, Negative values\nindicate feed in.\n" + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the power/energy measured at the grid connection point's \nfirst phase.\n" + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the power/energy measured at the grid connection point's \nsecond phase.\n" + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the power/energy measured at the grid connection point's \nthird phase.\n" + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells.\n" + }, + "production": { + "type": "number", + "format": "double", + "description": "Sum of all energy producing appliances (e.g. PV)." + }, + "battery": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + }, + "batteries": { + "type": "array", + "description": "Battery measurements for each battery in the system.", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "Aggregated measured power/energy for heat pumps.\n" + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "Aggregated measured power/energy for heat pumps that have their own \nheat pump tariff.\n" + }, + "heatPumps": { + "type": "array", + "description": "Heat pump measurements for each heat pump in the system.", + "items": { + "title": "Heat pump measurement", + "type": "object", + "properties": { + "applianceID": { + "type": "string" + }, + "power": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "HeatPumpMeasurement" + } + }, + "evChargingStation": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + }, + "evChargingStations": { + "type": "array", + "description": "Charging station measurements for all charging stations that are \npart of the system.\n", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system including heatpumps\nand EV charging stations.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "Power/Energy consumed through production and charged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "Power/energy consumed through production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the household through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the heat pump through production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the EV through production directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "Power/energy consumed by the heater through production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "Power/energy consumed through storage and production.\n" + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double", + "description": "Ratio of produced energy vs total consumed energy (0.0-1.0).\n", + "example": 0.9 + }, + "selfConsumptionRate": { + "type": "number", + "format": "double", + "description": "Ratio of self consumption vs production (0.0-1.0)." + }, + "directConsumptionRate": { + "type": "number", + "format": "double", + "description": "Ratio of direct consumption vs production (0.0-1.0)." + }, + "heating": { + "type": "number", + "format": "double", + "description": "Aggregated power/energy measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "Average temperature of the heaters in °C." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "Power of the appliances with misc location, empty for energy.\n" + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for grid in Ws (Imported Energy), empty for energy.\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for grid in Ws (Exported Energy), empty for energy.\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for heatpump in Ws (Imported Energy), empty for \nenergy.\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter Reading for heatpump in Ws (Exported Energy), empty for \nenergy.\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on \nphase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "description": "Number of times the fuse was protected, based on the curtailed power\nover all phases.\n" + } + }, + "x-readme-ref-name": "Measurement" + }, + "Measurements": { + "title": "Measurements", + "type": "object", + "properties": { + "total": { + "allOf": [ + { + "title": "Extended Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "description": "Time when the data was measured." + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the part of the grid connection point's first phase." + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the part of the grid connection point's second phase." + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the part of the grid connection point's second phase." + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells." + }, + "production": { + "type": "number", + "format": "double", + "description": "Production is sum of the producers." + }, + "batteries": { + "type": "array", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "HeatPump is the measured power/energy in front of the heat pumps." + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "HeatPumpExternal is the measured power/energy in front of the heat\npump which has its own heat pump tariff.\n" + }, + "evChargingStations": { + "type": "array", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Consumption is adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system which\nincludes heatpump and EV.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "SelfConsumption is power/energy consumed through production and\ncharged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "DirectConsumption is power/energy consumed from production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHousehold is power/energy consumed by the\nhousehold through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeatPump is power/energy consumed by the heat pump\nthrough production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "DirectConsumptionEV is power/energy consumed by the EV through\nproduction directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeater is the power/energy consumed by the heater\nthrough production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "SelfSupply is power/energy consumed through storage and production." + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double" + }, + "selfConsumptionRate": { + "type": "number", + "format": "double" + }, + "directConsumptionRate": { + "type": "number", + "format": "double" + }, + "heating": { + "type": "number", + "format": "double", + "description": "HeatingPower is the aggregated amount of power measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "HeatingTemperature is temperature of the heaters." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "AppliancePower is power of the appliances with misc location." + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Imported Energy).\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Exported Energy).\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingPositive is the meter Reading for HeatPump in Ws\n(Imported Energy).\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingNegative is the meter Reading for HeatPump in Ws\n(Exported Energy).\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "minimum": 0, + "description": "Number of times the fuse was protected, based on the curtailed power over all phases.\n" + }, + "grid": { + "title": "Measurement Grid", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + }, + "supplyLimit": { + "type": "number", + "format": "double" + }, + "meterReading": { + "title": "Measurement Grid Meter Reading", + "type": "object", + "properties": { + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "MeasurementGridMeterReading" + } + }, + "x-readme-ref-name": "MeasurementGrid" + }, + "battery": { + "title": "Extended Battery Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "Power/energy charged to the battery." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the battery." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of battery capacity charged (0.0-1.0).\n" + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Capacity is the maximum energy the battery can provide in Wh.\n" + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "NominalCapacity is the nominal capacity of battery in Wh.\n" + } + }, + "x-readme-ref-name": "MeasurementBatteryExtended" + }, + "evChargingStation": { + "title": "Extended EV Station Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "The measured charging power of the EV." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the EV." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of EV battery charged (0.0-1.0)." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current on the first phase of the EV station in A (ampere).\n" + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current on the second phase of the EV station in A." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current on the third phase of the EV station in A." + } + }, + "x-readme-ref-name": "MeasurementEVStationExtended" + } + }, + "x-readme-ref-name": "MeasurementExtended" + }, + { + "properties": { + "measuredAt": { + "description": "Interval containing all data points in the requested interval formatted in ISO8601.\n", + "type": "string", + "example": "2018-04-01T00:00:00Z/2018-04-05T00:00:00Z" + } + }, + "type": "object" + } + ] + }, + "data": { + "type": "array", + "items": { + "allOf": [ + { + "title": "Extended Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "description": "Time when the data was measured." + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the part of the grid connection point's first phase." + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the part of the grid connection point's second phase." + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the part of the grid connection point's second phase." + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells." + }, + "production": { + "type": "number", + "format": "double", + "description": "Production is sum of the producers." + }, + "batteries": { + "type": "array", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "HeatPump is the measured power/energy in front of the heat pumps." + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "HeatPumpExternal is the measured power/energy in front of the heat\npump which has its own heat pump tariff.\n" + }, + "evChargingStations": { + "type": "array", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Consumption is adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system which\nincludes heatpump and EV.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "SelfConsumption is power/energy consumed through production and\ncharged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "DirectConsumption is power/energy consumed from production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHousehold is power/energy consumed by the\nhousehold through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeatPump is power/energy consumed by the heat pump\nthrough production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "DirectConsumptionEV is power/energy consumed by the EV through\nproduction directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeater is the power/energy consumed by the heater\nthrough production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "SelfSupply is power/energy consumed through storage and production." + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double" + }, + "selfConsumptionRate": { + "type": "number", + "format": "double" + }, + "directConsumptionRate": { + "type": "number", + "format": "double" + }, + "heating": { + "type": "number", + "format": "double", + "description": "HeatingPower is the aggregated amount of power measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "HeatingTemperature is temperature of the heaters." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "AppliancePower is power of the appliances with misc location." + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Imported Energy).\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Exported Energy).\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingPositive is the meter Reading for HeatPump in Ws\n(Imported Energy).\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingNegative is the meter Reading for HeatPump in Ws\n(Exported Energy).\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "minimum": 0, + "description": "Number of times the fuse was protected, based on the curtailed power over all phases.\n" + }, + "grid": { + "title": "Measurement Grid", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + }, + "supplyLimit": { + "type": "number", + "format": "double" + }, + "meterReading": { + "title": "Measurement Grid Meter Reading", + "type": "object", + "properties": { + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "MeasurementGridMeterReading" + } + }, + "x-readme-ref-name": "MeasurementGrid" + }, + "battery": { + "title": "Extended Battery Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "Power/energy charged to the battery." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the battery." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of battery capacity charged (0.0-1.0).\n" + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Capacity is the maximum energy the battery can provide in Wh.\n" + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "NominalCapacity is the nominal capacity of battery in Wh.\n" + } + }, + "x-readme-ref-name": "MeasurementBatteryExtended" + }, + "evChargingStation": { + "title": "Extended EV Station Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "The measured charging power of the EV." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the EV." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of EV battery charged (0.0-1.0)." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current on the first phase of the EV station in A (ampere).\n" + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current on the second phase of the EV station in A." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current on the third phase of the EV station in A." + } + }, + "x-readme-ref-name": "MeasurementEVStationExtended" + } + }, + "x-readme-ref-name": "MeasurementExtended" + }, + { + "properties": { + "measuredAt": { + "format": "date-time" + } + } + } + ] + } + } + }, + "x-readme-ref-name": "Measurements" + }, + "MeasurementExtended": { + "title": "Extended Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "description": "Time when the data was measured." + }, + "gridL1": { + "type": "number", + "format": "double", + "description": "GridL1 is the part of the grid connection point's first phase." + }, + "gridL2": { + "type": "number", + "format": "double", + "description": "GridL2 is the part of the grid connection point's second phase." + }, + "gridL3": { + "type": "number", + "format": "double", + "description": "GridL3 is the part of the grid connection point's second phase." + }, + "gridSupplyLimit": { + "type": "number", + "format": "double", + "description": "GridSupplyLimit is the restriction of supplied power at the grid\nconnection point.\n" + }, + "photovoltaic": { + "type": "number", + "format": "double", + "description": "Photovoltaic is the measured power/energy in front of the\nphotovoltaic systems.\n" + }, + "photovoltaicExternal": { + "type": "number", + "format": "double", + "description": "PhotovoltaicExternal is the measured power/energy in front of the\nexternal photovoltaic systems.\n" + }, + "blockTypeThermalPowerStation": { + "type": "number", + "format": "double", + "description": "BTTPPower is the measured power for the block-type thermal power\nstation.\n" + }, + "fuelCell": { + "type": "number", + "format": "double", + "description": "FuelCell is the measured power/energy in front of the fuel cells." + }, + "production": { + "type": "number", + "format": "double", + "description": "Production is sum of the producers." + }, + "batteries": { + "type": "array", + "items": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + } + }, + "heatPump": { + "type": "number", + "format": "double", + "description": "HeatPump is the measured power/energy in front of the heat pumps." + }, + "heatPumpExternal": { + "type": "number", + "format": "double", + "description": "HeatPumpExternal is the measured power/energy in front of the heat\npump which has its own heat pump tariff.\n" + }, + "evChargingStations": { + "type": "array", + "items": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + } + }, + "consumption": { + "type": "number", + "format": "double", + "description": "Consumption is adjusted power/energy of the system." + }, + "totalConsumption": { + "type": "number", + "format": "double", + "description": "Adjusted power/energy of the system which\nincludes heatpump and EV.\n" + }, + "selfConsumption": { + "type": "number", + "format": "double", + "description": "SelfConsumption is power/energy consumed through production and\ncharged into battery.\n" + }, + "directConsumption": { + "type": "number", + "format": "double", + "description": "DirectConsumption is power/energy consumed from production directly.\n" + }, + "directConsumptionHousehold": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHousehold is power/energy consumed by the\nhousehold through production directly.\n" + }, + "directConsumptionHeatPump": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeatPump is power/energy consumed by the heat pump\nthrough production directly.\n" + }, + "directConsumptionEV": { + "type": "number", + "format": "double", + "description": "DirectConsumptionEV is power/energy consumed by the EV through\nproduction directly.\n" + }, + "directConsumptionHeater": { + "type": "number", + "format": "double", + "description": "DirectConsumptionHeater is the power/energy consumed by the heater\nthrough production directly.\n" + }, + "selfSupply": { + "type": "number", + "format": "double", + "description": "SelfSupply is power/energy consumed through storage and production." + }, + "selfSufficiencyRate": { + "type": "number", + "format": "double" + }, + "selfConsumptionRate": { + "type": "number", + "format": "double" + }, + "directConsumptionRate": { + "type": "number", + "format": "double" + }, + "heating": { + "type": "number", + "format": "double", + "description": "HeatingPower is the aggregated amount of power measured for heaters." + }, + "heatingTemperature": { + "type": "number", + "format": "double", + "description": "HeatingTemperature is temperature of the heaters." + }, + "heaters": { + "type": "array", + "description": "Heating measurement for all heaters that are part of the system.\n", + "items": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + } + }, + "appliancePower": { + "type": "number", + "format": "double", + "description": "AppliancePower is power of the appliances with misc location." + }, + "appliances": { + "type": "array", + "items": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + } + }, + "gridMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Imported Energy).\n" + }, + "gridMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "GridMeterReadingPositive is the meter Reading for grid in Ws\n(Exported Energy).\n" + }, + "heatPumpMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingPositive is the meter Reading for HeatPump in Ws\n(Imported Energy).\n" + }, + "heatPumpMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "HeatPumpMeterReadingNegative is the meter Reading for HeatPump in Ws\n(Exported Energy).\n" + }, + "windTurbine": { + "type": "number", + "format": "double" + }, + "fuelCellMeterReadingPositive": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Imported Energy)." + }, + "fuelCellMeterReadingNegative": { + "type": "number", + "format": "double", + "description": "Meter reading for FuelCell in Ws (Exported Energy)." + }, + "l1CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 1.\n" + }, + "l2CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 2.\n" + }, + "l3CurtailmentPower": { + "type": "number", + "format": "double", + "description": "Potential max. charging power minus the actual setpoint in Ws on phase 3.\n" + }, + "fuseProtectionCount": { + "type": "integer", + "minimum": 0, + "description": "Number of times the fuse was protected, based on the curtailed power over all phases.\n" + }, + "grid": { + "title": "Measurement Grid", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + }, + "supplyLimit": { + "type": "number", + "format": "double" + }, + "meterReading": { + "title": "Measurement Grid Meter Reading", + "type": "object", + "properties": { + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "MeasurementGridMeterReading" + } + }, + "x-readme-ref-name": "MeasurementGrid" + }, + "battery": { + "title": "Extended Battery Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "Power/energy charged to the battery." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the battery." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of battery capacity charged (0.0-1.0).\n" + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Capacity is the maximum energy the battery can provide in Wh.\n" + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "NominalCapacity is the nominal capacity of battery in Wh.\n" + } + }, + "x-readme-ref-name": "MeasurementBatteryExtended" + }, + "evChargingStation": { + "title": "Extended EV Station Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "The measured charging power of the EV." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the EV." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of EV battery charged (0.0-1.0)." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current on the first phase of the EV station in A (ampere).\n" + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current on the second phase of the EV station in A." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current on the third phase of the EV station in A." + } + }, + "x-readme-ref-name": "MeasurementEVStationExtended" + } + }, + "x-readme-ref-name": "MeasurementExtended" + }, + "MeasurementBatteryExtended": { + "title": "Extended Battery Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "Power/energy charged to the battery." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the battery." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of battery capacity charged (0.0-1.0).\n" + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Capacity is the maximum energy the battery can provide in Wh.\n" + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "NominalCapacity is the nominal capacity of battery in Wh.\n" + } + }, + "x-readme-ref-name": "MeasurementBatteryExtended" + }, + "MeasurementEVStationExtended": { + "title": "Extended EV Station Measurement", + "type": "object", + "properties": { + "charge": { + "type": "number", + "format": "double", + "description": "The measured charging power of the EV." + }, + "discharge": { + "type": "number", + "format": "double", + "description": "Power/energy discharged from the EV." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of EV battery charged (0.0-1.0)." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current on the first phase of the EV station in A (ampere).\n" + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current on the second phase of the EV station in A." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current on the third phase of the EV station in A." + } + }, + "x-readme-ref-name": "MeasurementEVStationExtended" + }, + "MeasurementGrid": { + "title": "Measurement Grid", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + }, + "supplyLimit": { + "type": "number", + "format": "double" + }, + "meterReading": { + "title": "Measurement Grid Meter Reading", + "type": "object", + "properties": { + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "MeasurementGridMeterReading" + } + }, + "x-readme-ref-name": "MeasurementGrid" + }, + "MeasurementGridMeterReading": { + "title": "Measurement Grid Meter Reading", + "type": "object", + "properties": { + "feedIn": { + "type": "number", + "format": "double" + }, + "supply": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "MeasurementGridMeterReading" + }, + "ApplianceMeasurement": { + "description": "Raw measurement of an appliance.", + "type": "object", + "oneOf": [ + { + "title": "Inverter's Measurements", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "gridFrequency": { + "type": "integer", + "format": "int32", + "description": "The locally measured grid frequency in centi (10^-2) Hz." + }, + "acCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current in mA." + }, + "l1ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L1 in mA." + }, + "l2ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L2 in mA." + }, + "l3ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L3 in mA." + }, + "l1ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L1 in mV." + }, + "l2ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L2 in mV." + }, + "l3ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L3 mV." + }, + "acActivePower": { + "type": "integer", + "format": "int32", + "description": "AC active power in mW." + }, + "acReactivePower": { + "type": "integer", + "format": "int32", + "description": "AC reactive power in VAr." + }, + "acApparentPower": { + "type": "integer", + "format": "int32", + "description": "AC apparent power VA." + }, + "dcCurrent": { + "type": "integer", + "format": "int32", + "description": "DC current in mA." + }, + "dcVoltage": { + "type": "integer", + "format": "int32", + "description": "DC voltage in mV." + }, + "dcPower": { + "type": "integer", + "format": "int32", + "description": "DC power in mW." + }, + "battery": { + "title": "A measurement produced by a battery (inverter).", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "capacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Capacity in Wh." + }, + "nominalCapacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Nominal capacity in Wh." + }, + "stateOfCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, state of charge in percent." + }, + "stateOfHealth": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, health of the battery in percent." + }, + "temperature": { + "type": "integer", + "format": "int32", + "description": "Temperature of the battery in degrees Celsius." + }, + "presentCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current charge of the battery in mW." + }, + "presentDischarge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current discharge of the battery in mW." + } + }, + "x-readme-ref-name": "BatteryMeasurementRaw" + } + }, + "required": [ + "measuredAt" + ], + "x-readme-ref-name": "InverterMeasurement" + }, + { + "title": "Meter's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "l1ActivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power in mW." + }, + "l1ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power Reading (Imported Energy) in Ws." + }, + "l1ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l1ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power in VAr." + }, + "l1ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Imported Energy) in VArs." + }, + "l1ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Exported Energy) in VArs." + }, + "l1ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power in VA." + }, + "l1ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Imported Energy) in VAs." + }, + "l1ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Exported Energy) in VAs." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "L1 Current in mA." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "L1 Voltage in mV." + }, + "l1ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L1 maximum imported power in mW." + }, + "l2ActivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power in mW." + }, + "l2ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Imported Energy) in Ws." + }, + "l2ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l2ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power in VAr." + }, + "l2ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Imported Energy) in VArs." + }, + "l2ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Exported Energy) in VArs." + }, + "l2ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power in VA." + }, + "l2ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Imported Energy) in VAs." + }, + "l2ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Exported Energy) in VAs." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "L2 Current in mA." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "L2 Voltage in mV." + }, + "l2ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L2 maximum imported power in mW." + }, + "l3ActivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power in mW." + }, + "l3ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Imported Energy) in Ws." + }, + "l3ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Exported Energy) in Ws." + }, + "l3ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power in VAr." + }, + "l3ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Imported Energy) in VArs." + }, + "l3ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Exported Energy) in VArs." + }, + "l3ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power in VA." + }, + "l3ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Imported Energy) in VAs." + }, + "l3ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Exported Energy) in VAs." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "L3 Current in mA." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "L3 Voltage in mV." + }, + "l3ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L3 maximum imported power in mW." + }, + "sumActivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power in mW." + }, + "sumActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Imported Energy) in Ws." + }, + "sumActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Exported Energy) in Ws." + }, + "sumApparentPower": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power in VA." + }, + "sumApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Imported Energy) in VAs." + }, + "sumApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Exported Energy) in VAs." + }, + "sumReactivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power in VA." + }, + "sumReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Imported Energy) in VAs." + }, + "sumReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Exported Energy) in VAs." + }, + "sumImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "Sum Maximum imported power in mW." + }, + "sumPowerFactor": { + "type": "integer", + "format": "int32", + "description": "Power factor in deg." + } + }, + "x-readme-ref-name": "AUXMeterMeasurement" + }, + { + "title": "EV Charging Station's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Date and time the data point was collected." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for first phase in mW." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for second phase in mW." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for third phase in mW." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "Current for first phase in mA." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "Current for second phase in mA." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "Current for third phase in mA." + }, + "realPower": { + "type": "integer", + "format": "int64", + "description": "Real Power in mW. Positive values mean charging, negative values\nmean discharging (V2G; currently not done).\n" + }, + "powerFactor": { + "type": "integer", + "format": "int32", + "description": "Power Factor in 0.1% (cosphi)." + }, + "l1RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L1 in mW." + }, + "l2RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L2 in mW." + }, + "l3RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L3 in mW." + }, + "temperature": { + "type": "integer", + "format": "int64", + "description": "Temperature inside the charging station in °C." + }, + "capacity": { + "type": "integer", + "format": "int32", + "description": "The total capacity of the EV battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "The current state of charge of the EV battery in percent from 0.0 -\n100.0%.\n" + }, + "maxCharge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed charge power in mW." + }, + "minCharge": { + "type": "integer", + "format": "int32", + "description": "Minimum allowed charge power in mW, below this power the EV won't\ncharge.\n" + }, + "maxDischarge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed discharge power in mW." + }, + "stationState": { + "type": "string", + "description": "State indicating whether the charging station is charging, ready, in\nerror state, etc.\n" + }, + "plugState": { + "type": "string", + "description": "State indicates whether an EV is plugged into the charging station.\n" + }, + "pluggedIn": { + "type": "boolean", + "description": "PluggedIn true if an electric vehicle is currently plugged into the\ncharging station.\n" + }, + "tokenID": { + "type": "string", + "description": "TokenID is the used authentication token at the charging station.\n" + } + }, + "x-readme-ref-name": "EVChargingStationMeasurement" + }, + { + "title": "A measurement produced by a heatpump appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "power": { + "type": "integer", + "description": "Power of the heatpump in mW." + }, + "powerL1": { + "type": "integer", + "description": "Power for the first phase in mW ." + }, + "powerL2": { + "type": "integer" + }, + "powerL3": { + "type": "integer" + }, + "minPower": { + "type": "integer" + }, + "maxPower": { + "type": "integer" + }, + "readyState": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "averageTemperature": { + "type": "number", + "format": "double" + }, + "controlledTemperature": { + "type": "number", + "format": "double" + }, + "baseLineTemperature": { + "type": "number", + "format": "double" + }, + "heatSourceTemperature": { + "type": "number", + "format": "double" + }, + "outdoorTemperature": { + "type": "number", + "format": "double" + }, + "operationStatus": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "HEATING", + "DRINKING_HOT_WATER", + "POOL_HEATING", + "EVU_LOCK", + "DEFROST", + "OFF", + "EXTERNAL_SOURCE", + "COOLING" + ] + }, + "energyHeating": { + "type": "number", + "format": "double" + }, + "energyDrinkingHotWater": { + "type": "number", + "format": "double" + } + }, + "required": [ + "operationStatus" + ], + "x-readme-ref-name": "HeatPumpMeasurementRaw" + }, + { + "title": "A measurement produced by a heater appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "flowRate": { + "type": "number", + "format": "double", + "description": "Volumetric flow rate given in m³/s." + }, + "readingPositive": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was gained during circulation from inflow to outflow in Wh." + }, + "readingNegative": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was consumed during circulation from inflow to outflow in Wh." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power in mW." + }, + "inflowTemperature": { + "type": "number", + "format": "double", + "description": "Inflow temperature given in °C" + }, + "outflowTemperature": { + "type": "number", + "format": "double", + "description": "Outflow temperature given in °C" + } + }, + "x-readme-ref-name": "HeaterMeasurementRaw" + }, + { + "title": "Electrolyzer Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "status": { + "type": "integer", + "format": "int32", + "description": "Status is the local mode of the electrolyzer." + }, + "statusPurification": { + "type": "boolean", + "description": "StatusPurification is the purification status of the electrolyzer. 0 means no regeneration is in progress." + }, + "flowSetpoint": { + "type": "number", + "format": "double", + "description": "Flow Setpoint value set by the customer in Nm3/h." + }, + "hydrogenFlow": { + "type": "number", + "format": "double", + "description": "Hydrogen Flow leaving the electrolyzer in Nm3/h." + }, + "pressure": { + "type": "number", + "format": "double", + "description": "Pressure in the electrolyzer in barg." + }, + "rectifierEnergy1": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 400V in kW." + }, + "rectifierEnergy2": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 21KV in kW." + }, + "bufferPressure": { + "type": "number", + "format": "double", + "description": "Buffer Pressure of the Electrolyzer in barg." + }, + "productionTime": { + "type": "number", + "format": "double", + "description": "Production Time in hours." + }, + "timeUntilMaintanance": { + "type": "number", + "format": "double", + "description": "Time until maintenance in hours." + }, + "pipelinePressure": { + "type": "number", + "format": "double", + "description": "Pipeline pressure in bar." + }, + "customerHydrogenFlow1": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by the customer." + }, + "customerHydrogenFlow2": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow3": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow4": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow5": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + } + }, + "x-readme-ref-name": "ElectrolyzerMeasurement" + } + ], + "x-readme-ref-name": "ApplianceMeasurement" + }, + "ApplianceMeasurements": { + "description": "List of raw measurements of an appliance.", + "type": "array", + "items": { + "description": "Raw measurement of an appliance.", + "type": "object", + "oneOf": [ + { + "title": "Inverter's Measurements", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "gridFrequency": { + "type": "integer", + "format": "int32", + "description": "The locally measured grid frequency in centi (10^-2) Hz." + }, + "acCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current in mA." + }, + "l1ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L1 in mA." + }, + "l2ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L2 in mA." + }, + "l3ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L3 in mA." + }, + "l1ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L1 in mV." + }, + "l2ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L2 in mV." + }, + "l3ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L3 mV." + }, + "acActivePower": { + "type": "integer", + "format": "int32", + "description": "AC active power in mW." + }, + "acReactivePower": { + "type": "integer", + "format": "int32", + "description": "AC reactive power in VAr." + }, + "acApparentPower": { + "type": "integer", + "format": "int32", + "description": "AC apparent power VA." + }, + "dcCurrent": { + "type": "integer", + "format": "int32", + "description": "DC current in mA." + }, + "dcVoltage": { + "type": "integer", + "format": "int32", + "description": "DC voltage in mV." + }, + "dcPower": { + "type": "integer", + "format": "int32", + "description": "DC power in mW." + }, + "battery": { + "title": "A measurement produced by a battery (inverter).", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "capacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Capacity in Wh." + }, + "nominalCapacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Nominal capacity in Wh." + }, + "stateOfCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, state of charge in percent." + }, + "stateOfHealth": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, health of the battery in percent." + }, + "temperature": { + "type": "integer", + "format": "int32", + "description": "Temperature of the battery in degrees Celsius." + }, + "presentCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current charge of the battery in mW." + }, + "presentDischarge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current discharge of the battery in mW." + } + }, + "x-readme-ref-name": "BatteryMeasurementRaw" + } + }, + "required": [ + "measuredAt" + ], + "x-readme-ref-name": "InverterMeasurement" + }, + { + "title": "Meter's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "l1ActivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power in mW." + }, + "l1ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power Reading (Imported Energy) in Ws." + }, + "l1ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l1ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power in VAr." + }, + "l1ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Imported Energy) in VArs." + }, + "l1ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Exported Energy) in VArs." + }, + "l1ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power in VA." + }, + "l1ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Imported Energy) in VAs." + }, + "l1ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Exported Energy) in VAs." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "L1 Current in mA." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "L1 Voltage in mV." + }, + "l1ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L1 maximum imported power in mW." + }, + "l2ActivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power in mW." + }, + "l2ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Imported Energy) in Ws." + }, + "l2ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l2ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power in VAr." + }, + "l2ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Imported Energy) in VArs." + }, + "l2ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Exported Energy) in VArs." + }, + "l2ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power in VA." + }, + "l2ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Imported Energy) in VAs." + }, + "l2ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Exported Energy) in VAs." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "L2 Current in mA." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "L2 Voltage in mV." + }, + "l2ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L2 maximum imported power in mW." + }, + "l3ActivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power in mW." + }, + "l3ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Imported Energy) in Ws." + }, + "l3ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Exported Energy) in Ws." + }, + "l3ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power in VAr." + }, + "l3ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Imported Energy) in VArs." + }, + "l3ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Exported Energy) in VArs." + }, + "l3ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power in VA." + }, + "l3ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Imported Energy) in VAs." + }, + "l3ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Exported Energy) in VAs." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "L3 Current in mA." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "L3 Voltage in mV." + }, + "l3ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L3 maximum imported power in mW." + }, + "sumActivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power in mW." + }, + "sumActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Imported Energy) in Ws." + }, + "sumActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Exported Energy) in Ws." + }, + "sumApparentPower": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power in VA." + }, + "sumApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Imported Energy) in VAs." + }, + "sumApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Exported Energy) in VAs." + }, + "sumReactivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power in VA." + }, + "sumReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Imported Energy) in VAs." + }, + "sumReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Exported Energy) in VAs." + }, + "sumImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "Sum Maximum imported power in mW." + }, + "sumPowerFactor": { + "type": "integer", + "format": "int32", + "description": "Power factor in deg." + } + }, + "x-readme-ref-name": "AUXMeterMeasurement" + }, + { + "title": "EV Charging Station's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Date and time the data point was collected." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for first phase in mW." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for second phase in mW." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for third phase in mW." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "Current for first phase in mA." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "Current for second phase in mA." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "Current for third phase in mA." + }, + "realPower": { + "type": "integer", + "format": "int64", + "description": "Real Power in mW. Positive values mean charging, negative values\nmean discharging (V2G; currently not done).\n" + }, + "powerFactor": { + "type": "integer", + "format": "int32", + "description": "Power Factor in 0.1% (cosphi)." + }, + "l1RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L1 in mW." + }, + "l2RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L2 in mW." + }, + "l3RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L3 in mW." + }, + "temperature": { + "type": "integer", + "format": "int64", + "description": "Temperature inside the charging station in °C." + }, + "capacity": { + "type": "integer", + "format": "int32", + "description": "The total capacity of the EV battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "The current state of charge of the EV battery in percent from 0.0 -\n100.0%.\n" + }, + "maxCharge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed charge power in mW." + }, + "minCharge": { + "type": "integer", + "format": "int32", + "description": "Minimum allowed charge power in mW, below this power the EV won't\ncharge.\n" + }, + "maxDischarge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed discharge power in mW." + }, + "stationState": { + "type": "string", + "description": "State indicating whether the charging station is charging, ready, in\nerror state, etc.\n" + }, + "plugState": { + "type": "string", + "description": "State indicates whether an EV is plugged into the charging station.\n" + }, + "pluggedIn": { + "type": "boolean", + "description": "PluggedIn true if an electric vehicle is currently plugged into the\ncharging station.\n" + }, + "tokenID": { + "type": "string", + "description": "TokenID is the used authentication token at the charging station.\n" + } + }, + "x-readme-ref-name": "EVChargingStationMeasurement" + }, + { + "title": "A measurement produced by a heatpump appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "power": { + "type": "integer", + "description": "Power of the heatpump in mW." + }, + "powerL1": { + "type": "integer", + "description": "Power for the first phase in mW ." + }, + "powerL2": { + "type": "integer" + }, + "powerL3": { + "type": "integer" + }, + "minPower": { + "type": "integer" + }, + "maxPower": { + "type": "integer" + }, + "readyState": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "averageTemperature": { + "type": "number", + "format": "double" + }, + "controlledTemperature": { + "type": "number", + "format": "double" + }, + "baseLineTemperature": { + "type": "number", + "format": "double" + }, + "heatSourceTemperature": { + "type": "number", + "format": "double" + }, + "outdoorTemperature": { + "type": "number", + "format": "double" + }, + "operationStatus": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "HEATING", + "DRINKING_HOT_WATER", + "POOL_HEATING", + "EVU_LOCK", + "DEFROST", + "OFF", + "EXTERNAL_SOURCE", + "COOLING" + ] + }, + "energyHeating": { + "type": "number", + "format": "double" + }, + "energyDrinkingHotWater": { + "type": "number", + "format": "double" + } + }, + "required": [ + "operationStatus" + ], + "x-readme-ref-name": "HeatPumpMeasurementRaw" + }, + { + "title": "A measurement produced by a heater appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "flowRate": { + "type": "number", + "format": "double", + "description": "Volumetric flow rate given in m³/s." + }, + "readingPositive": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was gained during circulation from inflow to outflow in Wh." + }, + "readingNegative": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was consumed during circulation from inflow to outflow in Wh." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power in mW." + }, + "inflowTemperature": { + "type": "number", + "format": "double", + "description": "Inflow temperature given in °C" + }, + "outflowTemperature": { + "type": "number", + "format": "double", + "description": "Outflow temperature given in °C" + } + }, + "x-readme-ref-name": "HeaterMeasurementRaw" + }, + { + "title": "Electrolyzer Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "status": { + "type": "integer", + "format": "int32", + "description": "Status is the local mode of the electrolyzer." + }, + "statusPurification": { + "type": "boolean", + "description": "StatusPurification is the purification status of the electrolyzer. 0 means no regeneration is in progress." + }, + "flowSetpoint": { + "type": "number", + "format": "double", + "description": "Flow Setpoint value set by the customer in Nm3/h." + }, + "hydrogenFlow": { + "type": "number", + "format": "double", + "description": "Hydrogen Flow leaving the electrolyzer in Nm3/h." + }, + "pressure": { + "type": "number", + "format": "double", + "description": "Pressure in the electrolyzer in barg." + }, + "rectifierEnergy1": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 400V in kW." + }, + "rectifierEnergy2": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 21KV in kW." + }, + "bufferPressure": { + "type": "number", + "format": "double", + "description": "Buffer Pressure of the Electrolyzer in barg." + }, + "productionTime": { + "type": "number", + "format": "double", + "description": "Production Time in hours." + }, + "timeUntilMaintanance": { + "type": "number", + "format": "double", + "description": "Time until maintenance in hours." + }, + "pipelinePressure": { + "type": "number", + "format": "double", + "description": "Pipeline pressure in bar." + }, + "customerHydrogenFlow1": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by the customer." + }, + "customerHydrogenFlow2": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow3": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow4": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow5": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + } + }, + "x-readme-ref-name": "ElectrolyzerMeasurement" + } + ], + "x-readme-ref-name": "ApplianceMeasurement" + }, + "x-readme-ref-name": "ApplianceMeasurements" + }, + "CombinedMeasurement": { + "type": "object", + "description": "Combined appliance and energy management measurement.", + "allOf": [ + { + "oneOf": [ + { + "title": "Inverter's Measurements", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "gridFrequency": { + "type": "integer", + "format": "int32", + "description": "The locally measured grid frequency in centi (10^-2) Hz." + }, + "acCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current in mA." + }, + "l1ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L1 in mA." + }, + "l2ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L2 in mA." + }, + "l3ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L3 in mA." + }, + "l1ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L1 in mV." + }, + "l2ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L2 in mV." + }, + "l3ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L3 mV." + }, + "acActivePower": { + "type": "integer", + "format": "int32", + "description": "AC active power in mW." + }, + "acReactivePower": { + "type": "integer", + "format": "int32", + "description": "AC reactive power in VAr." + }, + "acApparentPower": { + "type": "integer", + "format": "int32", + "description": "AC apparent power VA." + }, + "dcCurrent": { + "type": "integer", + "format": "int32", + "description": "DC current in mA." + }, + "dcVoltage": { + "type": "integer", + "format": "int32", + "description": "DC voltage in mV." + }, + "dcPower": { + "type": "integer", + "format": "int32", + "description": "DC power in mW." + }, + "battery": { + "title": "A measurement produced by a battery (inverter).", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "capacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Capacity in Wh." + }, + "nominalCapacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Nominal capacity in Wh." + }, + "stateOfCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, state of charge in percent." + }, + "stateOfHealth": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, health of the battery in percent." + }, + "temperature": { + "type": "integer", + "format": "int32", + "description": "Temperature of the battery in degrees Celsius." + }, + "presentCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current charge of the battery in mW." + }, + "presentDischarge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current discharge of the battery in mW." + } + }, + "x-readme-ref-name": "BatteryMeasurementRaw" + } + }, + "required": [ + "measuredAt" + ], + "x-readme-ref-name": "InverterMeasurement" + }, + { + "title": "Meter's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "l1ActivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power in mW." + }, + "l1ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power Reading (Imported Energy) in Ws." + }, + "l1ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l1ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power in VAr." + }, + "l1ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Imported Energy) in VArs." + }, + "l1ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Exported Energy) in VArs." + }, + "l1ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power in VA." + }, + "l1ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Imported Energy) in VAs." + }, + "l1ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Exported Energy) in VAs." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "L1 Current in mA." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "L1 Voltage in mV." + }, + "l1ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L1 maximum imported power in mW." + }, + "l2ActivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power in mW." + }, + "l2ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Imported Energy) in Ws." + }, + "l2ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l2ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power in VAr." + }, + "l2ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Imported Energy) in VArs." + }, + "l2ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Exported Energy) in VArs." + }, + "l2ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power in VA." + }, + "l2ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Imported Energy) in VAs." + }, + "l2ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Exported Energy) in VAs." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "L2 Current in mA." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "L2 Voltage in mV." + }, + "l2ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L2 maximum imported power in mW." + }, + "l3ActivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power in mW." + }, + "l3ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Imported Energy) in Ws." + }, + "l3ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Exported Energy) in Ws." + }, + "l3ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power in VAr." + }, + "l3ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Imported Energy) in VArs." + }, + "l3ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Exported Energy) in VArs." + }, + "l3ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power in VA." + }, + "l3ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Imported Energy) in VAs." + }, + "l3ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Exported Energy) in VAs." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "L3 Current in mA." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "L3 Voltage in mV." + }, + "l3ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L3 maximum imported power in mW." + }, + "sumActivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power in mW." + }, + "sumActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Imported Energy) in Ws." + }, + "sumActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Exported Energy) in Ws." + }, + "sumApparentPower": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power in VA." + }, + "sumApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Imported Energy) in VAs." + }, + "sumApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Exported Energy) in VAs." + }, + "sumReactivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power in VA." + }, + "sumReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Imported Energy) in VAs." + }, + "sumReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Exported Energy) in VAs." + }, + "sumImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "Sum Maximum imported power in mW." + }, + "sumPowerFactor": { + "type": "integer", + "format": "int32", + "description": "Power factor in deg." + } + }, + "x-readme-ref-name": "AUXMeterMeasurement" + }, + { + "title": "EV Charging Station's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Date and time the data point was collected." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for first phase in mW." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for second phase in mW." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for third phase in mW." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "Current for first phase in mA." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "Current for second phase in mA." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "Current for third phase in mA." + }, + "realPower": { + "type": "integer", + "format": "int64", + "description": "Real Power in mW. Positive values mean charging, negative values\nmean discharging (V2G; currently not done).\n" + }, + "powerFactor": { + "type": "integer", + "format": "int32", + "description": "Power Factor in 0.1% (cosphi)." + }, + "l1RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L1 in mW." + }, + "l2RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L2 in mW." + }, + "l3RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L3 in mW." + }, + "temperature": { + "type": "integer", + "format": "int64", + "description": "Temperature inside the charging station in °C." + }, + "capacity": { + "type": "integer", + "format": "int32", + "description": "The total capacity of the EV battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "The current state of charge of the EV battery in percent from 0.0 -\n100.0%.\n" + }, + "maxCharge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed charge power in mW." + }, + "minCharge": { + "type": "integer", + "format": "int32", + "description": "Minimum allowed charge power in mW, below this power the EV won't\ncharge.\n" + }, + "maxDischarge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed discharge power in mW." + }, + "stationState": { + "type": "string", + "description": "State indicating whether the charging station is charging, ready, in\nerror state, etc.\n" + }, + "plugState": { + "type": "string", + "description": "State indicates whether an EV is plugged into the charging station.\n" + }, + "pluggedIn": { + "type": "boolean", + "description": "PluggedIn true if an electric vehicle is currently plugged into the\ncharging station.\n" + }, + "tokenID": { + "type": "string", + "description": "TokenID is the used authentication token at the charging station.\n" + } + }, + "x-readme-ref-name": "EVChargingStationMeasurement" + }, + { + "title": "A measurement produced by a heatpump appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "power": { + "type": "integer", + "description": "Power of the heatpump in mW." + }, + "powerL1": { + "type": "integer", + "description": "Power for the first phase in mW ." + }, + "powerL2": { + "type": "integer" + }, + "powerL3": { + "type": "integer" + }, + "minPower": { + "type": "integer" + }, + "maxPower": { + "type": "integer" + }, + "readyState": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "averageTemperature": { + "type": "number", + "format": "double" + }, + "controlledTemperature": { + "type": "number", + "format": "double" + }, + "baseLineTemperature": { + "type": "number", + "format": "double" + }, + "heatSourceTemperature": { + "type": "number", + "format": "double" + }, + "outdoorTemperature": { + "type": "number", + "format": "double" + }, + "operationStatus": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "HEATING", + "DRINKING_HOT_WATER", + "POOL_HEATING", + "EVU_LOCK", + "DEFROST", + "OFF", + "EXTERNAL_SOURCE", + "COOLING" + ] + }, + "energyHeating": { + "type": "number", + "format": "double" + }, + "energyDrinkingHotWater": { + "type": "number", + "format": "double" + } + }, + "required": [ + "operationStatus" + ], + "x-readme-ref-name": "HeatPumpMeasurementRaw" + }, + { + "title": "A measurement produced by a heater appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "flowRate": { + "type": "number", + "format": "double", + "description": "Volumetric flow rate given in m³/s." + }, + "readingPositive": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was gained during circulation from inflow to outflow in Wh." + }, + "readingNegative": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was consumed during circulation from inflow to outflow in Wh." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power in mW." + }, + "inflowTemperature": { + "type": "number", + "format": "double", + "description": "Inflow temperature given in °C" + }, + "outflowTemperature": { + "type": "number", + "format": "double", + "description": "Outflow temperature given in °C" + } + }, + "x-readme-ref-name": "HeaterMeasurementRaw" + }, + { + "title": "Electrolyzer Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "status": { + "type": "integer", + "format": "int32", + "description": "Status is the local mode of the electrolyzer." + }, + "statusPurification": { + "type": "boolean", + "description": "StatusPurification is the purification status of the electrolyzer. 0 means no regeneration is in progress." + }, + "flowSetpoint": { + "type": "number", + "format": "double", + "description": "Flow Setpoint value set by the customer in Nm3/h." + }, + "hydrogenFlow": { + "type": "number", + "format": "double", + "description": "Hydrogen Flow leaving the electrolyzer in Nm3/h." + }, + "pressure": { + "type": "number", + "format": "double", + "description": "Pressure in the electrolyzer in barg." + }, + "rectifierEnergy1": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 400V in kW." + }, + "rectifierEnergy2": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 21KV in kW." + }, + "bufferPressure": { + "type": "number", + "format": "double", + "description": "Buffer Pressure of the Electrolyzer in barg." + }, + "productionTime": { + "type": "number", + "format": "double", + "description": "Production Time in hours." + }, + "timeUntilMaintanance": { + "type": "number", + "format": "double", + "description": "Time until maintenance in hours." + }, + "pipelinePressure": { + "type": "number", + "format": "double", + "description": "Pipeline pressure in bar." + }, + "customerHydrogenFlow1": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by the customer." + }, + "customerHydrogenFlow2": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow3": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow4": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow5": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + } + }, + "x-readme-ref-name": "ElectrolyzerMeasurement" + } + ] + }, + { + "type": "object", + "properties": { + "energyManagement": { + "title": "Energy Management Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "strategyID": { + "type": "string", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "dynamicFeedInCurtailment": { + "type": "boolean", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "prognosisBasedBatteryCharging": { + "type": "boolean", + "description": "True if a forecast is used to determine the future feed-in into the\nbatteries.\n" + }, + "activePowerSetpoint": { + "type": "integer", + "format": "int64", + "description": "The setpoint the appliance should follow in mW." + }, + "activePowerSetpointSystemicError": { + "type": "integer", + "format": "int64", + "description": "The measured deviation from the setpoint for the active power value\nin mW.\n" + }, + "l1CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 1." + }, + "l2CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 2." + }, + "l3CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 3." + }, + "maxStateOfChargeAfterMaxFeedIn": { + "type": "integer", + "format": "int32", + "description": "MaxStateOfChargeAfterMaxFeedIn is the max state of charge (0-100%) the\nbattery can reach while considering the capacity needed to store the\nenergy above max feed-in. (eBatMax - eBatOverFeedIn) * 100 /\neBatMax.\n" + }, + "predictedEnergyOutput": { + "type": "integer", + "format": "int64", + "description": "PredictedEnergyOutput is the predicted electrical energy output of\nthis appliance in Wh based on the forecast model, including error\nadjustments.\n" + }, + "energyOverFeedInCumulatedDaily": { + "type": "integer", + "format": "int64", + "description": "EnergyOverFeedInCumulatedDaily is the cumulated energy over the\nfeed-in that is saved this day thanks to the energy management. This\nvalue is reported by the grid meter in Wh.\n" + } + }, + "x-readme-ref-name": "EnergyManagementMeasurement" + } + } + } + ], + "x-readme-ref-name": "CombinedMeasurement" + }, + "InverterMeasurement": { + "title": "Inverter's Measurements", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "gridFrequency": { + "type": "integer", + "format": "int32", + "description": "The locally measured grid frequency in centi (10^-2) Hz." + }, + "acCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current in mA." + }, + "l1ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L1 in mA." + }, + "l2ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L2 in mA." + }, + "l3ACCurrent": { + "type": "integer", + "format": "int32", + "description": "AC current on phase L3 in mA." + }, + "l1ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L1 in mV." + }, + "l2ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L2 in mV." + }, + "l3ACVoltage": { + "type": "integer", + "format": "int32", + "description": "AC voltage on phase L3 mV." + }, + "acActivePower": { + "type": "integer", + "format": "int32", + "description": "AC active power in mW." + }, + "acReactivePower": { + "type": "integer", + "format": "int32", + "description": "AC reactive power in VAr." + }, + "acApparentPower": { + "type": "integer", + "format": "int32", + "description": "AC apparent power VA." + }, + "dcCurrent": { + "type": "integer", + "format": "int32", + "description": "DC current in mA." + }, + "dcVoltage": { + "type": "integer", + "format": "int32", + "description": "DC voltage in mV." + }, + "dcPower": { + "type": "integer", + "format": "int32", + "description": "DC power in mW." + }, + "battery": { + "title": "A measurement produced by a battery (inverter).", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "capacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Capacity in Wh." + }, + "nominalCapacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Nominal capacity in Wh." + }, + "stateOfCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, state of charge in percent." + }, + "stateOfHealth": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, health of the battery in percent." + }, + "temperature": { + "type": "integer", + "format": "int32", + "description": "Temperature of the battery in degrees Celsius." + }, + "presentCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current charge of the battery in mW." + }, + "presentDischarge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current discharge of the battery in mW." + } + }, + "x-readme-ref-name": "BatteryMeasurementRaw" + } + }, + "required": [ + "measuredAt" + ], + "x-readme-ref-name": "InverterMeasurement" + }, + "ElectrolyzerMeasurement": { + "title": "Electrolyzer Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "status": { + "type": "integer", + "format": "int32", + "description": "Status is the local mode of the electrolyzer." + }, + "statusPurification": { + "type": "boolean", + "description": "StatusPurification is the purification status of the electrolyzer. 0 means no regeneration is in progress." + }, + "flowSetpoint": { + "type": "number", + "format": "double", + "description": "Flow Setpoint value set by the customer in Nm3/h." + }, + "hydrogenFlow": { + "type": "number", + "format": "double", + "description": "Hydrogen Flow leaving the electrolyzer in Nm3/h." + }, + "pressure": { + "type": "number", + "format": "double", + "description": "Pressure in the electrolyzer in barg." + }, + "rectifierEnergy1": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 400V in kW." + }, + "rectifierEnergy2": { + "type": "number", + "format": "double", + "description": "Rectifier Energy at 21KV in kW." + }, + "bufferPressure": { + "type": "number", + "format": "double", + "description": "Buffer Pressure of the Electrolyzer in barg." + }, + "productionTime": { + "type": "number", + "format": "double", + "description": "Production Time in hours." + }, + "timeUntilMaintanance": { + "type": "number", + "format": "double", + "description": "Time until maintenance in hours." + }, + "pipelinePressure": { + "type": "number", + "format": "double", + "description": "Pipeline pressure in bar." + }, + "customerHydrogenFlow1": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by the customer." + }, + "customerHydrogenFlow2": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow3": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow4": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + }, + "customerHydrogenFlow5": { + "type": "number", + "format": "double", + "description": "Hydrogen flow in Nm3/h provided by an additional customer." + } + }, + "x-readme-ref-name": "ElectrolyzerMeasurement" + }, + "AUXMeterMeasurement": { + "title": "Meter's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "l1ActivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power in mW." + }, + "l1ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Active Power Reading (Imported Energy) in Ws." + }, + "l1ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l1ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power in VAr." + }, + "l1ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Imported Energy) in VArs." + }, + "l1ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Reactive Power Reading (Exported Energy) in VArs." + }, + "l1ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power in VA." + }, + "l1ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Imported Energy) in VAs." + }, + "l1ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L1 Apparent Power Reading (Exported Energy) in VAs." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "L1 Current in mA." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "L1 Voltage in mV." + }, + "l1ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L1 maximum imported power in mW." + }, + "l2ActivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power in mW." + }, + "l2ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Imported Energy) in Ws." + }, + "l2ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Active Power Reading (Exported Energy) in Ws." + }, + "l2ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power in VAr." + }, + "l2ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Imported Energy) in VArs." + }, + "l2ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Reactive Power Reading (Exported Energy) in VArs." + }, + "l2ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power in VA." + }, + "l2ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Imported Energy) in VAs." + }, + "l2ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L2 Apparent Power Reading (Exported Energy) in VAs." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "L2 Current in mA." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "L2 Voltage in mV." + }, + "l2ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L2 maximum imported power in mW." + }, + "l3ActivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power in mW." + }, + "l3ActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Imported Energy) in Ws." + }, + "l3ActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Active Power Reading (Exported Energy) in Ws." + }, + "l3ReactivePower": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power in VAr." + }, + "l3ReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Imported Energy) in VArs." + }, + "l3ReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Reactive Power Reading (Exported Energy) in VArs." + }, + "l3ApparentPower": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power in VA." + }, + "l3ApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Imported Energy) in VAs." + }, + "l3ApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "L3 Apparent Power Reading (Exported Energy) in VAs." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "L3 Current in mA." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "L3 Voltage in mV." + }, + "l3ImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "L3 maximum imported power in mW." + }, + "sumActivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power in mW." + }, + "sumActivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Imported Energy) in Ws." + }, + "sumActivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Active Power Reading (Exported Energy) in Ws." + }, + "sumApparentPower": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power in VA." + }, + "sumApparentPowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Imported Energy) in VAs." + }, + "sumApparentPowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Apparent Power Reading (Exported Energy) in VAs." + }, + "sumReactivePower": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power in VA." + }, + "sumReactivePowerReadingPositive": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Imported Energy) in VAs." + }, + "sumReactivePowerReadingNegative": { + "type": "integer", + "format": "int64", + "description": "Sum Reactive Power Reading (Exported Energy) in VAs." + }, + "sumImportPowerLimit": { + "type": "integer", + "format": "int64", + "description": "Sum Maximum imported power in mW." + }, + "sumPowerFactor": { + "type": "integer", + "format": "int32", + "description": "Power factor in deg." + } + }, + "x-readme-ref-name": "AUXMeterMeasurement" + }, + "EnergyManagementMeasurement": { + "title": "Energy Management Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured." + }, + "strategyID": { + "type": "string", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "dynamicFeedInCurtailment": { + "type": "boolean", + "description": "True if the PV power is dynamically limited based on the available\nbattery capacity.\n" + }, + "prognosisBasedBatteryCharging": { + "type": "boolean", + "description": "True if a forecast is used to determine the future feed-in into the\nbatteries.\n" + }, + "activePowerSetpoint": { + "type": "integer", + "format": "int64", + "description": "The setpoint the appliance should follow in mW." + }, + "activePowerSetpointSystemicError": { + "type": "integer", + "format": "int64", + "description": "The measured deviation from the setpoint for the active power value\nin mW.\n" + }, + "l1CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 1." + }, + "l2CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 2." + }, + "l3CurrentSetpoint": { + "type": "integer", + "format": "int64", + "description": "Is the setpoint the appliance should follow in mA on phase 3." + }, + "maxStateOfChargeAfterMaxFeedIn": { + "type": "integer", + "format": "int32", + "description": "MaxStateOfChargeAfterMaxFeedIn is the max state of charge (0-100%) the\nbattery can reach while considering the capacity needed to store the\nenergy above max feed-in. (eBatMax - eBatOverFeedIn) * 100 /\neBatMax.\n" + }, + "predictedEnergyOutput": { + "type": "integer", + "format": "int64", + "description": "PredictedEnergyOutput is the predicted electrical energy output of\nthis appliance in Wh based on the forecast model, including error\nadjustments.\n" + }, + "energyOverFeedInCumulatedDaily": { + "type": "integer", + "format": "int64", + "description": "EnergyOverFeedInCumulatedDaily is the cumulated energy over the\nfeed-in that is saved this day thanks to the energy management. This\nvalue is reported by the grid meter in Wh.\n" + } + }, + "x-readme-ref-name": "EnergyManagementMeasurement" + }, + "EVStationMeasurement": { + "title": "MeasurementEVStation represents the power or energy the gateway measured\nfrom a ev charging station\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal ID of the appliance.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Measured power used to charge/discharge via EV station,\npositive values indicate charging, negatives discharging.\n" + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "Percentage of the EVs battery capacity charged (0.0-1.0).\n" + }, + "readingTotal": { + "type": "number", + "format": "double", + "description": "The sum of all meter readings in Wh." + }, + "readingTariff1": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 1 in Wh." + }, + "readingTariff2": { + "type": "number", + "format": "double", + "description": "The meter reading of meter tariff 2 in Wh." + }, + "plugState": { + "type": "string", + "description": "Defines whether this EV is currently plugged in the charging station and whether it's charging." + }, + "currentL1": { + "type": "number", + "format": "double", + "description": "Current of the first phase in Ampere." + }, + "currentL2": { + "type": "number", + "format": "double", + "description": "Current of the second phase in Ampere." + }, + "currentL3": { + "type": "number", + "format": "double", + "description": "Current of the third phase in Ampere." + } + }, + "x-readme-ref-name": "EVStationMeasurement" + }, + "EVChargingStationMeasurement": { + "title": "EV Charging Station's Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Date and time the data point was collected." + }, + "l1Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for first phase in mW." + }, + "l2Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for second phase in mW." + }, + "l3Voltage": { + "type": "integer", + "format": "int32", + "description": "Voltage for third phase in mW." + }, + "l1Current": { + "type": "integer", + "format": "int32", + "description": "Current for first phase in mA." + }, + "l2Current": { + "type": "integer", + "format": "int32", + "description": "Current for second phase in mA." + }, + "l3Current": { + "type": "integer", + "format": "int32", + "description": "Current for third phase in mA." + }, + "realPower": { + "type": "integer", + "format": "int64", + "description": "Real Power in mW. Positive values mean charging, negative values\nmean discharging (V2G; currently not done).\n" + }, + "powerFactor": { + "type": "integer", + "format": "int32", + "description": "Power Factor in 0.1% (cosphi)." + }, + "l1RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L1 in mW." + }, + "l2RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L2 in mW." + }, + "l3RealPower": { + "type": "integer", + "format": "int64", + "description": "Real Power L3 in mW." + }, + "temperature": { + "type": "integer", + "format": "int64", + "description": "Temperature inside the charging station in °C." + }, + "capacity": { + "type": "integer", + "format": "int32", + "description": "The total capacity of the EV battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "The current state of charge of the EV battery in percent from 0.0 -\n100.0%.\n" + }, + "maxCharge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed charge power in mW." + }, + "minCharge": { + "type": "integer", + "format": "int32", + "description": "Minimum allowed charge power in mW, below this power the EV won't\ncharge.\n" + }, + "maxDischarge": { + "type": "integer", + "format": "int32", + "description": "Maximum allowed discharge power in mW." + }, + "stationState": { + "type": "string", + "description": "State indicating whether the charging station is charging, ready, in\nerror state, etc.\n" + }, + "plugState": { + "type": "string", + "description": "State indicates whether an EV is plugged into the charging station.\n" + }, + "pluggedIn": { + "type": "boolean", + "description": "PluggedIn true if an electric vehicle is currently plugged into the\ncharging station.\n" + }, + "tokenID": { + "type": "string", + "description": "TokenID is the used authentication token at the charging station.\n" + } + }, + "x-readme-ref-name": "EVChargingStationMeasurement" + }, + "BatteryMeasurement": { + "title": "Battery Measurement", + "description": "MeasurementBattery represents the aggregated power or energy the gateway\nmeasured from a battery.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "ApplianceID is the battery's appliance ID. It is empty for\naggregated batteries.\n", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power is the measured power used to charge/discharge the battery.\n\nUnit W, Meaning, Positive values indicate discharging. Negative\nvalues indicate charging.\n" + }, + "remainingCharge": { + "type": "number", + "format": "double", + "description": "RemainingCharge is the amount of energy left." + }, + "capacity": { + "type": "number", + "format": "double", + "description": "Maximum energy the battery can provide in Wh." + }, + "nominalCapacity": { + "type": "number", + "format": "double", + "description": "Nominal capacity of the battery in Wh." + }, + "stateOfCharge": { + "type": "number", + "format": "double", + "description": "State of Charge indicates how full a battery is. Unit Percentage\npoints 0.0-1.0.\n" + } + }, + "x-readme-ref-name": "BatteryMeasurement" + }, + "HeatPumpMeasurement": { + "title": "Heat pump measurement", + "type": "object", + "properties": { + "applianceID": { + "type": "string" + }, + "power": { + "type": "number", + "format": "double" + } + }, + "x-readme-ref-name": "HeatPumpMeasurement" + }, + "MeasurementHeating": { + "title": "Heater Measurement", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Represents the time when the data was measured." + }, + "applianceID": { + "type": "string", + "description": "Unique identifier for referencing a heater." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power consumed by the heater in W." + }, + "powerL1": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the first phase in W." + }, + "powerL2": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the second phase in W." + }, + "powerL3": { + "type": "number", + "format": "int64", + "description": "Power consumed by the heater on the third phase in W." + }, + "temperature": { + "type": "number", + "format": "double", + "description": "Temperature measured by this heater in °C." + }, + "minTemperature": { + "type": "number", + "format": "double", + "description": "Minimum temperature measured by this heater in °C." + }, + "maxTemperature": { + "type": "number", + "format": "double", + "description": "Maximum temperature measured by this heater in °C." + } + }, + "x-readme-ref-name": "MeasurementHeating" + }, + "MeasurementAppliance": { + "title": "Additional meter appliances", + "description": "Used in installations that have multiple grid meters, e.g. for \nmulti family homes which a central PV but multiple meters.\n", + "type": "object", + "properties": { + "applianceID": { + "type": "string", + "description": "gridX API internal identifier of the meter.", + "example": "a7d56cb5-2dac-48d4-952a-6eb75ee0ce18" + }, + "power": { + "type": "number", + "format": "double", + "description": "Power/energy measured for this meter in W." + }, + "kind": { + "type": "string", + "description": "Kind of the appliance measurement." + } + }, + "required": [ + "applianceID" + ], + "x-readme-ref-name": "MeasurementAppliance" + }, + "BatteryMeasurementRaw": { + "title": "A measurement produced by a battery (inverter).", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "capacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Capacity in Wh." + }, + "nominalCapacity": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Nominal capacity in Wh." + }, + "stateOfCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, state of charge in percent." + }, + "stateOfHealth": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Value in range 0-100, health of the battery in percent." + }, + "temperature": { + "type": "integer", + "format": "int32", + "description": "Temperature of the battery in degrees Celsius." + }, + "presentCharge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current charge of the battery in mW." + }, + "presentDischarge": { + "type": "integer", + "format": "int32", + "minimum": 0, + "description": "Current discharge of the battery in mW." + } + }, + "x-readme-ref-name": "BatteryMeasurementRaw" + }, + "HeatPumpMeasurementRaw": { + "title": "A measurement produced by a heatpump appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "power": { + "type": "integer", + "description": "Power of the heatpump in mW." + }, + "powerL1": { + "type": "integer", + "description": "Power for the first phase in mW ." + }, + "powerL2": { + "type": "integer" + }, + "powerL3": { + "type": "integer" + }, + "minPower": { + "type": "integer" + }, + "maxPower": { + "type": "integer" + }, + "readyState": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "OFF", + "AUTO", + "RECOMMEND_ON", + "ON" + ] + }, + "averageTemperature": { + "type": "number", + "format": "double" + }, + "controlledTemperature": { + "type": "number", + "format": "double" + }, + "baseLineTemperature": { + "type": "number", + "format": "double" + }, + "heatSourceTemperature": { + "type": "number", + "format": "double" + }, + "outdoorTemperature": { + "type": "number", + "format": "double" + }, + "operationStatus": { + "type": "string", + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "HEATING", + "DRINKING_HOT_WATER", + "POOL_HEATING", + "EVU_LOCK", + "DEFROST", + "OFF", + "EXTERNAL_SOURCE", + "COOLING" + ] + }, + "energyHeating": { + "type": "number", + "format": "double" + }, + "energyDrinkingHotWater": { + "type": "number", + "format": "double" + } + }, + "required": [ + "operationStatus" + ], + "x-readme-ref-name": "HeatPumpMeasurementRaw" + }, + "HeaterMeasurementRaw": { + "title": "A measurement produced by a heater appliance.", + "type": "object", + "properties": { + "measuredAt": { + "type": "string", + "format": "date-time", + "description": "Time when the data was measured in UTC using RFC3339 format." + }, + "flowRate": { + "type": "number", + "format": "double", + "description": "Volumetric flow rate given in m³/s." + }, + "readingPositive": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was gained during circulation from inflow to outflow in Wh." + }, + "readingNegative": { + "type": "number", + "format": "double", + "description": "Energy meter reading that was consumed during circulation from inflow to outflow in Wh." + }, + "power": { + "type": "number", + "format": "double", + "description": "Power in mW." + }, + "inflowTemperature": { + "type": "number", + "format": "double", + "description": "Inflow temperature given in °C" + }, + "outflowTemperature": { + "type": "number", + "format": "double", + "description": "Outflow temperature given in °C" + } + }, + "x-readme-ref-name": "HeaterMeasurementRaw" + }, + "PolicyDocumentCreate": { + "title": "Policy Document Create", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentCreate" + }, + "PolicyDocumentCreateStrict": { + "allOf": [ + { + "title": "Policy Document Create", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentCreate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentCreateStrict" + }, + "PolicyDocumentUpdate": { + "title": "Policy Document Update", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentUpdate" + }, + "PolicyDocumentUpdateStrict": { + "allOf": [ + { + "title": "Policy Document Update", + "type": "object", + "allOf": [ + { + "title": "Policy Document", + "description": "A policy document describes the permissions of the user which can be used for access management.\n", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the policy.", + "example": "Default Policy" + }, + "version": { + "type": "string", + "maxLength": 64, + "description": "Version of the policy.", + "example": "Default Policy" + } + }, + "x-readme-ref-name": "AbstractPolicyDocument" + }, + { + "properties": { + "statements": { + "type": "array", + "items": { + "title": "Policy Statement", + "description": "A policy statement grants or restricts the permission to perform an action.\n", + "type": "object", + "required": [ + "name", + "action", + "resource", + "fields", + "effect" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy statement.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + }, + "name": { + "type": "string", + "description": "Name of the policy statement." + }, + "action": { + "type": "string", + "description": "The action that this statement represents. An action is an operation on a resource.", + "example": "groups:Create" + }, + "effect": { + "type": "string", + "description": "Whether this statement restricts or grants the permission to perform the described action.", + "enum": [ + "allow", + "deny" + ], + "example": "allow" + }, + "fields": { + "type": "string", + "description": "Used for fine-grained control over request bodies, e.g. to allow/deny a certain field in the payload.", + "example": "*" + }, + "resource": { + "type": "string", + "description": "Hierarchical structure over resources to control endpoint access.\n\nFor instance, \"accounts:*\" means that the user can read/modify any account (represented by the wildcard '*').\n", + "example": "accounts:*:groups" + } + }, + "x-readme-ref-name": "AbstractPolicyStatement" + } + } + } + } + ], + "x-readme-ref-name": "PolicyDocumentUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyDocumentUpdateStrict" + }, + "PolicyGroupAssignment": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + }, + "x-readme-ref-name": "PolicyGroupAssignment" + }, + "PolicyGroupAssignmentStrict": { + "allOf": [ + { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146" + } + }, + "x-readme-ref-name": "PolicyGroupAssignment" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PolicyGroupAssignmentStrict" + }, + "devices": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "ID for device, must be url encoded. E.g. deviceId as specified by manufacturer.", + "type": "string", + "example": "27jslrNMHpUx266" + }, + "url": { + "description": "URL of the device.", + "type": "string" + }, + "parentURL": { + "description": "URL of parent device.", + "type": "string" + }, + "deviceAddress": { + "description": "SPINE DeviceAddress.", + "type": "string", + "pattern": "d:_(i:[1-9][0-9]*|n:[a-zA-Z0-9-]+)_[^\\p{Cc}\\p{Cf}\\p{Z}]+", + "example": "d:_n:NaTeYtMjnNGtQqQvbuJT4AoSY-LBq_;:7Jbs,L\"Qz.hQg" + }, + "type": { + "description": "Type of the device.", + "type": "string", + "example": "washer" + }, + "label": { + "description": "User-defined label via an external app e.g Home Connect.", + "type": "string", + "example": "My new dishwasher" + }, + "bindings": { + "description": "List of bindings.", + "type": "array", + "items": { + "type": "object", + "properties": { + "bindingId": { + "description": "ID of binding entry, must be unique in path. The bindingId is provided by the server and must not specified on client side.", + "type": "string", + "readOnly": true, + "example": "jaxbv2" + }, + "type": { + "description": "The resource type for which the binding is created.", + "type": "string", + "enum": [ + "powerSequence" + ], + "example": "powerSequence" + }, + "url": { + "description": "Convenience pointer to endpoint for this binding. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "readOnly": true, + "example": "https://api.eebus.org/devices/1041A421/bindings/jaxbv2" + }, + "name": { + "description": "User-friendly name of binding partner.", + "type": "string", + "example": "bindingName" + }, + "validity": { + "description": "A Binding is valid for 24 hours and will be released if not renewed in time. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2021-07-24T23:59:59Z" + } + }, + "required": [ + "type", + "name" + ], + "x-readme-ref-name": "binding" + }, + "x-readme-ref-name": "bindings" + }, + "usecases": { + "description": "List of supported use-cases for this device.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "description": "Semantic short name of the use-case.", + "type": "string", + "enum": [ + "fswg" + ], + "readOnly": true, + "example": "fswg" + }, + "actor": { + "description": "The actor's role in the current scenario.", + "type": "string", + "enum": [ + "server", + "client" + ], + "readOnly": true, + "example": "server" + } + }, + "required": [ + "name", + "actor" + ], + "x-readme-ref-name": "usecase" + }, + "x-readme-ref-name": "usecases" + }, + "resources": { + "description": "List of resources available on this device.", + "type": "array", + "items": { + "description": "A specific resource describes a capability (e.g. flexible start of white goods).", + "type": "object", + "properties": { + "url": { + "description": "URL of the resource.", + "type": "string", + "example": "https://api.eebus.org/devices/1041A421/powerSequences" + }, + "type": { + "description": "Type of the resource.", + "type": "string", + "example": "powerSequence" + }, + "specialization": { + "description": "Specialization of the resource.", + "type": "string", + "example": "flexibleStart" + }, + "supportsBinding": { + "description": "Explicit definition whether the resource supports exclusive binding.", + "type": "boolean", + "example": true + }, + "data": { + "type": "array", + "items": { + "oneOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + { + "required": [ + "earliestStartTime", + "latestEndTime", + "powerTimeSlots" + ] + } + ], + "x-readme-ref-name": "PowerSequence" + } + ] + } + } + }, + "required": [ + "url", + "type", + "supportsBinding", + "data" + ], + "x-readme-ref-name": "resource" + }, + "x-readme-ref-name": "resources" + } + }, + "required": [ + "id", + "url", + "type", + "bindings", + "usecases", + "resources" + ], + "x-readme-ref-name": "device" + } + }, + "example": { + "homeconnect": [ + { + "id": "27jslrNMHpUx266", + "url": "homeconnect-device-url", + "parentURL": "string", + "deviceAddress": "d:_n:NaTeYtMjnNGtQqQvbuJT4AoSY-LBq_;:7Jbs,L\"Qz.hQg", + "type": "washer", + "label": "My New Dishwasher", + "bindings": [ + { + "bindingId": "jaxbv2", + "type": "powerSequence", + "url": "https://api.eebus.org/devices/1041A421/bindings/jaxbv2", + "name": "bindingName", + "validity": "2021-07-24T23:59:59Z" + } + ], + "usecases": [ + { + "name": "fswg", + "actor": "server" + } + ], + "resources": [ + { + "url": "https://api.eebus.org/devices/1041A421/powerSequences", + "type": "powerSequence", + "specialization": "flexibleStart", + "supportsBinding": true, + "data": [ + { + "sequenceId": 1, + "state": "scheduled", + "activeSlotNumber": 0, + "sequenceRemoteControllable": true, + "startTime": "2021-06-24T12:00:00Z", + "endTime": "2021-06-24T13:40:00Z", + "earliestStartTime": "2021-06-24T06:20:00Z", + "latestEndTime": "2021-06-24T19:00:00Z", + "isPausable": false, + "isStoppable": false, + "valueSource": "empiricalValue", + "taskIdentifier": 0, + "powerTimeSlots": [ + { + "slotId": 1, + "defaultDuration": "00:23:00", + "powerMin": 100, + "powerExpectedValue": 200, + "powerMax": 1000 + } + ] + } + ] + } + ] + } + ] + }, + "x-readme-ref-name": "devices" + }, + "device": { + "type": "object", + "properties": { + "id": { + "description": "ID for device, must be url encoded. E.g. deviceId as specified by manufacturer.", + "type": "string", + "example": "27jslrNMHpUx266" + }, + "url": { + "description": "URL of the device.", + "type": "string" + }, + "parentURL": { + "description": "URL of parent device.", + "type": "string" + }, + "deviceAddress": { + "description": "SPINE DeviceAddress.", + "type": "string", + "pattern": "d:_(i:[1-9][0-9]*|n:[a-zA-Z0-9-]+)_[^\\p{Cc}\\p{Cf}\\p{Z}]+", + "example": "d:_n:NaTeYtMjnNGtQqQvbuJT4AoSY-LBq_;:7Jbs,L\"Qz.hQg" + }, + "type": { + "description": "Type of the device.", + "type": "string", + "example": "washer" + }, + "label": { + "description": "User-defined label via an external app e.g Home Connect.", + "type": "string", + "example": "My new dishwasher" + }, + "bindings": { + "description": "List of bindings.", + "type": "array", + "items": { + "type": "object", + "properties": { + "bindingId": { + "description": "ID of binding entry, must be unique in path. The bindingId is provided by the server and must not specified on client side.", + "type": "string", + "readOnly": true, + "example": "jaxbv2" + }, + "type": { + "description": "The resource type for which the binding is created.", + "type": "string", + "enum": [ + "powerSequence" + ], + "example": "powerSequence" + }, + "url": { + "description": "Convenience pointer to endpoint for this binding. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "readOnly": true, + "example": "https://api.eebus.org/devices/1041A421/bindings/jaxbv2" + }, + "name": { + "description": "User-friendly name of binding partner.", + "type": "string", + "example": "bindingName" + }, + "validity": { + "description": "A Binding is valid for 24 hours and will be released if not renewed in time. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2021-07-24T23:59:59Z" + } + }, + "required": [ + "type", + "name" + ], + "x-readme-ref-name": "binding" + }, + "x-readme-ref-name": "bindings" + }, + "usecases": { + "description": "List of supported use-cases for this device.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "description": "Semantic short name of the use-case.", + "type": "string", + "enum": [ + "fswg" + ], + "readOnly": true, + "example": "fswg" + }, + "actor": { + "description": "The actor's role in the current scenario.", + "type": "string", + "enum": [ + "server", + "client" + ], + "readOnly": true, + "example": "server" + } + }, + "required": [ + "name", + "actor" + ], + "x-readme-ref-name": "usecase" + }, + "x-readme-ref-name": "usecases" + }, + "resources": { + "description": "List of resources available on this device.", + "type": "array", + "items": { + "description": "A specific resource describes a capability (e.g. flexible start of white goods).", + "type": "object", + "properties": { + "url": { + "description": "URL of the resource.", + "type": "string", + "example": "https://api.eebus.org/devices/1041A421/powerSequences" + }, + "type": { + "description": "Type of the resource.", + "type": "string", + "example": "powerSequence" + }, + "specialization": { + "description": "Specialization of the resource.", + "type": "string", + "example": "flexibleStart" + }, + "supportsBinding": { + "description": "Explicit definition whether the resource supports exclusive binding.", + "type": "boolean", + "example": true + }, + "data": { + "type": "array", + "items": { + "oneOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + { + "required": [ + "earliestStartTime", + "latestEndTime", + "powerTimeSlots" + ] + } + ], + "x-readme-ref-name": "PowerSequence" + } + ] + } + } + }, + "required": [ + "url", + "type", + "supportsBinding", + "data" + ], + "x-readme-ref-name": "resource" + }, + "x-readme-ref-name": "resources" + } + }, + "required": [ + "id", + "url", + "type", + "bindings", + "usecases", + "resources" + ], + "x-readme-ref-name": "device" + }, + "usecases": { + "description": "List of supported use-cases for this device.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "description": "Semantic short name of the use-case.", + "type": "string", + "enum": [ + "fswg" + ], + "readOnly": true, + "example": "fswg" + }, + "actor": { + "description": "The actor's role in the current scenario.", + "type": "string", + "enum": [ + "server", + "client" + ], + "readOnly": true, + "example": "server" + } + }, + "required": [ + "name", + "actor" + ], + "x-readme-ref-name": "usecase" + }, + "x-readme-ref-name": "usecases" + }, + "usecase": { + "type": "object", + "properties": { + "name": { + "description": "Semantic short name of the use-case.", + "type": "string", + "enum": [ + "fswg" + ], + "readOnly": true, + "example": "fswg" + }, + "actor": { + "description": "The actor's role in the current scenario.", + "type": "string", + "enum": [ + "server", + "client" + ], + "readOnly": true, + "example": "server" + } + }, + "required": [ + "name", + "actor" + ], + "x-readme-ref-name": "usecase" + }, + "resources": { + "description": "List of resources available on this device.", + "type": "array", + "items": { + "description": "A specific resource describes a capability (e.g. flexible start of white goods).", + "type": "object", + "properties": { + "url": { + "description": "URL of the resource.", + "type": "string", + "example": "https://api.eebus.org/devices/1041A421/powerSequences" + }, + "type": { + "description": "Type of the resource.", + "type": "string", + "example": "powerSequence" + }, + "specialization": { + "description": "Specialization of the resource.", + "type": "string", + "example": "flexibleStart" + }, + "supportsBinding": { + "description": "Explicit definition whether the resource supports exclusive binding.", + "type": "boolean", + "example": true + }, + "data": { + "type": "array", + "items": { + "oneOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + { + "required": [ + "earliestStartTime", + "latestEndTime", + "powerTimeSlots" + ] + } + ], + "x-readme-ref-name": "PowerSequence" + } + ] + } + } + }, + "required": [ + "url", + "type", + "supportsBinding", + "data" + ], + "x-readme-ref-name": "resource" + }, + "x-readme-ref-name": "resources" + }, + "resource": { + "description": "A specific resource describes a capability (e.g. flexible start of white goods).", + "type": "object", + "properties": { + "url": { + "description": "URL of the resource.", + "type": "string", + "example": "https://api.eebus.org/devices/1041A421/powerSequences" + }, + "type": { + "description": "Type of the resource.", + "type": "string", + "example": "powerSequence" + }, + "specialization": { + "description": "Specialization of the resource.", + "type": "string", + "example": "flexibleStart" + }, + "supportsBinding": { + "description": "Explicit definition whether the resource supports exclusive binding.", + "type": "boolean", + "example": true + }, + "data": { + "type": "array", + "items": { + "oneOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + { + "required": [ + "earliestStartTime", + "latestEndTime", + "powerTimeSlots" + ] + } + ], + "x-readme-ref-name": "PowerSequence" + } + ] + } + } + }, + "required": [ + "url", + "type", + "supportsBinding", + "data" + ], + "x-readme-ref-name": "resource" + }, + "bindings": { + "description": "List of bindings.", + "type": "array", + "items": { + "type": "object", + "properties": { + "bindingId": { + "description": "ID of binding entry, must be unique in path. The bindingId is provided by the server and must not specified on client side.", + "type": "string", + "readOnly": true, + "example": "jaxbv2" + }, + "type": { + "description": "The resource type for which the binding is created.", + "type": "string", + "enum": [ + "powerSequence" + ], + "example": "powerSequence" + }, + "url": { + "description": "Convenience pointer to endpoint for this binding. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "readOnly": true, + "example": "https://api.eebus.org/devices/1041A421/bindings/jaxbv2" + }, + "name": { + "description": "User-friendly name of binding partner.", + "type": "string", + "example": "bindingName" + }, + "validity": { + "description": "A Binding is valid for 24 hours and will be released if not renewed in time. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2021-07-24T23:59:59Z" + } + }, + "required": [ + "type", + "name" + ], + "x-readme-ref-name": "binding" + }, + "x-readme-ref-name": "bindings" + }, + "binding": { + "type": "object", + "properties": { + "bindingId": { + "description": "ID of binding entry, must be unique in path. The bindingId is provided by the server and must not specified on client side.", + "type": "string", + "readOnly": true, + "example": "jaxbv2" + }, + "type": { + "description": "The resource type for which the binding is created.", + "type": "string", + "enum": [ + "powerSequence" + ], + "example": "powerSequence" + }, + "url": { + "description": "Convenience pointer to endpoint for this binding. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "readOnly": true, + "example": "https://api.eebus.org/devices/1041A421/bindings/jaxbv2" + }, + "name": { + "description": "User-friendly name of binding partner.", + "type": "string", + "example": "bindingName" + }, + "validity": { + "description": "A Binding is valid for 24 hours and will be released if not renewed in time. The validity is provided by the server and must not be specified on client side.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2021-07-24T23:59:59Z" + } + }, + "required": [ + "type", + "name" + ], + "x-readme-ref-name": "binding" + }, + "AbstractPowerSequence": { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + "PowerSequence": { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + }, + { + "required": [ + "earliestStartTime", + "latestEndTime", + "powerTimeSlots" + ] + } + ], + "x-readme-ref-name": "PowerSequence" + }, + "PowerSequenceUpdate": { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + } + ], + "x-readme-ref-name": "PowerSequenceUpdate" + }, + "PowerSequenceUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "sequenceId": { + "description": "Identifier of power sequence, must be unique in path.", + "type": "integer", + "example": 1 + }, + "state": { + "description": "EEBUS FSWG-025. See section 3.2.1.2.2.1.1.4", + "type": "string", + "enum": [ + "inactive", + "scheduled", + "running", + "paused", + "completed", + "invalid" + ], + "example": "scheduled" + }, + "activeSlotNumber": { + "description": "The currently active powerTimeSlot, if state is inactive, schedule, completed or invalid, activeSlotNumber is 0.", + "type": "integer" + }, + "sequenceRemoteControllable": { + "type": "boolean" + }, + "startTime": { + "description": "See EEBUS FSWG-04.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T12:00:00Z" + }, + "endTime": { + "description": "Must be greater than \"alternatives. powerSequence. schedule. startTime\"", + "type": "string", + "format": "date-time", + "example": "2021-06-24T13:40:00Z" + }, + "earliestStartTime": { + "description": "See EEBUS FSWG-022.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T06:20:00Z" + }, + "latestEndTime": { + "description": "See EEBUS FSWG-023.", + "type": "string", + "format": "date-time", + "example": "2021-06-24T19:00:00Z" + }, + "isPausable": { + "description": "If the sequence can be paused by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-026S.\n", + "type": "boolean", + "default": false + }, + "isStoppable": { + "description": "If the sequence can be stopped by the CEM, this element SHALL be present and set to true. Otherwise it SHALL be omitted or set to false (default value).\nFor more details, see EEBUS FSWG-027.\n", + "type": "boolean", + "default": false + }, + "valueSource": { + "description": "If not set, the source of forecasted values is undefined.", + "type": "string", + "enum": [ + "empiricalValue", + "calculatedValue", + "measuredValue" + ] + }, + "taskIdentifier": { + "description": "Identifier of the task.", + "type": "integer" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + } + }, + "x-readme-ref-name": "AbstractPowerSequence" + } + ], + "x-readme-ref-name": "PowerSequenceUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "PowerSequenceUpdateStrict" + }, + "powerTimeSlots": { + "description": "List of power time slots for a power sequence. See EEBUS FSWG-060.", + "type": "array", + "items": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "x-readme-ref-name": "powerTimeSlots" + }, + "powerTimeSlot": { + "type": "object", + "properties": { + "slotId": { + "description": "A SUB IDENTIFIER within powerSequence. The slot IDs within one power sequence shall be assigned according to the chronological order of the slots.", + "type": "integer", + "readOnly": true, + "example": 1 + }, + "defaultDuration": { + "description": "See EEBUS FSWG-063.", + "type": "string", + "format": "partial-time", + "readOnly": true, + "example": "00:23:00" + }, + "powerMin": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 100 + }, + "powerExpectedValue": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 200 + }, + "powerMax": { + "description": "See EEBUS FSWG-062.", + "type": "number", + "format": "float", + "readOnly": true, + "example": 1000 + } + }, + "x-readme-ref-name": "powerTimeSlot" + }, + "LoginEvent": { + "description": "Represents a user login event that can occur either on login success or failure.", + "type": "object", + "properties": { + "createdAt": { + "description": "Time when the event occurred in UTC.", + "type": "string", + "format": "date-time", + "example": "2020-11-10T13:13:00Z", + "readOnly": true + }, + "type": { + "description": "The type of the login event.", + "type": "string", + "example": "LOGIN_SUCCESS", + "readOnly": true + }, + "ip": { + "description": "The IP address that caused the login event.", + "type": "string", + "format": "ipv4", + "example": "8.8.8.8", + "readOnly": true + } + }, + "x-readme-ref-name": "LoginEvent" + }, + "UserStrict": { + "allOf": [ + { + "type": "object", + "allOf": [ + { + "title": "User", + "description": "Represents a user of the Xenon platform.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "required": [ + "id", + "email", + "createdAt", + "updatedAt" + ], + "properties": { + "id": { + "description": "Unique identifier of the user.", + "type": "string", + "format": "uuid", + "example": "43a4f165-8233-426b-a1a4-e569665a25dd", + "readOnly": true + }, + "accountID": { + "description": "Unique identifier of the account that the user belongs to.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "readOnly": true + }, + "newPassword": { + "description": "Used to set a new password for the user.", + "type": "string", + "writeOnly": true + }, + "loginsCount": { + "description": "Number of user logins.", + "type": "integer", + "readOnly": true + }, + "mfaEnabled": { + "description": "Indicates whether MFA (Multi-Factor Authentication) is enabled.", + "type": "boolean", + "readOnly": true + }, + "mfaReset": { + "description": "Can be set to true if MFA (Multi-Factor Authentication) needs to to be reset. This will remove the MFA.", + "type": "boolean", + "writeOnly": true + }, + "createdAt": { + "description": "Time at which the user was created in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the user was last updated in UTC using the RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2009-11-10T23:20:50Z", + "readOnly": true + }, + "fullName": { + "description": "Full name of the user typically consisting of first name and last name.", + "type": "string", + "example": "John Doe" + }, + "email": { + "description": "The email address of the user that is used for login.", + "type": "string", + "format": "email", + "example": "john@doe.com" + }, + "groups": { + "description": "Policy groups attached to this user which determine the effective permissions through policies.", + "type": "array", + "items": { + "title": "Policy Group", + "type": "object", + "allOf": [ + { + "title": "Policy Group", + "description": "A policy group describes the permissions of a group.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the policy group.", + "example": "group name" + }, + "description": { + "type": "string", + "description": "Description of the group, omitted if empty", + "example": "Group provides read-access to accounts" + } + }, + "x-readme-ref-name": "AbstractPolicyGroup" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the policy group.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "accountID": { + "type": "string", + "format": "uuid", + "description": "Unique identifier of the creator account.", + "example": "97874c1b-d073-4b06-bf01-a1497fbe1146", + "readOnly": true + }, + "createdAt": { + "description": "Time at which the policy group was created in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-06T15:33:00Z", + "readOnly": true + }, + "updatedAt": { + "description": "Time at which the policy group was last updated in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2019-11-08T23:20:50Z", + "readOnly": true + }, + "userCount": { + "type": "integer", + "description": "Amount of users that are in this group.", + "example": 10, + "readOnly": true + } + }, + "required": [ + "id", + "name", + "accountID", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "PolicyGroup" + } + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "language": { + "title": "Language", + "description": "The language information of the user.", + "type": "object", + "required": [ + "tag", + "name", + "nameNative" + ], + "properties": { + "tag": { + "type": "string", + "description": "Tag is the IETF language tag's primary identifier for this language.\n\nSee [here](https://tools.ietf.org/rfc/bcp/bcp47.txt) and the example below for more information.\n", + "example": "de_DE" + }, + "name": { + "type": "string", + "description": "The name of the language in English.", + "example": "German", + "readOnly": true + }, + "nameNative": { + "type": "string", + "description": "The name of the language in the language itself.", + "example": "Deutsch", + "readOnly": true + } + }, + "x-readme-ref-name": "Language" + } + }, + "x-readme-ref-name": "UserWithoutAuth" + }, + { + "required": [ + "auth" + ] + } + ], + "x-readme-ref-name": "User" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "UserStrict" + }, + "StarredSystem": { + "description": "Represents a starred system which holds an additional starredAt timestamp.\n\nA System represents the logical view of one gateway and its appliances.\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n \nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "type": "object", + "allOf": [ + { + "title": "System", + "description": "A System represents the logical view of one gateway and its appliances.\n\nFor example, a household can be represented as a system with a gateway such as a \ngridBox, and its connected appliances.\n", + "properties": { + "name": { + "type": "string", + "maxLength": 200, + "description": "Name of the System.", + "example": "gridX Headquarter", + "nullable": true + }, + "solution": { + "type": "string", + "description": "Represents the solution that the system uses:\n- HOME if the system is for a household. \n- CHARGE if the system is for charging station fleet management.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "SystemSolution" + }, + "priorities": { + "description": "Allows prioritisation of EMS functionalities by appliance type.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "EV", + "BATTERY" + ] + }, + "appliancePriorities": { + "type": "array", + "description": "Allows prioritisation of EMS functionalities by appliance UUIDs.\nThis option takes precendence over `priorities` field as it is more explicit.\n", + "items": { + "type": "string", + "format": "uuid" + } + }, + "tariffID": { + "type": "string", + "deprecated": true, + "description": "TariffID is used to reference a (deprecated) time of use tariff for a system.\n\n**Deprecated** - Use TariffV2 instead.\n" + }, + "plan": { + "description": "Charge plan of the system. Must be one of the accounts assigned charge plans.", + "type": "string" + }, + "operatingSince": { + "type": "string", + "format": "date-time", + "description": "Date since when the system is active in RFC3339 format.", + "example": "2017-12-23T10:15:40Z" + }, + "curtailmentStrategy": { + "type": "string", + "description": "The curtailment strategy describes how appliances shall be curtailed.\n * SERIES: Appliances get in order as much as possible; order: first order by least number of energy importing phases and second order lexicographically by appliance ID.\n * EQUALLY: Every appliance gets equally (fair) curtailed.\n * PROPORTIONAL: Proportional according to the desired energy to charge (current SoC, desired SoC and max. energy) and the desired charging time set via the API.\n", + "enum": [ + "SERIES", + "EQUALLY", + "PROPORTIONAL" + ], + "x-readme-ref-name": "SystemCurtailmentStrategy" + }, + "location": { + "title": "Location", + "description": "Represents a GPS location with longitude and latitude.", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "countryCode": { + "type": "string", + "description": "Country code in ISO 3166-1 alpha-2.", + "example": "DE", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "postalCode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "longitude": { + "description": "The geographic coordinate that specifies the east–west position of the location.", + "type": "number", + "example": 6.09294299, + "readOnly": true + }, + "latitude": { + "description": "The geographic coordinate that specifies the north–south position of the location.", + "type": "number", + "example": 50.77441934, + "readOnly": true + } + } + } + ], + "x-readme-ref-name": "Location" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + } + }, + "x-readme-ref-name": "AbstractSystem" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier of a system.", + "example": "aa3e5a93-bb38-4b15-b7f2-af40daf3a1dc" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was created in RFC3339 format.", + "example": "2017-12-22T14:20:50Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the system was last updated in RFC3339 format.", + "example": "2017-12-24T08:33:00Z" + }, + "chargingIntervals": { + "type": "array", + "readOnly": true, + "description": "Displays charging intervals of the system's EV charging stations.", + "items": { + "title": "EV Charging Schedule", + "type": "object", + "allOf": [ + { + "title": "EV Charging Schedule", + "description": "An Electric Vehicle charging schedule represents an interval in which\nthe electric vehicle is supposed to charge at a defined limit.\n", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:00:00Z", + "description": "Specifies when the schedule should start in RFC3339 format.\n" + }, + "to": { + "type": "string", + "format": "date-time", + "example": "2021-11-04T00:30:00Z", + "description": "Specifies when the schedule should end in RFC3339 format.\n" + }, + "limit": { + "description": "The maximum amount of power in Watts that will be used for scheduling charging in the interval [from, to].\n", + "example": 75000, + "title": "Positive Power in Watt.", + "type": "integer", + "format": "int64", + "minimum": 0, + "x-readme-ref-name": "PositivePower" + } + }, + "x-readme-ref-name": "AbstractEVChargingSchedule" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ec4d0c89-a604-49ac-82f0-427f9cb42204", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Specifies when the schedule was updated the last time." + } + } + }, + { + "required": [ + "id", + "from", + "to", + "limit" + ] + } + ], + "x-readme-ref-name": "EVChargingSchedule" + } + }, + "gateways": { + "description": "The gateways of which this system is comprised.", + "type": "array", + "readOnly": true, + "items": { + "allOf": [ + { + "title": "Gateway", + "description": "A gateway used to monitor and control appliances.\n\nFor instance, our beloved gridbox is a gateway.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "description": "Name of the gateway." + }, + "debugModeUntil": { + "type": "string", + "format": "date-time", + "description": "Date until which debug messages are logged in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractGateway" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f", + "description": "Unique identifier of a gateway.", + "readOnly": true + }, + "type": { + "type": "string", + "description": "Type of the gateway.\n\n**Deprecated** - Non-physical gateways will no longer be supported from 01.03.2024. This field will consequently be removed.\n", + "deprecated": true, + "enum": [ + "VIRTUAL", + "PHYSICAL", + "OTHER" + ], + "x-readme-ref-name": "GatewayType" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was created in RFC3339 format." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was last updated in RFC3339 format." + }, + "registeredAt": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "Date when the Gateway was first registered in RFC3339 format." + }, + "connectionStatus": { + "title": "Connection Status", + "type": "object", + "readOnly": true, + "properties": { + "status": { + "type": "string", + "description": "Indicates the connection status. Is one of:\n * `AVAILABLE`: Gateway/Appliance has sent data in the last two minutes\n * `TEMPORARILY_UNAVAILABLE`: Gateway/Appliance has not sent data in the last two minutes\n * `UNAVAILABLE`: Gateway/Appliance has not sent data in the last 24 hours", + "enum": [ + "AVAILABLE", + "TEMPORARILY_UNAVAILABLE", + "UNAVAILABLE" + ] + }, + "contactedAt": { + "type": "string", + "format": "date-time", + "description": "When the gateway/appliance has last contacted the gridX cloud." + } + }, + "required": [ + "status" + ], + "x-readme-ref-name": "ConnectionStatus" + }, + "vendorID": { + "description": "ID of the vendor account to which the corresponding system is assigned.", + "type": "string", + "format": "uuid", + "example": "6dd0a658-5828-4d30-bc65-a03c6d6e425f" + }, + "startcode": { + "description": "Code used to register a new gateway.", + "type": "string", + "example": "39FDDF7D85BAAD2D", + "pattern": "^[A-F0-9]{16}$" + }, + "manufacturer": { + "description": "Manufacturer of the gateway.", + "type": "string", + "example": "gridX", + "readOnly": true + }, + "model": { + "description": "Model of the gateway.", + "type": "string", + "example": "2.00P-X", + "readOnly": true + }, + "serialnumber": { + "description": "Serial number of the gateway.", + "type": "string", + "example": "C083-200-000-000-199-P-X", + "readOnly": true + }, + "additionalIdentifiers": { + "description": "Additional identifiers used by the gateway.", + "type": "array", + "items": { + "title": "Additional identifiers of the gridBox.", + "description": "Additional identifiers used by the gridBox.", + "type": "object", + "properties": { + "service": { + "type": "string", + "readOnly": true, + "description": "The service this identifier is referring to, e.g the protocol used for the appliance-gridBox handshake", + "example": "EEBUS" + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of the identifier.", + "example": "SKI", + "enum": [ + "UNKNOWN", + "SKI" + ] + }, + "identifier": { + "type": "string", + "readOnly": true, + "description": "The actual identifier, e.g \"SKI\" used in the TLS certificate for the communication. If type is \"SKI\", it is hexadecimal-encoded." + } + }, + "x-readme-ref-name": "AdditionalIdentifier" + }, + "readOnly": true + }, + "scanners": { + "type": "array", + "readOnly": true, + "description": "List of scanner names that are enabled for this gateway.", + "items": { + "type": "string", + "description": "The name of the scanner which searches for the appliance in the network.", + "example": "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "enum": [ + "SMA_INVERTER_IGMP_HOST_DISCOVERY", + "SMA_INVERTER_ARP_HOST_DISCOVERY", + "SMA_METER", + "BCONTROL_METER", + "SOLAREDGE_INVERTER_METER_MODBUS_TCP", + "SOLAREDGE_INVERTER_METER_MODBUS_RTU", + "SOLARLOG_MONITOR", + "CUSTOMER_HOLFELDER_METER", + "CUSTOMER_HOLFELDER_INVERTER", + "E3DC_INVERTER_METER", + "KOSTAL_INVERTER", + "STUDER_INVERTER", + "FRONIUS_INVERTER", + "HUAWEI_INVERTER", + "KEBA_CHARGING_STATION", + "ECHARGE_CHARGING_STATION", + "INNOGY_CHARGING_STATION", + "ELECTRIS_METER", + "SOLARWATT_INVERTER_METER", + "ABL_CHARGING_STATION", + "SIEMENS_PAC_METER", + "JANITZA_METER", + "JANITZA_METER_RTU", + "EVTEC_CHARGING_STATION", + "HIKING_METER_RTU", + "EEBUS_FUEL_CELL_METER", + "KOSTAL_INVERTER_PLENTICORE", + "SONNENBATTERIE_UPNP", + "VIRTUAL_METER", + "MENNEKES_UPNP", + "ANYBUS_MBUS_CONVERTER_METER", + "EEBUS_GENERIC", + "SIMULATION_GENERIC", + "ALFEN_NG9XX_MODBUS_CHARGING_STATION", + "ALPITRONIC_HYPERCHARGER_MODBUS_CHARGING_STATION", + "MY_PV_AC_THOR_HEATER", + "COMPLEO_MODBUS_CHARGING_STATION", + "OCPP_CHARGING_STATION", + "BENDER_CHARGING_STATION", + "VOLTERION_REDOX_FLOW_BATTERY", + "XNET_METER", + "RSW_METER", + "SCHNEIDER_METER", + "INNOGY_MODBUS_CHARGING_STATION", + "MENNEKES_PREMIUM_MODBUS_CHARGING_STATION", + "PLPLANO_MODBUS_RTU_METER", + "HEIDELBERG_ENERGY_CONTROL_MODBUS_RTU_CHARGING_STATION", + "CARLO_GAVAZZI_MODBUS_RTU_METER", + "VESTEL_CHARGING_STATION", + "INNOTEC_HEAT_PUMP", + "WALLBE_MODBUS_CHARGING_STATION", + "EVBOX_MAX_CHARGING_STATION", + "ISKRAEMECO_METER", + "SUNGROW_MODBUS_INVERTER", + "WAGO_IO_DEVICE", + "GOE_CHARGING_STATION", + "XNET_CLOUD_HEAT_PUMP", + "XNET_CLOUD_GENERIC", + "LANDIS_GYR_METER", + "POWERDALE_CHARGING_STATION", + "EASTRON_SDM230_METER", + "EASTRON_SDM72DM_METER", + "ZUCCHETTI_CONNEXT_BOX", + "PLVARIO_ENERGY_METER_EM3", + "ABB_OPC_UA_CHARGING_STATION", + "DATA_LOGGER_DEVICE", + "POWERSIDE_METER", + "PPC_METER", + "RUTENBECK_TCR_IP4_IO_DEVICE", + "JEAN_MUELLER_PL_MULTI_METER", + "ENPHASE_ENVOY_S_GATEWAY", + "SOLAX_MODBUS_RTU_INVERTER", + "ALPHA_ESS_HI10_HYBRID_INVERTER", + "ZUCCHETTI_MODBUS_RTU_INVERTER", + "STIEBEL_ELTRON_MODBUS_TCP_HEAT_PUMP", + "MENNEKES_AMTRON_COMPACT_2S_MODBUS_RTU_CHARGING_STATION", + "SAIA_PCD1_E_LINE_HEAT_PUMP", + "SUNGROW_SG_MODBUS_INVERTER", + "SOLAX_MODBUS_TCP_INVERTER", + "PHOENIX_CONTACT_EM_PRO_METER", + "DAIKIN_HOMEHUB_MODBUS_TCP_HEAT_PUMP", + "SOLPLANET_MODBUS_TCP_INVERTER", + "SUNGROW_SHXRS_SHXT_MODBUS_INVERTER", + "KOSTAD_DC_CHARGING_STATION", + "GIVENERGY_GIV_TCP_INVERTER", + "FOX_ESS_MODBUS_TCP_INVERTER", + "SHELLY_HTTP_METER" + ], + "x-readme-ref-name": "ScannerName" + } + }, + "applianceComposition": { + "type": "array", + "readOnly": true, + "description": "Appliance types that are connected to the gateway for overview purposes.", + "example": [ + "HEAT_PUMP" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "type", + "connectionStatus", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Gateway" + } + }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "UNDEFINED", + "OK", + "WARNING", + "ERROR" + ], + "description": "Status of the system: \n - OK: If there has been a successful heartbeat of an attached gateway recently.\n - WARNING: If the last heartbeat of an attached gateway is a longer time but less than 24h ago.\n - ERROR: If the last heartbeat of an attached gateway is longer than 24h ago. \n - UNEFINED: otherwise\n" + } + } + } + ], + "x-readme-ref-name": "SystemWithoutProductOption" + }, + { + "title": "Embedded accounts", + "description": "Hierarchy of accounts the system belongs to, from the authenticated account down to the end customer's.\n", + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + "readOnly": true + } + }, + "x-readme-ref-name": "EmbeddedAccounts" + }, + { + "properties": { + "productOption": { + "type": "object", + "allOf": [ + { + "title": "Product Option", + "description": "A product option describes a set of features whose access should be restricted from or granted to users of a system.\n\nSystems can be assigned a product option to manage their access to these features.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product option.", + "example": "Default Product Option" + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product option." + } + }, + "x-readme-ref-name": "AbstractProductOption" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product option.", + "type": "string", + "format": "uuid", + "example": "d5166f02-8b56-4200-90bd-35d3d17391b4" + }, + "accountID": { + "description": "Unique identifier of the account that owns the product option.", + "type": "string", + "format": "uuid", + "example": "d73b6749-2c32-4bca-ab73-50d8e3744edf" + }, + "isDefault": { + "type": "boolean", + "description": "Indicates whether the product option should be assigned by default to all systems of the owning account." + }, + "functionalities": { + "description": "The default functionalities that a product option restricts access to. Deprecated - Use `showFunctionalities` and `hideFunctionalities` instead.", + "type": "array", + "readOnly": true, + "deprecated": true, + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "hideFunctionalities": { + "readOnly": true, + "description": "The default functionalities that a product option restricts access to. Must be of type `hide=true`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + }, + "showFunctionalities": { + "readOnly": true, + "description": "The extra functionalities that a product option grants access to. Must be of type `hide=false`.", + "type": "array", + "items": { + "type": "object", + "allOf": [ + { + "description": "A product functionality describes a feature.\n\nIt is used to manage access to this feature via product options.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256, + "description": "Name of the product functionality.", + "example": "EV Manager" + }, + "hide": { + "type": "boolean", + "description": "Indicates whether the product functionality should be hidden or shown." + }, + "description": { + "type": "string", + "description": "Describes the purpose of the product functionality." + } + }, + "x-readme-ref-name": "AbstractProductFunctionality" + }, + { + "properties": { + "id": { + "description": "Unique identifier of the product functionality.", + "type": "string", + "format": "uuid", + "example": "4e3392ce-ed94-4946-8a11-665e0443723e" + } + }, + "required": [ + "id", + "name", + "hide" + ] + } + ], + "x-readme-ref-name": "ProductFunctionality" + } + } + }, + "required": [ + "id", + "accountID", + "name", + "isDefault", + "functionalities", + "hideFunctionalities", + "showFunctionalities" + ] + } + ], + "x-readme-ref-name": "ProductOption" + }, + "productOptionUpdatedAt": { + "description": "Time at which the system's product option was last changed in RFC3339 format.", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2009-11-10T23:20:50Z" + }, + "tariffID": { + "type": "string", + "format": "uuid" + }, + "metadata": { + "title": "Metadata", + "description": "Represents system's metadata.", + "allOf": [ + { + "title": "Metadata", + "description": "Represents system's metadata.", + "type": "object", + "properties": { + "wizard": { + "title": "Wizard", + "type": "object", + "description": "Represents the metadata to keep track of the current wizard step.", + "required": [ + "step" + ], + "properties": { + "step": { + "type": "string", + "description": "Represents the last completed wizard step." + } + }, + "x-readme-ref-name": "MetadataWizard" + }, + "energy": { + "title": "Energy Metadata", + "type": "object", + "description": "represents the metadata related to the energy use case.", + "properties": { + "installer": { + "type": "string", + "nullable": true, + "description": "Installer is the person who has installed the systems." + }, + "norminalPower": { + "type": "number", + "nullable": true, + "description": "The system's maximal power production in Wp (for historical reasons the word \"norminal\" is used instead of the correct term \"nominal power\")." + }, + "curtailment": { + "type": "number", + "nullable": true, + "description": "Curtailment is the percentage of system's norminal power at which the pv inverters should stop feeding into the grid. (0-1)" + }, + "heatingSystem": { + "type": "string", + "nullable": true, + "description": "HeatingSystem represents the type of the heating system." + }, + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "deprecated": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "ems": { + "title": "MetadataEMS", + "type": "object", + "description": "MetadataEMS represents the energy management allowances.", + "properties": { + "agreedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedEMSTerms indicates if the customers accepts the ems terms." + }, + "enabledEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledEMS indicates if gridBox should activate the ems." + }, + "agreedDynamicPVControlTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedDynamicPVControlTerms indicates if the customer accepts the dynamic pc control terms." + }, + "enabledDynamicPVControl": { + "type": "boolean", + "nullable": true, + "description": "EnabledDynamicPVControl indicates if the gridBox should activate the dynamic pv control." + }, + "agreedForecastBasedEMSTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedForecastBasedEMSTerms indicates if the customer accepts the forecast-based EMS." + }, + "enabledForecastBasedEMS": { + "type": "boolean", + "nullable": true, + "description": "EnabledForecastBasedEMS indicates if the gridBox should activate the forecast-based EMS." + }, + "agreedPriorityConfigurationTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPriorityConfigurationTerms indicates if the customer accepts the priority configuration terms." + }, + "enabledPriorityConfiguration": { + "type": "boolean", + "nullable": true, + "description": "EnabledPriorityConfiguration indicates if the gridBox should activate the priority configuration." + }, + "agreedPowerManagementTerms": { + "type": "boolean", + "nullable": true, + "description": "AgreedPowerManagementTerms indicates if the customer accepts the power management terms." + }, + "enabledPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerManagement indicates if the gridBox should activate the power management." + }, + "enabledStaticPowerManagement": { + "type": "boolean", + "nullable": true, + "description": "EnabledStaticPowerManagement indicates if the gridBox should activate the static power management." + }, + "enabledPowerImportPeakOptimization": { + "type": "boolean", + "nullable": true, + "description": "EnabledPowerImportPeakOptimization indicates if the gridBox should activate the 15min avg. energy optimization algorithm." + }, + "powerImportPeakPerOptimizationInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "Describes the amount of imported energy in a 15 minutes interval in mVA." + }, + "enabledBatteryFullGridCharge": { + "type": "boolean", + "nullable": true, + "description": "If enabled, the battery can be recharged from the grid with 100% of the maximum charging power. If disabled, the default value is 30%." + }, + "enabledLessConstrainingSOCLimits": { + "type": "boolean", + "nullable": true, + "description": "If enabled, allows applying both \"more constraining\" and \"less constraining\" SOC limits. If disabled, only the \"most constraining\" SOC limits are considered." + }, + "derAPISettings": { + "title": "DerAPISettings", + "type": "object", + "description": "DerAPISettings represents the metadata related to DER API configuration.", + "properties": { + "enabledCloudAPI": { + "type": "boolean", + "nullable": true, + "description": "EnabledCloudAPI enables assets control with cloud DER API." + }, + "constraints": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + }, + "flexibilities": { + "title": "SyncEntitySettings", + "type": "object", + "description": "SyncEntitySettings configures entity synchronisation parameters.", + "properties": { + "syncInterval": { + "type": "number", + "nullable": true, + "format": "double", + "description": "SyncInterval defines the period in seconds for data to be synchronized between gridBox and cloud DER API." + }, + "ttl": { + "type": "number", + "nullable": true, + "format": "double", + "description": "TTL defines the time to live in seconds for entity." + }, + "disabled": { + "type": "boolean", + "description": "Disabled disables the sync of entities." + } + }, + "x-readme-ref-name": "SyncEntitySettings" + } + }, + "x-readme-ref-name": "DerAPISettings" + }, + "enabledTimeOfUseOptimization": { + "deprecated": true, + "type": "boolean", + "nullable": true, + "description": "Indicates if time of use optimization is enabled for the system.\n*Deprecated* - Use `systems/{systemID}/timeofuse/options` endpoint instead.\n" + }, + "disableAveragePmaxCalculation": { + "type": "boolean", + "nullable": true, + "description": "Disables the average pMax calculation. It means EMS will not calculate average pMax and will get the default value instead." + }, + "excludeApplianceTypes": { + "description": "Appliance types to be ignored by the EMS. Updating this field to an empty array clears it. **Please note that this currently requires the box to be restarted to take effect**.", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "HEAT_PUMP" + ] + } + }, + "evChargingReallocationTolerance": { + "description": "Specifies the maximum power that can be drawn to charge an EV in case the PV surplus is not sufficient (in mVA).", + "nullable": true, + "type": "number", + "format": "double", + "example": 500000 + } + }, + "x-readme-ref-name": "MetadataEMS" + }, + "smartMeterInstallationTimestamp": { + "nullable": true, + "description": "The time the smart meter has been installed (if any), in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-09-21T00:00:00Z" + } + }, + "x-readme-ref-name": "MetadataEnergy" + }, + "energySupplier": { + "title": "Energy Supplier", + "type": "object", + "description": "MetadataEnergySupplier represents the metadata related to energy supplier.", + "properties": { + "type": { + "type": "string", + "nullable": true, + "deprecated": true, + "description": "Type determines if gridX is the energy supplier. The value is either \"GRIDX\" or \"OTHER\".", + "enum": [ + "GRIDX", + "OTHER" + ] + }, + "unitPrice": { + "type": "number", + "nullable": true, + "description": "UnitPrice is unit price per kWh in EU cent. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "installment": { + "type": "number", + "nullable": true, + "description": "Installment is the monthly payment." + }, + "baseFee": { + "type": "number", + "nullable": true, + "description": "BaseFee is the monthly base fee." + }, + "feedInTariff": { + "type": "number", + "nullable": true, + "description": "FeedInTariff is the cost-based compensation in EUR cent for feeding in. Deprecated - Use TariffV2 instead.", + "deprecated": true + }, + "expectedConsumption": { + "type": "number", + "nullable": true, + "description": "ExpectedConsumption is the expected annual consumption in kWh." + } + }, + "x-readme-ref-name": "MetadataEnergySupplier" + }, + "smartMeter": { + "title": "Smart Meter", + "description": "Represents the metadata to report if a smart meter has been installed.", + "type": "object", + "properties": { + "installed": { + "type": "boolean", + "nullable": true, + "description": "Reports if the smart meter has been installed." + }, + "hasInstallationDate": { + "type": "boolean", + "nullable": true, + "description": "Reports if the provider has sent us a installation date that can be found in energy metadata." + } + }, + "x-readme-ref-name": "MetadataSmartMeter" + } + }, + "x-readme-ref-name": "AbstractSystemMetadata" + }, + {} + ], + "x-readme-ref-name": "SystemMetadataWithRabotCharge" + } + }, + "required": [ + "id", + "name", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "System" + }, + { + "type": "object", + "properties": { + "starredAt": { + "description": "Date when the system was starred in RFC3339 format.", + "type": "string", + "format": "date-time", + "example": "2020-11-10T13:13:00Z", + "readOnly": true + } + }, + "required": [ + "name", + "createdAt", + "updatedAt", + "starredAt" + ] + } + ], + "x-readme-ref-name": "StarredSystem" + }, + "StarredAccount": { + "description": "Represents a starred account which holds an additional starredAt timestamp.\n", + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n", + "type": "object", + "readOnly": true, + "allOf": [ + { + "title": "Account", + "description": "An account describes an organizational unit to manage access to systems for one or multiple users.\n\nThis is the base type for the more concrete usages and not used directly within operations.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "John Doe", + "description": "Name of the account, can be chosen freely but should be kept terse and descriptive.", + "minLength": 1, + "maxLength": 256 + }, + "email": { + "type": "string", + "format": "email", + "example": "john@doe.com", + "description": "The email field of the account can optionally be chosen e.g. for contact purposes (in order to reach the responsible person for the account).", + "maxLength": 256 + }, + "solution": { + "type": "string", + "description": "Represents the supported solutions within the account:\n- HOME if the account contains household-like systems. \n- CHARGE if the account is used solely for charging station fleet management.\n- GENERAL if unsure what the account should contain or if it's a mix of multiple solutions.\n- SMART_DISTRICT if the account is used solely for smart district management.\nIf not set, the parent account's solution will be assumed.\n", + "enum": [ + "HOME", + "CHARGE", + "GENERAL", + "SMART_DISTRICT", + "MICROGRID", + "HOME_VIRTUAL_METERING", + "COMMERCIAL", + "CUSTOM_P2P" + ], + "x-readme-ref-name": "AccountSolution" + } + }, + "x-readme-ref-name": "AbstractAccount" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Uniquely identifies the account." + }, + "parentID": { + "type": "string", + "format": "uuid", + "example": "19a4f165-8233-426b-a1a4-e569665a25dd", + "description": "Parent of the account for a tree-like account structure. Only the root account does not have a parent ID." + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was created." + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "Specifies when the account was updated." + }, + "systemsCount": { + "type": "integer", + "description": "SystemCount is the number of systems assigned to this account", + "example": 1 + }, + "kind": { + "type": "string", + "enum": [ + "b2b", + "end-user" + ], + "description": "If b2b, the account is a regular account. If end-user, the account is a customer account which contains just one user.", + "x-readme-ref-name": "AccountKind" + }, + "mainAddress": { + "title": "Address", + "description": "Represents a physical address of a customer.", + "allOf": [ + { + "type": "object", + "properties": { + "city": { + "description": "The city of the location.", + "type": "string", + "example": "Aachen" + }, + "country": { + "description": "The country of the location.", + "type": "string", + "example": "Germany" + }, + "addressLine1": { + "description": "First line of the location's address, typically containing the \nmain information such as the street name and house number.\n", + "type": "string", + "example": "Oppenhoffallee 143" + }, + "addressLine2": { + "description": "Second line of the location's address, typically containing additional \ninformation such as apartment numbers, suite numbers, or other details \nthat can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine3": { + "description": "Third line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "addressLine4": { + "description": "Fourth line of the location's address, typically containing any other \ndetails that can help in identifying the exact location of the address.\n", + "type": "string" + }, + "timeZone": { + "description": "The TZ Identifier of the location's timezone.", + "type": "string", + "example": "Europe/Berlin", + "readOnly": true + } + }, + "x-readme-ref-name": "AbstractLocation" + }, + { + "type": "object", + "properties": { + "postalcode": { + "description": "The postal code of the location.", + "type": "string", + "example": "52062" + }, + "region": { + "description": "The region of the address.", + "type": "string" + }, + "telephone": { + "description": "The telephone number of the customer.", + "type": "string" + } + } + } + ], + "x-readme-ref-name": "Address" + }, + "customization": { + "description": "Customization can be used to store arbitrary data." + } + }, + "required": [ + "id", + "createdAt", + "updatedAt" + ] + } + ], + "x-readme-ref-name": "Account" + }, + { + "type": "object", + "properties": { + "starredAt": { + "description": "Time when the account was starred in UTC (RFC 3339 format).", + "type": "string", + "format": "date-time", + "example": "2020-11-10T13:13:00Z", + "readOnly": true + } + }, + "required": [ + "starredAt" + ] + } + ], + "x-readme-ref-name": "StarredAccount" + }, + "NotificationUpdate": { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + } + ], + "x-readme-ref-name": "NotificationUpdate" + }, + "NotificationUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "Notification", + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "Type of the event that triggered the notification." + }, + "systemID": { + "type": "string", + "format": "uuid", + "description": "Identifies the affected system.", + "example": "49a4f165-8233-426b-a1a4-e569665a25dd" + }, + "content": { + "type": "string", + "description": "Textual content that is displayed within the dashboard." + }, + "read": { + "type": "boolean", + "description": "If true, the message has been read by the user, otherwise it was not read yet." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the event with `eventType` was issued by the notification system in UTC in RFC3339 format." + } + }, + "x-readme-ref-name": "AbstractNotification" + } + ], + "x-readme-ref-name": "NotificationUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "NotificationUpdateStrict" + }, + "APITokenCreationStrict": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "APITokenCreationStrict" + }, + "PersonalAPITokenWithSecret": { + "title": "PersonalAPITokenWithSecret", + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + }, + { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc8ee525-669f-45de-9bca-bf5a51829de3", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Time at which the token was created in UTC using the RFC3339 format.", + "example": "2021-10-10T23:20:50Z", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "id", + "createdAt" + ] + } + ], + "x-readme-ref-name": "APIToken" + }, + { + "properties": { + "token": { + "type": "string", + "description": "This token can be used for authenticating further requests as an alternative to Bearer Authentication.\n\nExample: Set the header field `Authorization` to `Token gxp_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0`. \nThe permissions of this tokens are the same as the user that created it.\n\n**ATTENTION** - Please keep the token secret and treat it like a password! The token is only available immediately after creation and can not be retrieved again afterwards.\n", + "example": "gxp_SUDJmIoABC1337JiAuKBZuauC0ff331HNPR0" + } + }, + "required": [ + "token" + ] + } + ], + "x-readme-ref-name": "PersonalAPITokenWithSecret" + }, + "APITokenUpdate": { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + } + ], + "x-readme-ref-name": "APITokenUpdate" + }, + "APITokenUpdateStrict": { + "allOf": [ + { + "allOf": [ + { + "title": "APIToken", + "description": "API Tokens can be used as an alternative to Bearer Authentication for making requests.\nThey are instead used as an in-header API Key.\n", + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "My api token" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "Time at which the token expires in UTC using the RFC3339 format.\n\n**WARNING** - if `expiresAt` is not set, the token will never expire. We strongly recommend\nthat you set an expiration date to help keep your account and information secure.\n", + "example": "2021-11-10T23:00:00Z" + } + }, + "x-readme-ref-name": "AbstractAPIToken" + } + ], + "x-readme-ref-name": "APITokenUpdate" + }, + { + "additionalProperties": false + } + ], + "x-readme-ref-name": "APITokenUpdateStrict" + } + }, + "examples": { + "powerLimitScheduleDaily": { + "summary": "Daily repeating", + "value": { + "title": "Daily repeating", + "from": "2024-01-01T00:00:00+02:00", + "to": "2025-01-01T00:00:00+02:00", + "timeframes": [ + { + "from": "00:00", + "to": "18:00", + "maxPower": 100000 + }, + { + "from": "18:00", + "to": "00:00", + "maxPower": 150000 + } + ], + "recurrence": { + "frequency": "DAILY" + } + } + }, + "powerLimitScheduleWeekends": { + "summary": "Weekends", + "value": { + "title": "Weekends", + "from": "2024-01-01T00:00:00+02:00", + "to": "2025-01-01T00:00:00+02:00", + "timeframes": [ + { + "from": "00:00", + "to": "00:00", + "maxPower": 100000 + } + ], + "recurrence": { + "frequency": "DAILY", + "byDayOfWeek": [ + "SA", + "SU" + ] + } + } + }, + "systemPatch": { + "summary": "Update system name", + "value": { + "name": "gridX Headquarter" + } + }, + "enableDerApi": { + "description": "This example enables cloud DER API.\nThis means that the gridBox will publish both constraints and flexibilities, which makes the objects available through the API.\n", + "summary": "Enable DER API", + "value": { + "metadata": { + "energy": { + "ems": { + "derAPISettings": { + "enabledCloudAPI": true + } + } + } + } + } + }, + "enableDerApiWithoutFlexibilitiesSync": { + "description": "This example enables cloud DER API without flexibilities being synchronised with gridBox.\nThis means that the gridBox won't publish flexibilities and only considers the constraints published to the cloud.\n", + "summary": "Enable DER API, do not sync flexibilities", + "value": { + "metadata": { + "energy": { + "ems": { + "derAPISettings": { + "enabledCloudAPI": true, + "flexibilities": { + "disabled": true + } + } + } + } + } + } + }, + "scheduledStartPowerSequence": { + "summary": "Start a power sequence at a scheduled time.", + "value": { + "startTime": "2021-06-24T12:00:00" + } + }, + "runningPowerSequence": { + "summary": "Running power sequence", + "value": { + "sequenceId": 1, + "state": "running", + "activeSlotNumber": 1, + "sequenceRemoteControllable": true, + "startTime": "2021-06-24T12:00:00Z", + "endTime": "2021-06-24T13:40:00Z", + "earliestStartTime": "2021-06-24T06:20:00Z", + "latestEndTime": "2021-06-24T19:00:00Z", + "isPausable": false, + "isStoppable": false, + "powerTimeSlots": [ + { + "slotId": 1, + "defaultDuration": "00:23:00", + "powerMin": 100, + "powerExpectedValue": 200, + "powerMax": 2000 + }, + { + "slotId": 2, + "defaultDuration": "01:17:00", + "powerMin": 90, + "powerExpectedValue": 180, + "powerMax": 1800 + } + ] + } + }, + "scheduledPowerSequence": { + "summary": "Scheduled power sequence", + "value": { + "sequenceId": 1, + "state": "scheduled", + "activeSlotNumber": 0, + "sequenceRemoteControllable": true, + "startTime": "2021-06-24T12:00:00Z", + "endTime": "2021-06-24T13:40:00Z", + "earliestStartTime": "2021-06-24T06:20:00Z", + "latestEndTime": "2021-06-24T19:00:00Z", + "isPausable": false, + "isStoppable": false, + "powerTimeSlots": [ + { + "slotId": 1, + "defaultDuration": "00:23:00", + "powerMin": 100, + "powerExpectedValue": 200, + "powerMax": 2000 + }, + { + "slotId": 2, + "defaultDuration": "01:17:00", + "powerMin": 90, + "powerExpectedValue": 180, + "powerMax": 1800 + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/viessmann_gridbox_connector/config.json b/viessmann_gridbox_connector/config.json index 6aab4d3..0fa24c0 100644 --- a/viessmann_gridbox_connector/config.json +++ b/viessmann_gridbox_connector/config.json @@ -2,7 +2,8 @@ "urls": { "login": "https://gridx.eu.auth0.com/oauth/token", "gateways": "https://api.gridx.de/gateways", - "live": "https://api.gridx.de/systems/{}/live" + "live": "https://api.gridx.de/systems/{}/live", + "historical": "https://api.gridx.de/systems/{}/historical?interval={}&resolution={}" }, "login": { "grant_type": "http://auth0.com/oauth/grant-type/password-realm",