{"openapi":"3.1.0","info":{"title":"HomeNext API","description":"HomeNext REST and S2 API","version":"1.0.0"},"servers":[{"url":"http://localhost:3000","description":"Local"},{"url":"https://api-test.homenext.io","description":"Test"},{"url":"https://api.homenext.io","description":"Production"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"access_token"}}},"paths":{"/auth/login":{"get":{"operationId":"getAuthLogin","tags":["Auth"],"summary":"Initiate sign-in","description":"Generates a PKCE challenge, stores the verifier in a short-lived cookie, and redirects the browser to the identity provider's authorization endpoint. Requires the `vendor` query parameter identifying which IdP to use.","responses":{"302":{"description":"Redirect to the identity provider's authorization endpoint."},"400":{"description":"Missing or unknown vendor, or the vendor is not configured for browser login.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"]}}}}}}},"/auth/callback":{"get":{"operationId":"getAuthCallback","tags":["Auth"],"summary":"Complete sign-in","description":"Completes the OAuth 2.0 / PKCE sign-in flow after the identity provider redirects the browser back. On success, issues session cookies and redirects to the originally requested path. Clients should not call this endpoint directly; it is invoked by the identity provider.","responses":{"302":{"description":"Redirect back to the originally requested path, or to an error page on failure."},"400":{"description":"Missing or invalid authorization code, PKCE verifier, state, or vendor.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Unexpected server error while completing sign-in.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}}},"/auth/logout":{"get":{"operationId":"getAuthLogout","tags":["Auth"],"summary":"Sign out","description":"Clears the session cookies and redirects to the identity provider's logout endpoint so the user is signed out both locally and at the IdP.","responses":{"302":{"description":"Redirect to the identity provider's logout page."}}}},"/v1/me":{"get":{"operationId":"getV1Me","tags":["Me"],"summary":"Get current user","description":"Returns information about the currently authenticated user, including their subject id, token scopes, and any additional identity claims. Authenticate with either `Authorization: Bearer <jwt>` or the `access_token` browser-session cookie; cookie auth is subject to `SameSite=Lax`, so cross-site state-changing requests do not carry it.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Authenticated user profile and claims.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"sub":{"type":"string"},"clientId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"exp":{"type":"number"},"iat":{"type":"number"},"iss":{"type":"string"},"aud":{"type":"string"},"claims":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["sub","clientId","scopes","exp","iat","iss","aud","claims"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}}},"/v1/me/devices":{"get":{"operationId":"getV1MeDevices","tags":["Me"],"summary":"List my devices","description":"Returns every device the authenticated user can access, each annotated with the role (owner, poweruser, user, viewer) that grants the access. Pass `?integrations=<id>` (repeatable) to additively include devices from opted-in integrations, e.g. `?integrations=homey`, `?integrations=tuya` or `?integrations=victron`. Homey- and Tuya-sourced entries always report the fixed placeholder role `owner`; it conveys no access level, because neither exposes one. Victron-sourced entries carry one item per VRM installation (with `siteId`), not per component. Unknown or unavailable integration ids are ignored, and an integration whose devices cannot be loaded is omitted rather than failing the request.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Devices accessible to the authenticated user.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"integration":{"type":"string"},"type":{"type":"string"},"key":{"type":"string"},"role":{"type":"string","enum":["owner","poweruser","user","viewer","admin"]},"homeyId":{"type":"string"},"ownerUri":{"type":"string"},"siteId":{"type":"string"},"endpoints":{"type":"object","properties":{"self":{"type":"string"}},"required":["self"]}},"required":["integration","type","key","role"]}}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"query","name":"integrations","schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"description":"Repeatable integration id (e.g. `homey`, `tuya` or `victron`) whose devices are included alongside the claim-derived ones. Unknown or unavailable ids are ignored."}]}},"/v1/me/integrations":{"get":{"operationId":"getV1MeIntegrations","tags":["Me"],"summary":"List my integrations","description":"Returns the integrations enabled on the vendor associated with the authenticated token. Only integrations the vendor has configured are returned.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Integrations enabled for the authenticated vendor.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"vendor":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["id","slug","name"]}},"required":["id","vendor"]}}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}}},"/v1/me/presets":{"get":{"operationId":"getV1MePresets","tags":["Presets"],"summary":"List my setting presets","description":"Returns the authenticated user's setting presets, newest first. Optionally filter by `integration` and/or `deviceType`.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Presets owned by the authenticated user.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"integration":{"type":"string","minLength":1},"deviceType":{"type":"string","minLength":1},"name":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","integration","deviceType","name","createdAt","updatedAt","settings"]}}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"query","name":"integration","schema":{"type":"string","minLength":1}},{"in":"query","name":"deviceType","schema":{"type":"string","minLength":1}}]},"post":{"operationId":"postV1MePresets","tags":["Presets"],"summary":"Create a setting preset","description":"Creates a named bundle of device settings for an `(integration, deviceType)` the vendor enables. `settings` is validated against that type's patch schema (e.g. `HeatpumpSettingsPatch`). Duplicate names are allowed.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"201":{"description":"Preset created.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"integration":{"type":"string","minLength":1},"deviceType":{"type":"string","minLength":1},"name":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","integration","deviceType","name","createdAt","updatedAt","settings"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Preset or type not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Per-device-type preset limit reached","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"integration":{"type":"string","minLength":1},"deviceType":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"maxLength":64},"description":{"type":"string","maxLength":256},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Type-specific settings patch (e.g. HeatpumpSettingsPatch for solareast/heatpump)."}},"required":["integration","deviceType","name","settings"]}}}}}},"/v1/me/presets/{id}":{"get":{"operationId":"getV1MePresetsById","tags":["Presets"],"summary":"Get a setting preset","description":"Returns one of the authenticated user's presets by id.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"The preset.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"integration":{"type":"string","minLength":1},"deviceType":{"type":"string","minLength":1},"name":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","integration","deviceType","name","createdAt","updatedAt","settings"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"id","schema":{"type":"string","minLength":1},"required":true}]},"patch":{"operationId":"patchV1MePresetsById","tags":["Presets"],"summary":"Update a setting preset","description":"Updates a preset's `name`, `description`, and/or `settings`. `integration` and `deviceType` are immutable. `settings`, when supplied, is re-validated against the preset's type patch schema.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Updated preset.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"integration":{"type":"string","minLength":1},"deviceType":{"type":"string","minLength":1},"name":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","integration","deviceType","name","createdAt","updatedAt","settings"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"id","schema":{"type":"string","minLength":1},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"description":{"type":"string","maxLength":256},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}}}}},"delete":{"operationId":"deleteV1MePresetsById","tags":["Presets"],"summary":"Delete a setting preset","description":"Deletes one of the authenticated user's presets by id.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Preset deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"id","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/me/presets/{id}/apply":{"post":{"operationId":"postV1MePresetsByIdApply","tags":["Presets"],"summary":"Apply a setting preset to a device","description":"Applies the preset's stored settings to `deviceKey`. The caller must hold write (`user`) access on the target device. Only the fields present in the preset are dispatched; the rest of the device's settings are left untouched.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Settings accepted and dispatched to the device.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"presetId":{"type":"string"},"deviceKey":{"type":"string"},"success":{"type":"boolean","const":true}},"required":["presetId","deviceKey","success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"id","schema":{"type":"string","minLength":1},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"deviceKey":{"type":"string","minLength":1}},"required":["deviceKey"]}}}}}},"/v1/integrations/{integration}/devices/{deviceType}/{deviceKey}/rules/metadata":{"get":{"operationId":"getV1IntegrationsByIntegrationDevicesByDeviceTypeByDeviceKeyRulesMetadata","tags":["Rules"],"summary":"Get rule metadata","description":"Returns the signals and actions available to rules for this device type, for the rule editor UI and the execution worker.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Rule signal and action catalog for the device type.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"integration":{"type":"string"},"deviceType":{"type":"string"},"triggerKinds":{"type":"array","items":{"type":"string","enum":["schedule","stateChange","alarm"]}},"timezoneRequiredForSchedule":{"type":"boolean"},"signals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"label":{"type":"string","minLength":1},"description":{"type":"string"},"valueType":{"type":"string","enum":["number","string","boolean","enum"]},"unit":{"type":"string"},"enumValues":{"type":"array","items":{"type":"string"}},"operators":{"minItems":1,"type":"array","items":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in"]}}},"required":["id","label","valueType","operators"]}},"actions":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1},"label":{"type":"string","minLength":1},"description":{"type":"string"},"paramsSchema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type","label","paramsSchema"]}}},"required":["integration","deviceType","triggerKinds","timezoneRequiredForSchedule","signals","actions"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"integration","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceType","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/integrations/{integration}/devices/{deviceType}/{deviceKey}/rules":{"get":{"operationId":"getV1IntegrationsByIntegrationDevicesByDeviceTypeByDeviceKeyRules","tags":["Rules"],"summary":"List rules","description":"Returns the caller's rules for this device plus any rules other users have shared. Rules are not paginated: the set is bounded per device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Rules visible to the caller.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000},"enabled":{"default":true,"type":"boolean"},"shared":{"default":false,"type":"boolean"},"timezone":{"type":"string","minLength":1},"trigger":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"at"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"at":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","at"]},{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"window"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"from":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"to":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","from","to"]}]},{"type":"object","properties":{"type":{"type":"string","const":"stateChange"},"signalId":{"type":"string","minLength":1}},"required":["type","signalId"]},{"type":"object","properties":{"type":{"type":"string","const":"alarm"},"alarmCode":{"type":"string","minLength":1}},"required":["type"]}]},"conditions":{"$ref":"#/components/schemas/__schema0"},"actions":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1},"params":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"]}},"id":{"type":"string"},"version":{"type":"integer","minimum":1,"maximum":9007199254740991},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["name","trigger","actions","id","version","createdBy","createdAt","updatedAt"]}}},"required":["data"],"$defs":{"__schema0":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"compare"},"signalId":{"type":"string","minLength":1},"operator":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in"]},"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]}}]}},"required":["type","signalId","operator","value"]},{"type":"object","properties":{"type":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/__schema0"}}},"required":["type","conditions"]},{"type":"object","properties":{"type":{"type":"string","const":"not"},"condition":{"$ref":"#/components/schemas/__schema0"}},"required":["type","condition"]}]}}}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"integration","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceType","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true}]},"post":{"operationId":"postV1IntegrationsByIntegrationDevicesByDeviceTypeByDeviceKeyRules","tags":["Rules"],"summary":"Create rule","description":"Creates a rule owned by the caller on this device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"201":{"description":"Created rule.","headers":{"ETag":{"description":"Opaque validator derived from the rule `version`; send it back as `If-Match` on update/delete.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000},"enabled":{"default":true,"type":"boolean"},"shared":{"default":false,"type":"boolean"},"timezone":{"type":"string","minLength":1},"trigger":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"at"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"at":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","at"]},{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"window"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"from":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"to":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","from","to"]}]},{"type":"object","properties":{"type":{"type":"string","const":"stateChange"},"signalId":{"type":"string","minLength":1}},"required":["type","signalId"]},{"type":"object","properties":{"type":{"type":"string","const":"alarm"},"alarmCode":{"type":"string","minLength":1}},"required":["type"]}]},"conditions":{"$ref":"#/components/schemas/__schema0"},"actions":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1},"params":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"]}},"id":{"type":"string"},"version":{"type":"integer","minimum":1,"maximum":9007199254740991},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["name","trigger","actions","id","version","createdBy","createdAt","updatedAt"]}},"required":["data"],"$defs":{"__schema0":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"compare"},"signalId":{"type":"string","minLength":1},"operator":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in"]},"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]}}]}},"required":["type","signalId","operator","value"]},{"type":"object","properties":{"type":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/__schema0"}}},"required":["type","conditions"]},{"type":"object","properties":{"type":{"type":"string","const":"not"},"condition":{"$ref":"#/components/schemas/__schema0"}},"required":["type","condition"]}]}}}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"integration","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceType","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000},"enabled":{"default":true,"type":"boolean"},"shared":{"default":false,"type":"boolean"},"timezone":{"type":"string","minLength":1},"trigger":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"at"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"at":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","at"]},{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"window"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"from":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"to":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","from","to"]}]},{"type":"object","properties":{"type":{"type":"string","const":"stateChange"},"signalId":{"type":"string","minLength":1}},"required":["type","signalId"]},{"type":"object","properties":{"type":{"type":"string","const":"alarm"},"alarmCode":{"type":"string","minLength":1}},"required":["type"]}]},"conditions":{"$ref":"#/components/schemas/__schema0"},"actions":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1},"params":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"]}}},"required":["name","trigger","actions"],"$defs":{"__schema0":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"compare"},"signalId":{"type":"string","minLength":1},"operator":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in"]},"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]}}]}},"required":["type","signalId","operator","value"]},{"type":"object","properties":{"type":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/__schema0"}}},"required":["type","conditions"]},{"type":"object","properties":{"type":{"type":"string","const":"not"},"condition":{"$ref":"#/components/schemas/__schema0"}},"required":["type","condition"]}]}}}}}}}},"/v1/integrations/{integration}/devices/{deviceType}/{deviceKey}/rules/{ruleId}":{"get":{"operationId":"getV1IntegrationsByIntegrationDevicesByDeviceTypeByDeviceKeyRulesByRuleId","tags":["Rules"],"summary":"Get rule","description":"Returns a single rule the caller can see, or 404 when the rule does not exist or is not visible to the caller.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Rule.","headers":{"ETag":{"description":"Opaque validator derived from the rule `version`; send it back as `If-Match` on update/delete.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000},"enabled":{"default":true,"type":"boolean"},"shared":{"default":false,"type":"boolean"},"timezone":{"type":"string","minLength":1},"trigger":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"at"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"at":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","at"]},{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"window"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"from":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"to":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","from","to"]}]},{"type":"object","properties":{"type":{"type":"string","const":"stateChange"},"signalId":{"type":"string","minLength":1}},"required":["type","signalId"]},{"type":"object","properties":{"type":{"type":"string","const":"alarm"},"alarmCode":{"type":"string","minLength":1}},"required":["type"]}]},"conditions":{"$ref":"#/components/schemas/__schema0"},"actions":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1},"params":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"]}},"id":{"type":"string"},"version":{"type":"integer","minimum":1,"maximum":9007199254740991},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["name","trigger","actions","id","version","createdBy","createdAt","updatedAt"]}},"required":["data"],"$defs":{"__schema0":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"compare"},"signalId":{"type":"string","minLength":1},"operator":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in"]},"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]}}]}},"required":["type","signalId","operator","value"]},{"type":"object","properties":{"type":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/__schema0"}}},"required":["type","conditions"]},{"type":"object","properties":{"type":{"type":"string","const":"not"},"condition":{"$ref":"#/components/schemas/__schema0"}},"required":["type","condition"]}]}}}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"integration","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceType","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"ruleId","schema":{"type":"string","minLength":1},"required":true}]},"put":{"operationId":"putV1IntegrationsByIntegrationDevicesByDeviceTypeByDeviceKeyRulesByRuleId","tags":["Rules"],"summary":"Replace rule","description":"Replaces a rule the caller created (or a device admin). Requires `If-Match` with the current ETag; a stale version fails with 412.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Updated rule.","headers":{"ETag":{"description":"Opaque validator derived from the rule `version`; send it back as `If-Match` on update/delete.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000},"enabled":{"default":true,"type":"boolean"},"shared":{"default":false,"type":"boolean"},"timezone":{"type":"string","minLength":1},"trigger":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"at"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"at":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","at"]},{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"window"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"from":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"to":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","from","to"]}]},{"type":"object","properties":{"type":{"type":"string","const":"stateChange"},"signalId":{"type":"string","minLength":1}},"required":["type","signalId"]},{"type":"object","properties":{"type":{"type":"string","const":"alarm"},"alarmCode":{"type":"string","minLength":1}},"required":["type"]}]},"conditions":{"$ref":"#/components/schemas/__schema0"},"actions":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1},"params":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"]}},"id":{"type":"string"},"version":{"type":"integer","minimum":1,"maximum":9007199254740991},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["name","trigger","actions","id","version","createdBy","createdAt","updatedAt"]}},"required":["data"],"$defs":{"__schema0":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"compare"},"signalId":{"type":"string","minLength":1},"operator":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in"]},"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]}}]}},"required":["type","signalId","operator","value"]},{"type":"object","properties":{"type":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/__schema0"}}},"required":["type","conditions"]},{"type":"object","properties":{"type":{"type":"string","const":"not"},"condition":{"$ref":"#/components/schemas/__schema0"}},"required":["type","condition"]}]}}}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"412":{"description":"Precondition failed — the rule version changed since it was read","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"428":{"description":"Precondition required — the `If-Match` header is missing","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"integration","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceType","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"ruleId","schema":{"type":"string","minLength":1},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000},"enabled":{"default":true,"type":"boolean"},"shared":{"default":false,"type":"boolean"},"timezone":{"type":"string","minLength":1},"trigger":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"at"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"at":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","at"]},{"type":"object","properties":{"type":{"type":"string","const":"schedule"},"mode":{"type":"string","const":"window"},"days":{"minItems":1,"type":"array","items":{"type":"string","enum":["mo","tu","we","th","fr","sa","su"]}},"from":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"to":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["type","mode","days","from","to"]}]},{"type":"object","properties":{"type":{"type":"string","const":"stateChange"},"signalId":{"type":"string","minLength":1}},"required":["type","signalId"]},{"type":"object","properties":{"type":{"type":"string","const":"alarm"},"alarmCode":{"type":"string","minLength":1}},"required":["type"]}]},"conditions":{"$ref":"#/components/schemas/__schema0"},"actions":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1},"params":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"]}}},"required":["name","trigger","actions"],"$defs":{"__schema0":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"compare"},"signalId":{"type":"string","minLength":1},"operator":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in"]},"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"}]}}]}},"required":["type","signalId","operator","value"]},{"type":"object","properties":{"type":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/__schema0"}}},"required":["type","conditions"]},{"type":"object","properties":{"type":{"type":"string","const":"not"},"condition":{"$ref":"#/components/schemas/__schema0"}},"required":["type","condition"]}]}}}}}}},"delete":{"operationId":"deleteV1IntegrationsByIntegrationDevicesByDeviceTypeByDeviceKeyRulesByRuleId","tags":["Rules"],"summary":"Delete rule","description":"Deletes a rule the caller created (or a device admin). Requires `If-Match` with the current ETag; a stale version fails with 412.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"204":{"description":"Rule deleted."},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"412":{"description":"Precondition failed — the rule version changed since it was read","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"428":{"description":"Precondition required — the `If-Match` header is missing","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"integration","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceType","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"ruleId","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/integrations/solareast/devices/heatpump/{deviceKey}/capabilities":{"get":{"operationId":"getV1IntegrationsSolareastDevicesHeatpumpByDeviceKeyCapabilities","tags":["SolarEast / Heatpump"],"summary":"Get device capabilities","description":"Reports the static capabilities the caller can perform on this heatpump, scoped to the resolved variant (configuration) and the caller's role for the device. Detection classifies the installation as single/three phase, all-electric/hybrid, and whether a DHW tank and/or buffer tank is present; the matched variant is returned as `configurationId` with a structured `classification` object. Pass `?configurationId=<id>` to bypass detection and pin a specific variant.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Resolved capabilities for the caller's role on the device.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"integration":{"type":"string"},"deviceType":{"type":"string"},"configurationId":{"type":"string"},"role":{"type":"string"},"capabilities":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"operations":{"type":"object","properties":{"read":{"type":"boolean"},"write":{"type":"boolean"}},"required":["read","write"]}},"required":["id","label","operations"]}},"classification":{"type":"object","properties":{"phase":{"type":"string","enum":["single_phase","three_phase"]},"type":{"type":"string","enum":["all_electric","hybrid"]},"dhw":{"type":"boolean"},"bufferTank":{"type":"boolean"}},"required":["phase","type","dhw","bufferTank"]}},"required":["integration","deviceType","configurationId","role","capabilities"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true},{"in":"query","name":"configurationId","schema":{"type":"string","minLength":1}}]}},"/v1/integrations/solareast/devices/boiler/{deviceKey}/capabilities":{"get":{"operationId":"getV1IntegrationsSolareastDevicesBoilerByDeviceKeyCapabilities","tags":["SolarEast / Boiler"],"summary":"Get device capabilities","description":"Reports the static capabilities the caller can perform on this boiler, scoped to the resolved variant (configuration) and the caller's role for the device. The boiler has a single static configuration (no installation axes). Pass `?configurationId=<id>` to pin a specific variant.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Resolved capabilities for the caller's role on the device.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"integration":{"type":"string"},"deviceType":{"type":"string"},"configurationId":{"type":"string"},"role":{"type":"string"},"capabilities":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"operations":{"type":"object","properties":{"read":{"type":"boolean"},"write":{"type":"boolean"}},"required":["read","write"]}},"required":["id","label","operations"]}},"classification":{"type":"object","properties":{"phase":{"type":"string","enum":["single_phase","three_phase"]},"type":{"type":"string","enum":["all_electric","hybrid"]},"dhw":{"type":"boolean"},"bufferTank":{"type":"boolean"}},"required":["phase","type","dhw","bufferTank"]}},"required":["integration","deviceType","configurationId","role","capabilities"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string","minLength":1},"required":true},{"in":"query","name":"configurationId","schema":{"type":"string","minLength":1}}]}},"/v1/integrations/solareast/heatpump/{deviceKey}":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKey","tags":["SolarEast / Heatpump"],"summary":"Get heatpump status and settings","description":"Returns the heatpump's live operating status and current user settings combined in a single response.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Heatpump status and settings.","headers":{"Last-Modified":{"description":"When the heatpump data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"object","properties":{"deviceKey":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string"},"power":{"type":"boolean"},"mode":{"type":"string","enum":["off","cooling","heating","dhw","floor_heating","dhw_cooling","dhw_heating","dhw_floor_heating"]},"operatingMode":{"type":"string","enum":["standard","power","silent"]},"temperatureControlMode":{"type":"string","enum":["inlet","outlet"],"description":"Water-temperature reference used for regulation: \"inlet\" for inlet/return water, \"outlet\" for outlet/discharge water. Read-only device-wide control configuration; defaults to \"inlet\" when telemetry is missing or invalid.","readOnly":true},"temperatures":{"type":"object","properties":{"waterInlet":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"},"waterOutlet":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterOutletTepmpT15 (celsius)","unit":"celsius"},"bufferTank":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"bufferTankTempT10 (celsius)","unit":"celsius"},"dhw":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"dhwTempT16 (celsius)","unit":"celsius"},"dhwReturn":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"dhwReturnWaterTempT13 (celsius)","unit":"celsius"},"heatingSource":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"heatingHeatSourceTempT11 (celsius)","unit":"celsius"},"dhwSource":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"dhwHeatSourceTempT12 (celsius)","unit":"celsius"},"ambient":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"externalAmbientTemp (celsius)","unit":"celsius"},"indoor":{"anyOf":[{"type":"number"},{"type":"null"}]},"coilOuter":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"outerCoilTemp (celsius)","unit":"celsius"},"coilInner":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"innerCoilTemp (celsius)","unit":"celsius"},"suction":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"suctionTempT2 (celsius)","unit":"celsius"},"exhaust":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"exhaustTempT3 (celsius)","unit":"celsius"},"totalWaterOutlet":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"totalWaterOutletTempT9 (celsius)","unit":"celsius"},"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"},"targetMin":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"},"targetMax":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"}},"required":["waterInlet","waterOutlet","bufferTank","dhw","dhwReturn","heatingSource","dhwSource","ambient","indoor","coilOuter","coilInner","suction","exhaust","totalWaterOutlet","target","targetMin","targetMax"]},"setpoints":{"type":"object","properties":{"cooling":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetCooling (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"heating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHotWater (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4"]}}},"floorHeating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetFloorHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"bivalent":{"type":"object","properties":{"electricHeater":{"type":"number","description":"Ambient temperature from which the Electric Heater can be actived (celsius)","unit":"celsius"},"startup":{"type":"number","description":"Ambient temperature from which the Heatpump can be activated (celcius)","unit":"celsius"}}}}},"temperatureRanges":{"type":"object","properties":{"cooling":{"type":"object","properties":{"min":{"type":"number","description":"cooling temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"cooling temperature upper limit (celsius)","unit":"celsius"}}},"heating":{"type":"object","properties":{"min":{"type":"number","description":"heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"heating temperature upper limit (celsius)","unit":"celsius"}}},"dhw":{"type":"object","properties":{"min":{"type":"number","description":"DHW temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"DHW temperature upper limit (celsius)","unit":"celsius"}}},"floorHeating":{"type":"object","properties":{"min":{"type":"number","description":"floor heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"floor heating temperature upper limit (celsius)","unit":"celsius"}}}},"required":["heating","dhw"]},"compressor":{"type":"object","properties":{"running":{"type":"boolean"},"frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorRunningFrequency (hz)","unit":"hz"},"targetFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressor1TargetRunningFrequency (hz)","unit":"hz"},"ipmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorIpmTemp (celsius)","unit":"celsius"},"phaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorPhaseCurrent (ampere)","unit":"ampere"},"silentModeMaxHz":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"silentModeCompressorMaximumFrequency (hz)","unit":"hz"},"powerModeMaxHz":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"targetFrequencyUpperLimitPowerMode (hz)","unit":"hz"}},"required":["running","frequency","targetFrequency","ipmTemp","phaseCurrent","silentModeMaxHz","powerModeMaxHz"]},"compressorSecondary":{"anyOf":[{"type":"object","properties":{"running":{"type":"boolean"},"frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorFrequency (hz)","unit":"hz"},"ipmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorIpmTemp (celsius)","unit":"celsius"},"phaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorPhaseCurrent (ampere)","unit":"ampere"}},"required":["running","frequency","ipmTemp","phaseCurrent"]},{"type":"null"}]},"fan":{"type":"object","properties":{"frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"fanMotorFrequency (hz)","unit":"hz"}},"required":["frequency"]},"pump":{"type":"object","properties":{"running":{"type":"boolean"},"speedPwm":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterPumpSpeedPwm (percent)","unit":"percent"},"flowRate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterFlowRate (l/min)","unit":"l/min"}},"required":["running","speedPwm","flowRate"]},"system1":{"type":"object","properties":{"compressorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorRunningFrequency (hz)","unit":"hz"},"compressorTargetFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressor1TargetRunningFrequency (hz)","unit":"hz"},"fanMotorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"fanMotorFrequency (hz)","unit":"hz"},"eevOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eevOpeningStep (step)","unit":"step"},"eviOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eviOpeningStep (step)","unit":"step"},"acInputVoltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"acInputVoltage (volt)","unit":"volt"},"acInputCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"acInputCurrent (ampere)","unit":"ampere"},"compressorPhaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorPhaseCurrent (ampere)","unit":"ampere"},"compressorIpmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorIpmTemp (celsius)","unit":"celsius"},"highPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"highPressureSaturationTempA14 (celsius)","unit":"celsius"},"lowPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"lowPressureSaturationTemp (celsius)","unit":"celsius"},"outerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"outerCoilTemp (celsius)","unit":"celsius"},"innerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"innerCoilTemp (celsius)","unit":"celsius"},"suctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"suctionTempT2 (celsius)","unit":"celsius"},"exhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"exhaustTempT3 (celsius)","unit":"celsius"},"eviSuctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eviHeatExchangerSuctionTempT5 (celsius)","unit":"celsius"},"eviExhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eviHeatExchangerExhuastTempT6 (celsius)","unit":"celsius"},"temperatureAfterRegenerator":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system1TemperatureAfterRegenerator (celsius)","unit":"celsius"},"fluorineCircuitAntifreeze":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"fluorineCircuitAntifrizeT14 (celsius)","unit":"celsius"}},"required":["compressorFrequency","compressorTargetFrequency","fanMotorFrequency","eevOpeningStep","eviOpeningStep","acInputVoltage","acInputCurrent","compressorPhaseCurrent","compressorIpmTemp","highPressureSaturationTemp","lowPressureSaturationTemp","outerCoilTemp","innerCoilTemp","suctionTemp","exhaustTemp","eviSuctionTemp","eviExhaustTemp","temperatureAfterRegenerator","fluorineCircuitAntifreeze"]},"system2":{"anyOf":[{"type":"object","properties":{"compressorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorFrequency (hz)","unit":"hz"},"compressorTargetFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressor2TargetRunningFrequency (hz)","unit":"hz"},"fanMotorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2FanMotorFrequency (hz)","unit":"hz"},"eevOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EevOpeningStep (step)","unit":"step"},"eviOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EviOpeningStep (step)","unit":"step"},"acInputVoltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2AcInputVoltage (volt)","unit":"volt"},"acInputCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2AcInputCurrent (ampere)","unit":"ampere"},"compressorPhaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorPhaseCurrent (ampere)","unit":"ampere"},"compressorIpmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorIpmTemp (celsius)","unit":"celsius"},"highPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2HighPressureSaturationTemp (celsius)","unit":"celsius"},"lowPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2LowPressureSaturationTempA14 (celsius)","unit":"celsius"},"outerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2OuterCoilTempT9 (celsius)","unit":"celsius"},"innerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2InnerCoilTempT12 (celsius)","unit":"celsius"},"suctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2SuctionTempT10 (celsius)","unit":"celsius"},"exhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2ExhaustTempT11 (celsius)","unit":"celsius"},"eviSuctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EviHeatExchangerSuctionTempT13 (celsius)","unit":"celsius"},"eviExhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EviHeatExchangerExhuastTempT14 (celsius)","unit":"celsius"},"temperatureAfterRegenerator":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2TemperatureAfterRegenerator (celsius)","unit":"celsius"}},"required":["compressorFrequency","compressorTargetFrequency","fanMotorFrequency","eevOpeningStep","eviOpeningStep","acInputVoltage","acInputCurrent","compressorPhaseCurrent","compressorIpmTemp","highPressureSaturationTemp","lowPressureSaturationTemp","outerCoilTemp","innerCoilTemp","suctionTemp","exhaustTemp","eviSuctionTemp","eviExhaustTemp","temperatureAfterRegenerator"]},{"type":"null"}]},"pressures":{"type":"object","properties":{"highSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"highPressureSaturationTempA14 (celsius)","unit":"celsius"},"lowSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"lowPressureSaturationTemp (celsius)","unit":"celsius"}},"required":["highSaturationTemp","lowSaturationTemp"]},"electrical":{"type":"object","properties":{"voltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"inputVoltage (volt)","unit":"volt"},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"inputCurrent (ampere)","unit":"ampere"},"power":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"inputPower (watt)","unit":"watt"},"totalEnergy":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"totalPowerConsumptionOfTheUnit (watt)","unit":"watt"},"phaseBPower":{"anyOf":[{"type":"number"},{"type":"null"}]},"phaseCPower":{"anyOf":[{"type":"number"},{"type":"null"}]},"phaseB":{"type":"object","properties":{"voltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseBInputVoltage (volt)","unit":"volt"},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseBInputCurrent (ampere)","unit":"ampere"}},"required":["voltage","current"]},"phaseC":{"type":"object","properties":{"voltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseCInputVoltage (volt)","unit":"volt"},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseCInputCurrent (ampere)","unit":"ampere"}},"required":["voltage","current"]}},"required":["voltage","current","power","totalEnergy","phaseBPower","phaseCPower","phaseB","phaseC"]},"refrigerant":{"type":"object","properties":{"type":{"anyOf":[{"type":"string","enum":["r410a","r32","r290"]},{"type":"null"}]},"isRecovering":{"type":"boolean"}},"required":["type","isRecovering"]},"defrost":{"type":"object","properties":{"active":{"type":"boolean"},"mode":{"anyOf":[{"type":"string","enum":["smart","timer","fast","dew_point"]},{"type":"null"}]},"cumulativeMinutes":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"defrostingCulmulativeTime (min)","unit":"min"}},"required":["active","mode","cumulativeMinutes"]},"service":{"type":"object","properties":{"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"unitTooling":{"anyOf":[{"type":"number"},{"type":"null"}]},"driverBoardManufacturer":{"anyOf":[{"type":"number"},{"type":"null"}]},"firmwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}]},"protocolVersion":{"anyOf":[{"type":"number"},{"type":"null"}]},"productType":{"anyOf":[{"type":"number"},{"type":"null"}]},"productTypeIdentificationNo":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["serialNumber","unitTooling","driverBoardManufacturer","firmwareVersion","protocolVersion","productType","productTypeIdentificationNo"]},"relays":{"type":"object","properties":{"relay1CirculationPump":{"type":"boolean"},"relay1HeatingElementForDhw":{"type":"boolean"},"relay1FanMotorHighSpeed":{"type":"boolean"},"relay1FanMotorLowSpeed":{"type":"boolean"},"relay1HeatingElementForHeatingFanCoil":{"type":"boolean"},"relay1HeatingElementForFloorHeating":{"type":"boolean"},"relay1HeatTape":{"type":"boolean"},"relay1HeatTapeOnBase":{"type":"boolean"},"relay1WaterReturnValvePump":{"type":"boolean"},"relay1SolenoidValveHeatingFanCoil":{"type":"boolean"},"relay1SolenoidValveDhwHeating":{"type":"boolean"},"relay2Compressor1":{"type":"boolean"},"relay2SolenoidValve1LiquidInjection":{"type":"boolean"},"relay2SolenoidValve1VaporInjection":{"type":"boolean"},"relay2FourWayValve1":{"type":"boolean"},"relay2ThrottleBypassValve1":{"type":"boolean"},"relay2FanMotor1":{"type":"boolean"},"relay2SecondaryCirculationPump":{"type":"boolean"},"relay2Compressor2":{"type":"boolean"},"relay2SolenoidValve2LiquidInjection":{"type":"boolean"},"relay2SolenoidValve2VaporInjection":{"type":"boolean"},"relay2FourWayValve2":{"type":"boolean"},"relay2ThrottleBypassValve2":{"type":"boolean"},"relay3HeatingElementExpansionTank":{"type":"boolean"},"relay3AuxHeaterCirculationPumpDhw":{"type":"boolean"},"relay3AuxHeaterCirculationPumpHeating":{"type":"boolean"},"relay3NaturalGasSignalOutput":{"type":"boolean"},"relay4PipeElectricHeater1":{"type":"boolean"},"relay4PipeElectricHeater2":{"type":"boolean"},"relay4AuxiliaryPump":{"type":"boolean"},"relay4Zone2WaterPump":{"type":"boolean"},"relay4Zone1WaterPump":{"type":"boolean"}},"required":["relay1CirculationPump","relay1HeatingElementForDhw","relay1FanMotorHighSpeed","relay1FanMotorLowSpeed","relay1HeatingElementForHeatingFanCoil","relay1HeatingElementForFloorHeating","relay1HeatTape","relay1HeatTapeOnBase","relay1WaterReturnValvePump","relay1SolenoidValveHeatingFanCoil","relay1SolenoidValveDhwHeating","relay2Compressor1","relay2SolenoidValve1LiquidInjection","relay2SolenoidValve1VaporInjection","relay2FourWayValve1","relay2ThrottleBypassValve1","relay2FanMotor1","relay2SecondaryCirculationPump","relay2Compressor2","relay2SolenoidValve2LiquidInjection","relay2SolenoidValve2VaporInjection","relay2FourWayValve2","relay2ThrottleBypassValve2","relay3HeatingElementExpansionTank","relay3AuxHeaterCirculationPumpDhw","relay3AuxHeaterCirculationPumpHeating","relay3NaturalGasSignalOutput","relay4PipeElectricHeater1","relay4PipeElectricHeater2","relay4AuxiliaryPump","relay4Zone2WaterPump","relay4Zone1WaterPump"]},"switches":{"type":"object","properties":{"waterFlowSwitch":{"type":"boolean"},"roomHeatingLinkSwitch":{"type":"boolean"},"hotWaterHeatingLinkSwitch":{"type":"boolean"},"linkSwitch":{"type":"boolean"},"emergencySwitch":{"type":"boolean"},"highPressureSwitch1":{"type":"boolean"},"lowPressureSwitch1":{"type":"boolean"},"mediumPressure1":{"type":"boolean"},"highPressureSwitch2":{"type":"boolean"},"lowPressureSwitch2":{"type":"boolean"},"mediumPressure2":{"type":"boolean"},"auxHeaterSignalSwitchHeating":{"type":"boolean"}},"required":["waterFlowSwitch","roomHeatingLinkSwitch","hotWaterHeatingLinkSwitch","linkSwitch","emergencySwitch","highPressureSwitch1","lowPressureSwitch1","mediumPressure1","highPressureSwitch2","lowPressureSwitch2","mediumPressure2","auxHeaterSignalSwitchHeating"]},"isDefrosting":{"type":"boolean"},"sterilization":{"type":"object","properties":{"active":{"type":"boolean"},"mode":{"type":"string","enum":["auto","off","on"]},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"sterilizationTempSetting (celsius)","unit":"celsius"}},"required":["active","mode","targetTemp"]},"returnWater":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["off","continuous","periodic","temp_difference"]},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"returnWaterTempSetting (celsius)","unit":"celsius"},"differential":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"returnWaterReturnTempDifferential (celsius)","unit":"celsius"}},"required":["enabled","mode","targetTemp","differential"]},"zones":{"type":"object","properties":{"zone1":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"zone target temperature (celsius)","unit":"celsius"},"mixingValveOpening":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["enabled","targetTemp","mixingValveOpening"]},"zone2":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"zone target temperature (celsius)","unit":"celsius"},"mixingValveOpening":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["enabled","targetTemp","mixingValveOpening"]}},"required":["zone1","zone2"]},"heatProduction":{"type":"object","properties":{"total":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"heatProductionStatistics (kilowatt_hour)","unit":"kilowatt_hour"}},"required":["total"]},"alarms":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","system1","system2","driver","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]},"sgReady":{"anyOf":[{"type":"number"},{"type":"null"}]},"isThreePhase":{"type":"boolean"},"firmwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}]},"progress":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["deviceKey","serialNumber","name","power","mode","operatingMode","temperatureControlMode","temperatures","setpoints","temperatureRanges","compressor","compressorSecondary","fan","pump","system1","system2","pressures","electrical","refrigerant","defrost","service","relays","switches","isDefrosting","sterilization","returnWater","zones","heatProduction","alarms","sgReady","isThreePhase","firmwareVersion","progress"]},"settings":{"type":"object","properties":{"power":{"type":"boolean"},"mode":{"type":"string","enum":["off","cooling","heating","dhw","floor_heating","dhw_cooling","dhw_heating","dhw_floor_heating"]},"operatingMode":{"type":"string","enum":["standard","power","silent"]},"setpoints":{"type":"object","properties":{"cooling":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetCooling (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"heating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHotWater (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4"]}}},"floorHeating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetFloorHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"bivalent":{"type":"object","properties":{"electricHeater":{"type":"number","description":"Ambient temperature from which the Electric Heater can be actived (celsius)","unit":"celsius"},"startup":{"type":"number","description":"Ambient temperature from which the Heatpump can be activated (celcius)","unit":"celsius"}}}}},"limits":{"type":"object","properties":{"cooling":{"type":"object","properties":{"min":{"type":"number","description":"cooling temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"cooling temperature upper limit (celsius)","unit":"celsius"}}},"heating":{"type":"object","properties":{"min":{"type":"number","description":"heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"heating temperature upper limit (celsius)","unit":"celsius"}}},"dhw":{"type":"object","properties":{"min":{"type":"number","description":"DHW temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"DHW temperature upper limit (celsius)","unit":"celsius"}}},"floorHeating":{"type":"object","properties":{"min":{"type":"number","description":"floor heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"floor heating temperature upper limit (celsius)","unit":"celsius"}}}},"required":["heating","dhw"]},"ambientLimits":{"type":"object","properties":{"coolingMin":{"type":"number","description":"Minimum outside temperature for cooling (celsius)","unit":"celsius"},"heatingMax":{"type":"number","description":"Maximum outside temperature for heating (celsius)","unit":"celsius"},"dhwMax":{"type":"number","description":"Maximum outside temperature for hot water (celsius)","unit":"celsius"}}},"silentMode":{"type":"boolean"},"powerMode":{"type":"boolean"},"sterilization":{"type":"object","properties":{"mode":{"type":"string","enum":["auto","off","on"]},"targetTemp":{"type":"number"}}},"returnWater":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["off","continuous","periodic","temp_difference"]},"targetTemp":{"type":"number"},"differential":{"type":"number"}}},"zones":{"type":"object","properties":{"zone1":{"type":"object","properties":{"targetTemp":{"type":"number"}}},"zone2":{"type":"object","properties":{"targetTemp":{"type":"number"}}}},"required":["zone1","zone2"]},"manualElectricHeater":{"type":"boolean"},"manualDefrost":{"type":"boolean"},"manualSterilization":{"type":"boolean"}},"required":["power","mode","operatingMode","setpoints","limits","silentMode","powerMode","sterilization","returnWater","zones"]}},"required":["status","settings"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/status":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyStatus","tags":["SolarEast / Heatpump"],"summary":"Get heatpump status","description":"Returns the heatpump's live operating data, such as operating mode, water temperatures, power consumption, and active alarms. Optional cooling/floor-heating circuits are omitted unless the token carries the matching feature claim.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Live heatpump status.","headers":{"Last-Modified":{"description":"When the heatpump data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string"},"power":{"type":"boolean"},"mode":{"type":"string","enum":["off","cooling","heating","dhw","floor_heating","dhw_cooling","dhw_heating","dhw_floor_heating"]},"operatingMode":{"type":"string","enum":["standard","power","silent"]},"temperatureControlMode":{"type":"string","enum":["inlet","outlet"],"description":"Water-temperature reference used for regulation: \"inlet\" for inlet/return water, \"outlet\" for outlet/discharge water. Read-only device-wide control configuration; defaults to \"inlet\" when telemetry is missing or invalid.","readOnly":true},"temperatures":{"type":"object","properties":{"waterInlet":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"},"waterOutlet":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterOutletTepmpT15 (celsius)","unit":"celsius"},"bufferTank":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"bufferTankTempT10 (celsius)","unit":"celsius"},"dhw":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"dhwTempT16 (celsius)","unit":"celsius"},"dhwReturn":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"dhwReturnWaterTempT13 (celsius)","unit":"celsius"},"heatingSource":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"heatingHeatSourceTempT11 (celsius)","unit":"celsius"},"dhwSource":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"dhwHeatSourceTempT12 (celsius)","unit":"celsius"},"ambient":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"externalAmbientTemp (celsius)","unit":"celsius"},"indoor":{"anyOf":[{"type":"number"},{"type":"null"}]},"coilOuter":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"outerCoilTemp (celsius)","unit":"celsius"},"coilInner":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"innerCoilTemp (celsius)","unit":"celsius"},"suction":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"suctionTempT2 (celsius)","unit":"celsius"},"exhaust":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"exhaustTempT3 (celsius)","unit":"celsius"},"totalWaterOutlet":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"totalWaterOutletTempT9 (celsius)","unit":"celsius"},"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"},"targetMin":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"},"targetMax":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterInletTempT8 (celsius)","unit":"celsius"}},"required":["waterInlet","waterOutlet","bufferTank","dhw","dhwReturn","heatingSource","dhwSource","ambient","indoor","coilOuter","coilInner","suction","exhaust","totalWaterOutlet","target","targetMin","targetMax"]},"setpoints":{"type":"object","properties":{"cooling":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetCooling (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"heating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHotWater (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4"]}}},"floorHeating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetFloorHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"bivalent":{"type":"object","properties":{"electricHeater":{"type":"number","description":"Ambient temperature from which the Electric Heater can be actived (celsius)","unit":"celsius"},"startup":{"type":"number","description":"Ambient temperature from which the Heatpump can be activated (celcius)","unit":"celsius"}}}}},"temperatureRanges":{"type":"object","properties":{"cooling":{"type":"object","properties":{"min":{"type":"number","description":"cooling temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"cooling temperature upper limit (celsius)","unit":"celsius"}}},"heating":{"type":"object","properties":{"min":{"type":"number","description":"heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"heating temperature upper limit (celsius)","unit":"celsius"}}},"dhw":{"type":"object","properties":{"min":{"type":"number","description":"DHW temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"DHW temperature upper limit (celsius)","unit":"celsius"}}},"floorHeating":{"type":"object","properties":{"min":{"type":"number","description":"floor heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"floor heating temperature upper limit (celsius)","unit":"celsius"}}}},"required":["heating","dhw"]},"compressor":{"type":"object","properties":{"running":{"type":"boolean"},"frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorRunningFrequency (hz)","unit":"hz"},"targetFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressor1TargetRunningFrequency (hz)","unit":"hz"},"ipmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorIpmTemp (celsius)","unit":"celsius"},"phaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorPhaseCurrent (ampere)","unit":"ampere"},"silentModeMaxHz":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"silentModeCompressorMaximumFrequency (hz)","unit":"hz"},"powerModeMaxHz":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"targetFrequencyUpperLimitPowerMode (hz)","unit":"hz"}},"required":["running","frequency","targetFrequency","ipmTemp","phaseCurrent","silentModeMaxHz","powerModeMaxHz"]},"compressorSecondary":{"anyOf":[{"type":"object","properties":{"running":{"type":"boolean"},"frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorFrequency (hz)","unit":"hz"},"ipmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorIpmTemp (celsius)","unit":"celsius"},"phaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorPhaseCurrent (ampere)","unit":"ampere"}},"required":["running","frequency","ipmTemp","phaseCurrent"]},{"type":"null"}]},"fan":{"type":"object","properties":{"frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"fanMotorFrequency (hz)","unit":"hz"}},"required":["frequency"]},"pump":{"type":"object","properties":{"running":{"type":"boolean"},"speedPwm":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterPumpSpeedPwm (percent)","unit":"percent"},"flowRate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"waterFlowRate (l/min)","unit":"l/min"}},"required":["running","speedPwm","flowRate"]},"system1":{"type":"object","properties":{"compressorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorRunningFrequency (hz)","unit":"hz"},"compressorTargetFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressor1TargetRunningFrequency (hz)","unit":"hz"},"fanMotorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"fanMotorFrequency (hz)","unit":"hz"},"eevOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eevOpeningStep (step)","unit":"step"},"eviOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eviOpeningStep (step)","unit":"step"},"acInputVoltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"acInputVoltage (volt)","unit":"volt"},"acInputCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"acInputCurrent (ampere)","unit":"ampere"},"compressorPhaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorPhaseCurrent (ampere)","unit":"ampere"},"compressorIpmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressorIpmTemp (celsius)","unit":"celsius"},"highPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"highPressureSaturationTempA14 (celsius)","unit":"celsius"},"lowPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"lowPressureSaturationTemp (celsius)","unit":"celsius"},"outerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"outerCoilTemp (celsius)","unit":"celsius"},"innerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"innerCoilTemp (celsius)","unit":"celsius"},"suctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"suctionTempT2 (celsius)","unit":"celsius"},"exhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"exhaustTempT3 (celsius)","unit":"celsius"},"eviSuctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eviHeatExchangerSuctionTempT5 (celsius)","unit":"celsius"},"eviExhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"eviHeatExchangerExhuastTempT6 (celsius)","unit":"celsius"},"temperatureAfterRegenerator":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system1TemperatureAfterRegenerator (celsius)","unit":"celsius"},"fluorineCircuitAntifreeze":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"fluorineCircuitAntifrizeT14 (celsius)","unit":"celsius"}},"required":["compressorFrequency","compressorTargetFrequency","fanMotorFrequency","eevOpeningStep","eviOpeningStep","acInputVoltage","acInputCurrent","compressorPhaseCurrent","compressorIpmTemp","highPressureSaturationTemp","lowPressureSaturationTemp","outerCoilTemp","innerCoilTemp","suctionTemp","exhaustTemp","eviSuctionTemp","eviExhaustTemp","temperatureAfterRegenerator","fluorineCircuitAntifreeze"]},"system2":{"anyOf":[{"type":"object","properties":{"compressorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorFrequency (hz)","unit":"hz"},"compressorTargetFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"compressor2TargetRunningFrequency (hz)","unit":"hz"},"fanMotorFrequency":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2FanMotorFrequency (hz)","unit":"hz"},"eevOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EevOpeningStep (step)","unit":"step"},"eviOpeningStep":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EviOpeningStep (step)","unit":"step"},"acInputVoltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2AcInputVoltage (volt)","unit":"volt"},"acInputCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2AcInputCurrent (ampere)","unit":"ampere"},"compressorPhaseCurrent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorPhaseCurrent (ampere)","unit":"ampere"},"compressorIpmTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2CompressorIpmTemp (celsius)","unit":"celsius"},"highPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2HighPressureSaturationTemp (celsius)","unit":"celsius"},"lowPressureSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2LowPressureSaturationTempA14 (celsius)","unit":"celsius"},"outerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2OuterCoilTempT9 (celsius)","unit":"celsius"},"innerCoilTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2InnerCoilTempT12 (celsius)","unit":"celsius"},"suctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2SuctionTempT10 (celsius)","unit":"celsius"},"exhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2ExhaustTempT11 (celsius)","unit":"celsius"},"eviSuctionTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EviHeatExchangerSuctionTempT13 (celsius)","unit":"celsius"},"eviExhaustTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2EviHeatExchangerExhuastTempT14 (celsius)","unit":"celsius"},"temperatureAfterRegenerator":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"system2TemperatureAfterRegenerator (celsius)","unit":"celsius"}},"required":["compressorFrequency","compressorTargetFrequency","fanMotorFrequency","eevOpeningStep","eviOpeningStep","acInputVoltage","acInputCurrent","compressorPhaseCurrent","compressorIpmTemp","highPressureSaturationTemp","lowPressureSaturationTemp","outerCoilTemp","innerCoilTemp","suctionTemp","exhaustTemp","eviSuctionTemp","eviExhaustTemp","temperatureAfterRegenerator"]},{"type":"null"}]},"pressures":{"type":"object","properties":{"highSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"highPressureSaturationTempA14 (celsius)","unit":"celsius"},"lowSaturationTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"lowPressureSaturationTemp (celsius)","unit":"celsius"}},"required":["highSaturationTemp","lowSaturationTemp"]},"electrical":{"type":"object","properties":{"voltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"inputVoltage (volt)","unit":"volt"},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"inputCurrent (ampere)","unit":"ampere"},"power":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"inputPower (watt)","unit":"watt"},"totalEnergy":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"totalPowerConsumptionOfTheUnit (watt)","unit":"watt"},"phaseBPower":{"anyOf":[{"type":"number"},{"type":"null"}]},"phaseCPower":{"anyOf":[{"type":"number"},{"type":"null"}]},"phaseB":{"type":"object","properties":{"voltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseBInputVoltage (volt)","unit":"volt"},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseBInputCurrent (ampere)","unit":"ampere"}},"required":["voltage","current"]},"phaseC":{"type":"object","properties":{"voltage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseCInputVoltage (volt)","unit":"volt"},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"phaseCInputCurrent (ampere)","unit":"ampere"}},"required":["voltage","current"]}},"required":["voltage","current","power","totalEnergy","phaseBPower","phaseCPower","phaseB","phaseC"]},"refrigerant":{"type":"object","properties":{"type":{"anyOf":[{"type":"string","enum":["r410a","r32","r290"]},{"type":"null"}]},"isRecovering":{"type":"boolean"}},"required":["type","isRecovering"]},"defrost":{"type":"object","properties":{"active":{"type":"boolean"},"mode":{"anyOf":[{"type":"string","enum":["smart","timer","fast","dew_point"]},{"type":"null"}]},"cumulativeMinutes":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"defrostingCulmulativeTime (min)","unit":"min"}},"required":["active","mode","cumulativeMinutes"]},"service":{"type":"object","properties":{"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"unitTooling":{"anyOf":[{"type":"number"},{"type":"null"}]},"driverBoardManufacturer":{"anyOf":[{"type":"number"},{"type":"null"}]},"firmwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}]},"protocolVersion":{"anyOf":[{"type":"number"},{"type":"null"}]},"productType":{"anyOf":[{"type":"number"},{"type":"null"}]},"productTypeIdentificationNo":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["serialNumber","unitTooling","driverBoardManufacturer","firmwareVersion","protocolVersion","productType","productTypeIdentificationNo"]},"relays":{"type":"object","properties":{"relay1CirculationPump":{"type":"boolean"},"relay1HeatingElementForDhw":{"type":"boolean"},"relay1FanMotorHighSpeed":{"type":"boolean"},"relay1FanMotorLowSpeed":{"type":"boolean"},"relay1HeatingElementForHeatingFanCoil":{"type":"boolean"},"relay1HeatingElementForFloorHeating":{"type":"boolean"},"relay1HeatTape":{"type":"boolean"},"relay1HeatTapeOnBase":{"type":"boolean"},"relay1WaterReturnValvePump":{"type":"boolean"},"relay1SolenoidValveHeatingFanCoil":{"type":"boolean"},"relay1SolenoidValveDhwHeating":{"type":"boolean"},"relay2Compressor1":{"type":"boolean"},"relay2SolenoidValve1LiquidInjection":{"type":"boolean"},"relay2SolenoidValve1VaporInjection":{"type":"boolean"},"relay2FourWayValve1":{"type":"boolean"},"relay2ThrottleBypassValve1":{"type":"boolean"},"relay2FanMotor1":{"type":"boolean"},"relay2SecondaryCirculationPump":{"type":"boolean"},"relay2Compressor2":{"type":"boolean"},"relay2SolenoidValve2LiquidInjection":{"type":"boolean"},"relay2SolenoidValve2VaporInjection":{"type":"boolean"},"relay2FourWayValve2":{"type":"boolean"},"relay2ThrottleBypassValve2":{"type":"boolean"},"relay3HeatingElementExpansionTank":{"type":"boolean"},"relay3AuxHeaterCirculationPumpDhw":{"type":"boolean"},"relay3AuxHeaterCirculationPumpHeating":{"type":"boolean"},"relay3NaturalGasSignalOutput":{"type":"boolean"},"relay4PipeElectricHeater1":{"type":"boolean"},"relay4PipeElectricHeater2":{"type":"boolean"},"relay4AuxiliaryPump":{"type":"boolean"},"relay4Zone2WaterPump":{"type":"boolean"},"relay4Zone1WaterPump":{"type":"boolean"}},"required":["relay1CirculationPump","relay1HeatingElementForDhw","relay1FanMotorHighSpeed","relay1FanMotorLowSpeed","relay1HeatingElementForHeatingFanCoil","relay1HeatingElementForFloorHeating","relay1HeatTape","relay1HeatTapeOnBase","relay1WaterReturnValvePump","relay1SolenoidValveHeatingFanCoil","relay1SolenoidValveDhwHeating","relay2Compressor1","relay2SolenoidValve1LiquidInjection","relay2SolenoidValve1VaporInjection","relay2FourWayValve1","relay2ThrottleBypassValve1","relay2FanMotor1","relay2SecondaryCirculationPump","relay2Compressor2","relay2SolenoidValve2LiquidInjection","relay2SolenoidValve2VaporInjection","relay2FourWayValve2","relay2ThrottleBypassValve2","relay3HeatingElementExpansionTank","relay3AuxHeaterCirculationPumpDhw","relay3AuxHeaterCirculationPumpHeating","relay3NaturalGasSignalOutput","relay4PipeElectricHeater1","relay4PipeElectricHeater2","relay4AuxiliaryPump","relay4Zone2WaterPump","relay4Zone1WaterPump"]},"switches":{"type":"object","properties":{"waterFlowSwitch":{"type":"boolean"},"roomHeatingLinkSwitch":{"type":"boolean"},"hotWaterHeatingLinkSwitch":{"type":"boolean"},"linkSwitch":{"type":"boolean"},"emergencySwitch":{"type":"boolean"},"highPressureSwitch1":{"type":"boolean"},"lowPressureSwitch1":{"type":"boolean"},"mediumPressure1":{"type":"boolean"},"highPressureSwitch2":{"type":"boolean"},"lowPressureSwitch2":{"type":"boolean"},"mediumPressure2":{"type":"boolean"},"auxHeaterSignalSwitchHeating":{"type":"boolean"}},"required":["waterFlowSwitch","roomHeatingLinkSwitch","hotWaterHeatingLinkSwitch","linkSwitch","emergencySwitch","highPressureSwitch1","lowPressureSwitch1","mediumPressure1","highPressureSwitch2","lowPressureSwitch2","mediumPressure2","auxHeaterSignalSwitchHeating"]},"isDefrosting":{"type":"boolean"},"sterilization":{"type":"object","properties":{"active":{"type":"boolean"},"mode":{"type":"string","enum":["auto","off","on"]},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"sterilizationTempSetting (celsius)","unit":"celsius"}},"required":["active","mode","targetTemp"]},"returnWater":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["off","continuous","periodic","temp_difference"]},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"returnWaterTempSetting (celsius)","unit":"celsius"},"differential":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"returnWaterReturnTempDifferential (celsius)","unit":"celsius"}},"required":["enabled","mode","targetTemp","differential"]},"zones":{"type":"object","properties":{"zone1":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"zone target temperature (celsius)","unit":"celsius"},"mixingValveOpening":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["enabled","targetTemp","mixingValveOpening"]},"zone2":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetTemp":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"zone target temperature (celsius)","unit":"celsius"},"mixingValveOpening":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["enabled","targetTemp","mixingValveOpening"]}},"required":["zone1","zone2"]},"heatProduction":{"type":"object","properties":{"total":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"heatProductionStatistics (kilowatt_hour)","unit":"kilowatt_hour"}},"required":["total"]},"alarms":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","system1","system2","driver","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]},"sgReady":{"anyOf":[{"type":"number"},{"type":"null"}]},"isThreePhase":{"type":"boolean"},"firmwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}]},"progress":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["deviceKey","serialNumber","name","power","mode","operatingMode","temperatureControlMode","temperatures","setpoints","temperatureRanges","compressor","compressorSecondary","fan","pump","system1","system2","pressures","electrical","refrigerant","defrost","service","relays","switches","isDefrosting","sterilization","returnWater","zones","heatProduction","alarms","sgReady","isThreePhase","firmwareVersion","progress"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/settings":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeySettings","tags":["SolarEast / Heatpump"],"summary":"Get heatpump settings","description":"Returns the user-configurable settings currently applied to the heatpump, such as target temperatures and operating modes. Optional cooling/floor-heating settings are omitted unless the token carries the matching feature claim.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Current heatpump settings.","headers":{"Last-Modified":{"description":"When the heatpump data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"power":{"type":"boolean"},"mode":{"type":"string","enum":["off","cooling","heating","dhw","floor_heating","dhw_cooling","dhw_heating","dhw_floor_heating"]},"operatingMode":{"type":"string","enum":["standard","power","silent"]},"setpoints":{"type":"object","properties":{"cooling":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetCooling (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"heating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetHotWater (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4"]}}},"floorHeating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"tempSetFloorHeating (celsius)","unit":"celsius"},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}}},"bivalent":{"type":"object","properties":{"electricHeater":{"type":"number","description":"Ambient temperature from which the Electric Heater can be actived (celsius)","unit":"celsius"},"startup":{"type":"number","description":"Ambient temperature from which the Heatpump can be activated (celcius)","unit":"celsius"}}}}},"limits":{"type":"object","properties":{"cooling":{"type":"object","properties":{"min":{"type":"number","description":"cooling temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"cooling temperature upper limit (celsius)","unit":"celsius"}}},"heating":{"type":"object","properties":{"min":{"type":"number","description":"heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"heating temperature upper limit (celsius)","unit":"celsius"}}},"dhw":{"type":"object","properties":{"min":{"type":"number","description":"DHW temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"DHW temperature upper limit (celsius)","unit":"celsius"}}},"floorHeating":{"type":"object","properties":{"min":{"type":"number","description":"floor heating temperature lower limit (celsius)","unit":"celsius"},"max":{"type":"number","description":"floor heating temperature upper limit (celsius)","unit":"celsius"}}}},"required":["heating","dhw"]},"ambientLimits":{"type":"object","properties":{"coolingMin":{"type":"number","description":"Minimum outside temperature for cooling (celsius)","unit":"celsius"},"heatingMax":{"type":"number","description":"Maximum outside temperature for heating (celsius)","unit":"celsius"},"dhwMax":{"type":"number","description":"Maximum outside temperature for hot water (celsius)","unit":"celsius"}}},"silentMode":{"type":"boolean"},"powerMode":{"type":"boolean"},"sterilization":{"type":"object","properties":{"mode":{"type":"string","enum":["auto","off","on"]},"targetTemp":{"type":"number"}}},"returnWater":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["off","continuous","periodic","temp_difference"]},"targetTemp":{"type":"number"},"differential":{"type":"number"}}},"zones":{"type":"object","properties":{"zone1":{"type":"object","properties":{"targetTemp":{"type":"number"}}},"zone2":{"type":"object","properties":{"targetTemp":{"type":"number"}}}},"required":["zone1","zone2"]},"manualElectricHeater":{"type":"boolean"},"manualDefrost":{"type":"boolean"},"manualSterilization":{"type":"boolean"}},"required":["power","mode","operatingMode","setpoints","limits","silentMode","powerMode","sterilization","returnWater","zones"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]},"patch":{"operationId":"patchV1IntegrationsSolareastHeatpumpByDeviceKeySettings","tags":["SolarEast / Heatpump"],"summary":"Update heatpump settings","description":"Updates one or more user-configurable heatpump settings. Only the fields supplied in the request body are changed; the rest are left untouched. Requires write access on the device. Optional cooling/floor-heating settings are rejected (400) unless the token carries the matching feature claim.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Settings accepted and dispatched to the heatpump.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"power":{"type":"boolean"},"mode":{"type":"string","enum":["off","cooling","heating","dhw","floor_heating","dhw_cooling","dhw_heating","dhw_floor_heating"]},"operatingMode":{"type":"string","enum":["standard","power","silent"]},"setpoints":{"type":"object","properties":{"cooling":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}]},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}},"additionalProperties":false},"heating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}]},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}},"additionalProperties":false},"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}]},"curve":{"type":"string","enum":["0","1","2","3","4"]}},"additionalProperties":false},"floorHeating":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}]},"curve":{"type":"string","enum":["0","1","2","3","4","5","6","7","8","11","12","13","14","15","16","17","18"]}},"additionalProperties":false},"bivalent":{"type":"object","properties":{"electricHeater":{"type":"number"},"startup":{"type":"number"}},"additionalProperties":false}},"additionalProperties":false},"limits":{"type":"object","properties":{"cooling":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"additionalProperties":false},"heating":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"additionalProperties":false},"dhw":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"additionalProperties":false},"floorHeating":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"additionalProperties":false}},"additionalProperties":false},"ambientLimits":{"type":"object","properties":{"coolingMin":{"type":"integer","minimum":10,"maximum":60},"heatingMax":{"type":"integer","minimum":10,"maximum":60},"dhwMax":{"type":"integer","minimum":10,"maximum":60}},"additionalProperties":false},"silentMode":{"type":"boolean"},"powerMode":{"type":"boolean"},"sterilization":{"type":"object","properties":{"mode":{"type":"string","enum":["auto","off","on"]},"targetTemp":{"type":"number"}},"additionalProperties":false},"returnWater":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["off","continuous","periodic","temp_difference"]},"targetTemp":{"type":"number"},"differential":{"type":"number"}},"additionalProperties":false},"zones":{"type":"object","properties":{"zone1":{"type":"object","properties":{"targetTemp":{"type":"number"}},"additionalProperties":false},"zone2":{"type":"object","properties":{"targetTemp":{"type":"number"}},"additionalProperties":false}},"additionalProperties":false},"manualElectricHeater":{"type":"boolean"},"manualDefrost":{"type":"boolean"},"manualSterilization":{"type":"boolean"}},"additionalProperties":false}}}}}},"/v1/integrations/solareast/heatpump/{deviceKey}/alarms":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyAlarms","tags":["SolarEast / Heatpump"],"summary":"Get heatpump alarms","description":"Returns the alarms currently reported by the heatpump, each with a stable code, human-readable description, severity, and affected subsystem.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Active heatpump alarms.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","system1","system2","driver","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/find":{"post":{"operationId":"postV1IntegrationsSolareastHeatpumpFind","tags":["SolarEast / Heatpump"],"summary":"Find heatpump by MAC or serial number","description":"Resolves a device key by querying the SolarEast API with either the device MAC address or serial number, and reports the device kind (\"heatpump\" or \"boiler\") the device reports.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Device key and kind for the matching device.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"deviceType":{"type":"string"}}}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mac":{"type":"string"},"serialNumber":{"type":"string"}}}}}}}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/ws":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2Ws","tags":["SolarEast / S2"],"summary":"Open S2 WebSocket","description":"Upgrades the HTTP connection to a WebSocket that streams the device's S2 (energy-flexibility) messages as JSON. Use this to receive real-time telemetry and, when authorized, send control instructions. Authenticate with `Authorization: Bearer <jwt>` only: the browser-session cookie is not accepted, because a WebSocket handshake bypasses CORS and no other protection stops a cross-site page from opening it with the victim's cookie.","security":[{"bearerAuth":[]}],"responses":{"101":{"description":"WebSocket upgrade successful."},"401":{"description":"Authentication required."},"403":{"description":"Access denied for this device."}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/resource-manager-details":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2ResourceManagerDetails","tags":["SolarEast / S2"],"summary":"Get device S2 profile","description":"Returns the device's S2 resource-manager profile: identity, supported control types, and advertised capabilities.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"S2 resource-manager profile.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"manufacturer":{"type":"string","const":"SolarEast"},"model":{"type":"string"},"serial_number":{"type":"string"},"imei":{"type":"string"},"firmware_version":{"type":"string"},"roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["ENERGY_CONSUMER","ENERGY_PRODUCER"]},"commodity":{"type":"string","enum":["ELECTRICITY"]}},"required":["role","commodity"]}},"available_control_types":{"type":"array","items":{"type":"string","enum":["FILL_RATE_BASED_CONTROL","POWER_ENVELOPE_BASED_CONTROL","DIRECT_DEMAND_BASED_CONTROL"]}},"provides_power_measurement_types":{"type":"array","items":{"type":"string"}}},"required":["resource_id","name","manufacturer","model","serial_number","imei","firmware_version","roles","available_control_types"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/power-measurement":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2PowerMeasurement","tags":["SolarEast / S2"],"summary":"Get latest power measurement","description":"Returns the most recent electrical power measurement reported by the device over S2.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Latest power measurement.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"measurement_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"values":{"type":"array","items":{"type":"object","properties":{"commodity_quantity":{"type":"string","enum":["ELECTRIC.POWER.L1","ELECTRIC.POWER.L2","ELECTRIC.POWER.L3"]},"value":{"type":"number"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["commodity_quantity","value","timestamp"]}},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["measurement_id","resource_id","values","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/frbc/system-description":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2FrbcSystemDescription","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC system description","description":"Returns the device's Fill-Rate Based Control model: its actuators, operation modes, storage elements, and transitions. Needed before sending FRBC instructions. The model is installation-agnostic and always advertises both a DHW and a buffer storage; the `s2.frbc.*` capabilities reported by `/capabilities` are advisory, and this route responds regardless of the device's installation classification.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC system description.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"system_description_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"actuators":{"type":"array","items":{"type":"object","properties":{"actuator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"operation_modes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"elements":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}}}},"power_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"fill_rate_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"switch_over_delay":{"type":"object","properties":{"duration":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string","enum":["ms","s","min","h","d"]}},"required":["value","unit"]},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["duration"]}},"required":["id","name","elements"]}}},"required":["actuator_id","operation_modes"]}},"storages":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"type":{"type":"string","enum":["DHW","BUFFER_TANK","BUFFER_TANK_CONFIGURATION"]},"capacity":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"step":{"type":"number"}},"required":["min","max"]},"fill_level_range":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"step":{"type":"number"}},"required":["min","max"]},"present_fill_level":{"type":"number"},"temperature_range":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"step":{"type":"number"}},"required":["min","max"]},"present_temperature":{"type":"number"}},"required":["storage_id","type"]}},"transitions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"from_mode_id":{"type":"string"},"to_mode_id":{"type":"string"},"delay":{"type":"object","properties":{"duration":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string","enum":["ms","s","min","h","d"]}},"required":["value","unit"]},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["duration"]}},"required":["id","from_mode_id","to_mode_id"]}}},"required":["system_description_id","resource_id","actuators","storages"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/frbc/actuator-status":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2FrbcActuatorStatus","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC actuator status","description":"Returns the current operation mode and fill-rate factor reported by each FRBC actuator on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC actuator status.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"actuator_status_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"actuator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"active_operation_mode_id":{"type":"string"},"active_operation_mode_factor":{"type":"number"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["actuator_status_id","resource_id","actuator_id","active_operation_mode_id","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/frbc/storage-status/{storageId}":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2FrbcStorageStatusByStorageId","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC storage status","description":"Returns the current fill level and related state for the given FRBC storage element (e.g. a buffer tank) on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC storage status.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"storage_status_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"present_fill_level":{"type":"number"},"present_temperature":{"type":"number"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["storage_status_id","resource_id","storage_id","present_fill_level","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true},{"in":"path","name":"storageId","schema":{"type":"string","enum":["dhw","buffer"]},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/frbc/leakage-behaviour":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2FrbcLeakageBehaviour","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC leakage behaviour","description":"Returns how the FRBC storage naturally loses energy over time (standby losses), used by schedulers to plan charging cycles.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC leakage behaviour.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"leakage_behaviour_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"elements":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"leakage_rate":{"type":"number"}},"required":["storage_id","leakage_rate"]}},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["leakage_behaviour_id","resource_id","elements","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/frbc/instruction":{"post":{"operationId":"postV1IntegrationsSolareastHeatpumpByDeviceKeyS2FrbcInstruction","tags":["SolarEast / S2 FRBC"],"summary":"Send FRBC instruction","description":"Sends a Fill-Rate Based Control instruction telling the device which operation mode to run at which fill-rate factor and from when. Requires write access on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Instruction accepted.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"422":{"description":"Instruction requests an unsupported actuator, storage, control, or native boiler strategy","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"instruction_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"actuator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"requested_operation_mode_id":{"type":"string"},"operation_mode_factor":{"type":"number"},"elements":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"fill_rate":{"type":"number"},"absolute_fill_level":{"type":"number"},"temperature_setpoint":{"type":"number"}},"required":["storage_id"]}},"abnormal_condition":{"type":"boolean"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["instruction_id","resource_id","actuator_id","requested_operation_mode_id","elements"]}}}}}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/pebc/power-constraints":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyS2PebcPowerConstraints","tags":["SolarEast / S2 PEBC"],"summary":"Get PEBC power constraints","description":"Returns the current Power Envelope Based Control constraints the device is willing to operate within (allowed power ranges over time).","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"PEBC power constraints.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"power_constraints_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"power_ranges":{"type":"array","items":{"type":"object","properties":{"power_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"start_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["power_range","start_time","end_time"]}},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["power_constraints_id","resource_id","power_ranges","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/s2/pebc/instruction":{"post":{"operationId":"postV1IntegrationsSolareastHeatpumpByDeviceKeyS2PebcInstruction","tags":["SolarEast / S2 PEBC"],"summary":"Send PEBC instruction","description":"Sends a Power Envelope Based Control instruction setting the power envelope the device must follow. Requires write access on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Instruction accepted.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"422":{"description":"Boiler electrical calibration and power-envelope control are unverified","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"instruction_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"requested_power_ranges":{"type":"array","items":{"type":"object","properties":{"power_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"start_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["power_range","start_time","end_time"]}},"abnormal_condition":{"type":"boolean"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["instruction_id","resource_id","requested_power_ranges"]}}}}}},"/v1/integrations/solareast/heatpump/{deviceKey}/alarms/report":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyAlarmsReport","tags":["SolarEast / S2"],"summary":"Get S2 alarm report","description":"Returns the alarms the device currently reports over S2, each with a stable code, human-readable description, severity, and affected subsystem.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Active device alarms.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","system1","system2","driver","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/heatpump/{deviceKey}/matter":{"get":{"operationId":"getV1IntegrationsSolareastHeatpumpByDeviceKeyMatter","tags":["SolarEast / Matter"],"summary":"Get Matter snapshot","description":"heatpump as Matter 1.4 endpoints and clusters, with every value already in Matter units, for a local Matter bridge to poll. Poll at `pollIntervalMs` with `If-None-Match`; an unchanged snapshot returns 304. See `docs/matter-bridge.md`.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Matter snapshot. `reachable: false` when the device is offline and cached status is served.","headers":{"Last-Modified":{"description":"When the heatpump data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"uniqueId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID derived from the device key; use as Matter UniqueID"},"reachable":{"type":"boolean","description":"False when the device is confirmed offline and cached data is served"},"stale":{"type":"boolean","description":"True when the data is not live (stale-cache fallback or device offline)"},"fetchedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the underlying status was fetched from SolarEast"},"pollIntervalMs":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recommended poll interval (the per-device downstream window)"},"configurationId":{"type":"string","description":"Installation variant that decides the endpoint composition"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]},"description":"Device types of the composed parent (Heat Pump)"},"basicInformation":{"type":"object","properties":{"nodeLabel":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"softwareVersionString":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["nodeLabel","serialNumber","softwareVersionString"]},"endpoints":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"key":{"type":"string","const":"thermostat"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"},"outdoorTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedCoolingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState","outdoorTemperature"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"waterHeater"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState"]}},"required":["id","featureMap","attributes"]},"waterHeaterManagement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"heaterTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"heatDemand":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"boostState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"BoostStateEnum: 0 Inactive"}},"required":["heaterTypes","heatDemand","boostState"]}},"required":["id","featureMap","attributes"]},"waterHeaterMode":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"supportedModes":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"mode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"modeTags":{"type":"array","items":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["value"]}}},"required":["label","mode","modeTags"]}},"currentMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["supportedModes","currentMode"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat","waterHeaterManagement","waterHeaterMode"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"electricalSensor"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"powerTopology":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"availableEndpointKeys":{"type":"array","items":{"type":"string"},"description":"Not a Matter attribute: the endpoint `key`s this sensor measures. The bridge maps them to the numeric endpoint IDs it assigned and publishes the result as `availableEndpoints`."}},"required":["availableEndpointKeys"]}},"required":["id","featureMap","attributes"]},"electricalPowerMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"powerMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"PowerModeEnum: 2 AC"},"numberOfMeasurementTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracy":{"type":"array","items":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]}},"voltage":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mV, null when unknown"},"activeCurrent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mA, null when unknown"},"activePower":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mW, null when unknown"}},"required":["powerMode","numberOfMeasurementTypes","accuracy","voltage","activeCurrent","activePower"]}},"required":["id","featureMap","attributes"]},"electricalEnergyMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"accuracy":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]},"cumulativeEnergyImported":{"anyOf":[{"type":"object","properties":{"energy":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"mWh"}},"required":["energy"]},{"type":"null"}],"description":"EnergyMeasurementStruct, null when unknown"}},"required":["accuracy","cumulativeEnergyImported"]}},"required":["id","featureMap","attributes"]}},"required":["powerTopology","electricalPowerMeasurement","electricalEnergyMeasurement"]}},"required":["key","deviceTypes","clusters"]}]}}},"required":["deviceKey","uniqueId","reachable","stale","fetchedAt","pollIntervalMs","configurationId","deviceTypes","basicInformation","endpoints"]}},"required":["data"]}}}},"304":{"description":"Not modified — the snapshot matches `If-None-Match`."},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"429":{"description":"Too many requests — upstream rate limit exhausted and no cached status to serve (Matter: BUSY)"},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]},"patch":{"operationId":"patchV1IntegrationsSolareastHeatpumpByDeviceKeyMatter","tags":["SolarEast / Matter"],"summary":"Apply Matter write","description":"Applies Matter attribute writes (`systemMode` and the occupied heating/cooling setpoints, in Matter units) to the device and returns the updated Matter snapshot. Requires write access on the device. See `docs/matter-bridge.md` for the error → Matter status mapping.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Write applied (or already in effect); the updated Matter snapshot.","headers":{"Last-Modified":{"description":"When the heatpump data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"uniqueId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID derived from the device key; use as Matter UniqueID"},"reachable":{"type":"boolean","description":"False when the device is confirmed offline and cached data is served"},"stale":{"type":"boolean","description":"True when the data is not live (stale-cache fallback or device offline)"},"fetchedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the underlying status was fetched from SolarEast"},"pollIntervalMs":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recommended poll interval (the per-device downstream window)"},"configurationId":{"type":"string","description":"Installation variant that decides the endpoint composition"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]},"description":"Device types of the composed parent (Heat Pump)"},"basicInformation":{"type":"object","properties":{"nodeLabel":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"softwareVersionString":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["nodeLabel","serialNumber","softwareVersionString"]},"endpoints":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"key":{"type":"string","const":"thermostat"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"},"outdoorTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedCoolingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState","outdoorTemperature"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"waterHeater"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState"]}},"required":["id","featureMap","attributes"]},"waterHeaterManagement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"heaterTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"heatDemand":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"boostState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"BoostStateEnum: 0 Inactive"}},"required":["heaterTypes","heatDemand","boostState"]}},"required":["id","featureMap","attributes"]},"waterHeaterMode":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"supportedModes":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"mode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"modeTags":{"type":"array","items":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["value"]}}},"required":["label","mode","modeTags"]}},"currentMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["supportedModes","currentMode"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat","waterHeaterManagement","waterHeaterMode"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"electricalSensor"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"powerTopology":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"availableEndpointKeys":{"type":"array","items":{"type":"string"},"description":"Not a Matter attribute: the endpoint `key`s this sensor measures. The bridge maps them to the numeric endpoint IDs it assigned and publishes the result as `availableEndpoints`."}},"required":["availableEndpointKeys"]}},"required":["id","featureMap","attributes"]},"electricalPowerMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"powerMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"PowerModeEnum: 2 AC"},"numberOfMeasurementTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracy":{"type":"array","items":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]}},"voltage":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mV, null when unknown"},"activeCurrent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mA, null when unknown"},"activePower":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mW, null when unknown"}},"required":["powerMode","numberOfMeasurementTypes","accuracy","voltage","activeCurrent","activePower"]}},"required":["id","featureMap","attributes"]},"electricalEnergyMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"accuracy":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]},"cumulativeEnergyImported":{"anyOf":[{"type":"object","properties":{"energy":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"mWh"}},"required":["energy"]},{"type":"null"}],"description":"EnergyMeasurementStruct, null when unknown"}},"required":["accuracy","cumulativeEnergyImported"]}},"required":["id","featureMap","attributes"]}},"required":["powerTopology","electricalPowerMeasurement","electricalEnergyMeasurement"]}},"required":["key","deviceTypes","clusters"]}]}}},"required":["deviceKey","uniqueId","reachable","stale","fetchedAt","pollIntervalMs","configurationId","deviceTypes","basicInformation","endpoints"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"A weather curve controls the targeted setpoint (Matter: INVALID_IN_STATE)","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"422":{"description":"Setpoint out of range, unsupported systemMode, or endpoint absent for this configuration (Matter: CONSTRAINT_ERROR)","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"429":{"description":"Too many requests — upstream rate limit exhausted and no cached status to serve (Matter: BUSY)"},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"systemMode":{"type":"integer","minimum":0,"maximum":255,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"occupiedHeatingSetpoint":{"type":"integer","minimum":-27315,"maximum":32767,"description":"Matter temperature: int16 centi-°C"},"occupiedCoolingSetpoint":{"type":"integer","minimum":-27315,"maximum":32767,"description":"Matter temperature: int16 centi-°C"}},"additionalProperties":false},"waterHeater":{"type":"object","properties":{"systemMode":{"type":"integer","minimum":0,"maximum":255,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"occupiedHeatingSetpoint":{"type":"integer","minimum":-27315,"maximum":32767,"description":"Matter temperature: int16 centi-°C"}},"additionalProperties":false}},"additionalProperties":false}}}}}},"/v1/integrations/solareast/boiler/{deviceKey}":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKey","tags":["SolarEast / Boiler"],"summary":"Get boiler status and settings","description":"Returns the boiler's live operating status and current user settings combined in a single response.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Boiler status and settings.","headers":{"Last-Modified":{"description":"When the boiler data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"object","properties":{"deviceKey":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string"},"power":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"mode":{"anyOf":[{"type":"string","enum":["balanced","quick","silent"],"description":"OEM DHW tank strategy: balanced (native 2, hot water), quick (native 11, double energy 1 heating) or silent (native 12, electric heating)"},{"type":"null"}],"description":"OEM DHW strategy; null when the native code is unrecognised"},"temperatures":{"type":"object","properties":{"dhw":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW tank temperature (celsius)","unit":"celsius"},"ambient":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Ambient temperature (celsius)","unit":"celsius"},"coilOuter":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Coil temperature (celsius)","unit":"celsius"},"suction":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Suction temperature (celsius)","unit":"celsius"},"exhaust":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Exhaust temperature (celsius)","unit":"celsius"}},"required":["dhw","ambient","coilOuter","suction","exhaust"]},"setpoints":{"type":"object","properties":{"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Configured DHW tank target (celsius)","unit":"celsius"}},"required":["target"]}},"required":["dhw"]},"temperatureRanges":{"type":"object","properties":{"dhw":{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW lower bound (celsius)","unit":"celsius"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW upper bound (celsius)","unit":"celsius"}},"required":["min","max"]}},"required":["dhw"],"description":"DHW target/hysteresis band, not configured setpoint limits"},"compressor":{"type":"object","properties":{"running":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["running"]},"eev":{"type":"object","properties":{"openingSteps":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"EEV opening in native steps"}},"required":["openingSteps"]},"fourWayValve":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"fan":{"type":"object","properties":{"highSpeedRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"lowSpeedRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["highSpeedRunning","lowSpeedRunning"]},"heatingElement":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"electrical":{"type":"object","properties":{"power":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Native power-module reading (watts, 0x005B) while the module is connected, otherwise the mode-derived estimate: 630 balanced, 2000 silent, 3000 quick while the compressor runs or the heating element is active; 0 when off/idle; null when no reading and the strategy or running state is unknown","unit":"watt"}},"required":["power"],"description":"Native power-module reading when connected, otherwise the mode-derived estimate"},"defrost":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"service":{"type":"object","properties":{"unitTooling":{"anyOf":[{"type":"number"},{"type":"null"}]},"programVersion":{"anyOf":[{"type":"number"},{"type":"null"}]},"protocolVersion":{"anyOf":[{"type":"number"},{"type":"null"}]},"productType":{"anyOf":[{"type":"number"},{"type":"null"}]},"productTypeIdentificationNo":{"anyOf":[{"type":"number"},{"type":"null"}]},"modeControlBits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Raw 0x00F8 metadata; its relationship to supported modes is unverified"}},"required":["unitTooling","programVersion","protocolVersion","productType","productTypeIdentificationNo","modeControlBits"]},"faultCode":{"anyOf":[{"type":"number"},{"type":"null"}]},"subfaultCode":{"anyOf":[{"type":"number"},{"type":"null"}]},"sterilization":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"meter":{"type":"object","properties":{"connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Optional metering module connection (0x0058)"},"power":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Native instantaneous power (watts) from the optional power module (0x005B); null unless the module is connected"},"rawConsumption":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Unscaled native 0x005C diagnostic, not SI energy; unavailable when the module is disconnected"}},"required":["connected","power","rawConsumption"]},"alarms":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]},"systemRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"systemStandby":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"failureWarning":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"firmwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["deviceKey","serialNumber","name","power","mode","temperatures","setpoints","temperatureRanges","compressor","eev","fourWayValve","fan","heatingElement","electrical","defrost","service","faultCode","subfaultCode","sterilization","alarms","systemRunning","systemStandby","failureWarning","firmwareVersion"]},"settings":{"type":"object","properties":{"power":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"mode":{"anyOf":[{"type":"string","enum":["balanced","quick","silent"],"description":"OEM DHW tank strategy: balanced (native 2, hot water), quick (native 11, double energy 1 heating) or silent (native 12, electric heating)"},{"type":"null"}],"description":"OEM DHW strategy; null when the native code is unrecognised"},"setpoints":{"type":"object","properties":{"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Configured DHW tank target (celsius)","unit":"celsius"}},"required":["target"]}},"required":["dhw"]},"limits":{"type":"object","properties":{"dhw":{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW lower bound (celsius)","unit":"celsius"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW upper bound (celsius)","unit":"celsius"}},"required":["min","max"]}},"required":["dhw"],"description":"Configured DHW bounds from 0x00FC/0x00FD"},"differential":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Water-temperature hysteresis (0x0103) (celsius)","unit":"celsius"},"manualElectricHeater":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["power","mode","setpoints","limits","differential","manualElectricHeater"]}},"required":["status","settings"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/status":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyStatus","tags":["SolarEast / Boiler"],"summary":"Get boiler status","description":"Returns native DHW tank telemetry, OEM strategy diagnostics, component activity, and active alarms. Optional meter diagnostics are unscaled, not SI measurements.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Live boiler status.","headers":{"Last-Modified":{"description":"When the boiler data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string"},"power":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"mode":{"anyOf":[{"type":"string","enum":["balanced","quick","silent"],"description":"OEM DHW tank strategy: balanced (native 2, hot water), quick (native 11, double energy 1 heating) or silent (native 12, electric heating)"},{"type":"null"}],"description":"OEM DHW strategy; null when the native code is unrecognised"},"temperatures":{"type":"object","properties":{"dhw":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW tank temperature (celsius)","unit":"celsius"},"ambient":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Ambient temperature (celsius)","unit":"celsius"},"coilOuter":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Coil temperature (celsius)","unit":"celsius"},"suction":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Suction temperature (celsius)","unit":"celsius"},"exhaust":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Exhaust temperature (celsius)","unit":"celsius"}},"required":["dhw","ambient","coilOuter","suction","exhaust"]},"setpoints":{"type":"object","properties":{"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Configured DHW tank target (celsius)","unit":"celsius"}},"required":["target"]}},"required":["dhw"]},"temperatureRanges":{"type":"object","properties":{"dhw":{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW lower bound (celsius)","unit":"celsius"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW upper bound (celsius)","unit":"celsius"}},"required":["min","max"]}},"required":["dhw"],"description":"DHW target/hysteresis band, not configured setpoint limits"},"compressor":{"type":"object","properties":{"running":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["running"]},"eev":{"type":"object","properties":{"openingSteps":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"EEV opening in native steps"}},"required":["openingSteps"]},"fourWayValve":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"fan":{"type":"object","properties":{"highSpeedRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"lowSpeedRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["highSpeedRunning","lowSpeedRunning"]},"heatingElement":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"electrical":{"type":"object","properties":{"power":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Native power-module reading (watts, 0x005B) while the module is connected, otherwise the mode-derived estimate: 630 balanced, 2000 silent, 3000 quick while the compressor runs or the heating element is active; 0 when off/idle; null when no reading and the strategy or running state is unknown","unit":"watt"}},"required":["power"],"description":"Native power-module reading when connected, otherwise the mode-derived estimate"},"defrost":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"service":{"type":"object","properties":{"unitTooling":{"anyOf":[{"type":"number"},{"type":"null"}]},"programVersion":{"anyOf":[{"type":"number"},{"type":"null"}]},"protocolVersion":{"anyOf":[{"type":"number"},{"type":"null"}]},"productType":{"anyOf":[{"type":"number"},{"type":"null"}]},"productTypeIdentificationNo":{"anyOf":[{"type":"number"},{"type":"null"}]},"modeControlBits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Raw 0x00F8 metadata; its relationship to supported modes is unverified"}},"required":["unitTooling","programVersion","protocolVersion","productType","productTypeIdentificationNo","modeControlBits"]},"faultCode":{"anyOf":[{"type":"number"},{"type":"null"}]},"subfaultCode":{"anyOf":[{"type":"number"},{"type":"null"}]},"sterilization":{"type":"object","properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["active"]},"meter":{"type":"object","properties":{"connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Optional metering module connection (0x0058)"},"power":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Native instantaneous power (watts) from the optional power module (0x005B); null unless the module is connected"},"rawConsumption":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Unscaled native 0x005C diagnostic, not SI energy; unavailable when the module is disconnected"}},"required":["connected","power","rawConsumption"]},"alarms":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]},"systemRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"systemStandby":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"failureWarning":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"firmwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["deviceKey","serialNumber","name","power","mode","temperatures","setpoints","temperatureRanges","compressor","eev","fourWayValve","fan","heatingElement","electrical","defrost","service","faultCode","subfaultCode","sterilization","alarms","systemRunning","systemStandby","failureWarning","firmwareVersion"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/settings":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeySettings","tags":["SolarEast / Boiler"],"summary":"Get boiler settings","description":"Returns the user-configurable settings currently applied to the boiler, such as target temperatures and operating modes. Optional cooling/floor-heating settings are omitted unless the token carries the matching feature claim.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Current boiler settings.","headers":{"Last-Modified":{"description":"When the boiler data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"power":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"mode":{"anyOf":[{"type":"string","enum":["balanced","quick","silent"],"description":"OEM DHW tank strategy: balanced (native 2, hot water), quick (native 11, double energy 1 heating) or silent (native 12, electric heating)"},{"type":"null"}],"description":"OEM DHW strategy; null when the native code is unrecognised"},"setpoints":{"type":"object","properties":{"dhw":{"type":"object","properties":{"target":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Configured DHW tank target (celsius)","unit":"celsius"}},"required":["target"]}},"required":["dhw"]},"limits":{"type":"object","properties":{"dhw":{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW lower bound (celsius)","unit":"celsius"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DHW upper bound (celsius)","unit":"celsius"}},"required":["min","max"]}},"required":["dhw"],"description":"Configured DHW bounds from 0x00FC/0x00FD"},"differential":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Water-temperature hysteresis (0x0103) (celsius)","unit":"celsius"},"manualElectricHeater":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["power","mode","setpoints","limits","differential","manualElectricHeater"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]},"patch":{"operationId":"patchV1IntegrationsSolareastBoilerByDeviceKeySettings","tags":["SolarEast / Boiler"],"summary":"Update boiler settings","description":"Updates one or more user-configurable boiler settings. Only the fields supplied in the request body are changed; the rest are left untouched. Requires write access on the device. Optional cooling/floor-heating settings are rejected (400) unless the token carries the matching feature claim.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Settings accepted and dispatched to the boiler.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"power":{"type":"boolean"},"mode":{"type":"string","enum":["balanced","quick","silent"],"description":"OEM DHW tank strategy: balanced (native 2, hot water), quick (native 11, double energy 1 heating) or silent (native 12, electric heating)"},"setpoints":{"type":"object","properties":{"dhw":{"type":"object","properties":{"target":{"type":"integer","minimum":-32768,"maximum":32767}},"additionalProperties":false}},"additionalProperties":false},"differential":{"type":"integer","minimum":-32768,"maximum":32767},"manualElectricHeater":{"type":"boolean"},"manualSterilization":{"type":"boolean"}},"additionalProperties":false}}}}}},"/v1/integrations/solareast/boiler/{deviceKey}/alarms":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyAlarms","tags":["SolarEast / Boiler"],"summary":"Get boiler alarms","description":"Returns the alarms currently reported by the boiler, each with a stable code, human-readable description, severity, and affected subsystem.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Active boiler alarms.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/find":{"post":{"operationId":"postV1IntegrationsSolareastBoilerFind","tags":["SolarEast / Boiler"],"summary":"Find boiler by MAC or serial number","description":"Resolves a device key by querying the SolarEast API with either the device MAC address or serial number, and reports the device kind (\"heatpump\" or \"boiler\") the device reports.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Device key and kind for the matching device.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"deviceType":{"type":"string"}}}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mac":{"type":"string"},"serialNumber":{"type":"string"}}}}}}}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/ws":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2Ws","tags":["SolarEast / S2"],"summary":"Open S2 WebSocket","description":"Upgrades the HTTP connection to a WebSocket that streams the device's S2 (energy-flexibility) messages as JSON. Use this to receive real-time telemetry and, when authorized, send control instructions. Authenticate with `Authorization: Bearer <jwt>` only: the browser-session cookie is not accepted, because a WebSocket handshake bypasses CORS and no other protection stops a cross-site page from opening it with the victim's cookie.","security":[{"bearerAuth":[]}],"responses":{"101":{"description":"WebSocket upgrade successful."},"401":{"description":"Authentication required."},"403":{"description":"Access denied for this device."}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/resource-manager-details":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2ResourceManagerDetails","tags":["SolarEast / S2"],"summary":"Get device S2 profile","description":"Returns the device's S2 resource-manager profile: identity, supported control types, and advertised capabilities.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"S2 resource-manager profile.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"manufacturer":{"type":"string","const":"SolarEast"},"model":{"type":"string"},"serial_number":{"type":"string"},"imei":{"type":"string"},"firmware_version":{"type":"string"},"roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["ENERGY_CONSUMER","ENERGY_PRODUCER"]},"commodity":{"type":"string","enum":["ELECTRICITY"]}},"required":["role","commodity"]}},"available_control_types":{"type":"array","items":{"type":"string","enum":["FILL_RATE_BASED_CONTROL","POWER_ENVELOPE_BASED_CONTROL","DIRECT_DEMAND_BASED_CONTROL"]}},"provides_power_measurement_types":{"type":"array","items":{"type":"string"}}},"required":["resource_id","name","manufacturer","model","serial_number","imei","firmware_version","roles","available_control_types"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/power-measurement":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2PowerMeasurement","tags":["SolarEast / S2"],"summary":"Get latest power measurement","description":"Returns the most recent electrical power measurement reported by the device over S2.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Latest power measurement.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"measurement_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"values":{"type":"array","items":{"type":"object","properties":{"commodity_quantity":{"type":"string","enum":["ELECTRIC.POWER.L1","ELECTRIC.POWER.L2","ELECTRIC.POWER.L3"]},"value":{"type":"number"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["commodity_quantity","value","timestamp"]}},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["measurement_id","resource_id","values","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/frbc/system-description":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2FrbcSystemDescription","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC system description","description":"Returns the tank-only Fill-Rate Based Control model: DHW storage and off/dhw_heat operations. Electrical power and fill-rate factors are unverified; no buffer or space control is advertised.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC system description.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"system_description_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"actuators":{"type":"array","items":{"type":"object","properties":{"actuator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"operation_modes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"elements":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}}}},"power_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"fill_rate_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"switch_over_delay":{"type":"object","properties":{"duration":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string","enum":["ms","s","min","h","d"]}},"required":["value","unit"]},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["duration"]}},"required":["id","name","elements"]}}},"required":["actuator_id","operation_modes"]}},"storages":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"type":{"type":"string","enum":["DHW","BUFFER_TANK","BUFFER_TANK_CONFIGURATION"]},"capacity":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"step":{"type":"number"}},"required":["min","max"]},"fill_level_range":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"step":{"type":"number"}},"required":["min","max"]},"present_fill_level":{"type":"number"},"temperature_range":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"step":{"type":"number"}},"required":["min","max"]},"present_temperature":{"type":"number"}},"required":["storage_id","type"]}},"transitions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"from_mode_id":{"type":"string"},"to_mode_id":{"type":"string"},"delay":{"type":"object","properties":{"duration":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string","enum":["ms","s","min","h","d"]}},"required":["value","unit"]},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["duration"]}},"required":["id","from_mode_id","to_mode_id"]}}},"required":["system_description_id","resource_id","actuators","storages"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/frbc/actuator-status":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2FrbcActuatorStatus","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC actuator status","description":"Returns the current operation mode and fill-rate factor reported by each FRBC actuator on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC actuator status.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"actuator_status_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"actuator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"active_operation_mode_id":{"type":"string"},"active_operation_mode_factor":{"type":"number"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["actuator_status_id","resource_id","actuator_id","active_operation_mode_id","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/frbc/storage-status/{storageId}":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2FrbcStorageStatusByStorageId","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC storage status","description":"Returns the current fill level and related state for the given FRBC storage element (e.g. a buffer tank) on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC storage status.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"storage_status_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"present_fill_level":{"type":"number"},"present_temperature":{"type":"number"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["storage_status_id","resource_id","storage_id","present_fill_level","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true},{"in":"path","name":"storageId","schema":{"type":"string","enum":["dhw","buffer"]},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/frbc/leakage-behaviour":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2FrbcLeakageBehaviour","tags":["SolarEast / S2 FRBC"],"summary":"Get FRBC leakage behaviour","description":"Returns how the FRBC storage naturally loses energy over time (standby losses), used by schedulers to plan charging cycles.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"FRBC leakage behaviour.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"leakage_behaviour_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"elements":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"leakage_rate":{"type":"number"}},"required":["storage_id","leakage_rate"]}},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["leakage_behaviour_id","resource_id","elements","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/frbc/instruction":{"post":{"operationId":"postV1IntegrationsSolareastBoilerByDeviceKeyS2FrbcInstruction","tags":["SolarEast / S2 FRBC"],"summary":"Send FRBC instruction","description":"Sends a Fill-Rate Based Control instruction telling the device which operation mode to run at which fill-rate factor and from when. Requires write access on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Instruction accepted.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"422":{"description":"Instruction requests an unsupported actuator, storage, control, or native boiler strategy","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"instruction_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"actuator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"requested_operation_mode_id":{"type":"string"},"operation_mode_factor":{"type":"number"},"elements":{"type":"array","items":{"type":"object","properties":{"storage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"fill_rate":{"type":"number"},"absolute_fill_level":{"type":"number"},"temperature_setpoint":{"type":"number"}},"required":["storage_id"]}},"abnormal_condition":{"type":"boolean"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["instruction_id","resource_id","actuator_id","requested_operation_mode_id","elements"]}}}}}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/pebc/power-constraints":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyS2PebcPowerConstraints","tags":["SolarEast / S2 PEBC"],"summary":"Get PEBC power constraints","description":"Returns the current Power Envelope Based Control constraints the device is willing to operate within (allowed power ranges over time).","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"PEBC power constraints.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"power_constraints_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"power_ranges":{"type":"array","items":{"type":"object","properties":{"power_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"start_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["power_range","start_time","end_time"]}},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["power_constraints_id","resource_id","power_ranges","timestamp"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/s2/pebc/instruction":{"post":{"operationId":"postV1IntegrationsSolareastBoilerByDeviceKeyS2PebcInstruction","tags":["SolarEast / S2 PEBC"],"summary":"Send PEBC instruction","description":"Sends a Power Envelope Based Control instruction setting the power envelope the device must follow. Requires write access on the device.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Instruction accepted.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"422":{"description":"Boiler electrical calibration and power-envelope control are unverified","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"instruction_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"requested_power_ranges":{"type":"array","items":{"type":"object","properties":{"power_range":{"type":"object","properties":{"lower_bound":{"type":"number"},"upper_bound":{"type":"number"}},"required":["lower_bound","upper_bound"]},"start_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["power_range","start_time","end_time"]}},"abnormal_condition":{"type":"boolean"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["instruction_id","resource_id","requested_power_ranges"]}}}}}},"/v1/integrations/solareast/boiler/{deviceKey}/alarms/report":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyAlarmsReport","tags":["SolarEast / S2"],"summary":"Get S2 alarm report","description":"Returns the alarms the device currently reports over S2, each with a stable code, human-readable description, severity, and affected subsystem.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Active device alarms.","headers":{"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"hasAlarm":{"type":"boolean"},"activeAlarms":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"severity":{"type":"string","enum":["fault","warning","info"]},"subsystem":{"type":"string","enum":["generic","sensors","protection","communication"]}},"required":["code","description","active","severity","subsystem"]}}},"required":["hasAlarm","activeAlarms"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]}},"/v1/integrations/solareast/boiler/{deviceKey}/matter":{"get":{"operationId":"getV1IntegrationsSolareastBoilerByDeviceKeyMatter","tags":["SolarEast / Matter"],"summary":"Get Matter snapshot","description":"boiler as Matter 1.4 endpoints and clusters, with every value already in Matter units, for a local Matter bridge to poll. Poll at `pollIntervalMs` with `If-None-Match`; an unchanged snapshot returns 304. See `docs/matter-bridge.md`.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Matter snapshot. `reachable: false` when the device is offline and cached status is served.","headers":{"Last-Modified":{"description":"When the boiler data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}},"X-Cache":{"description":"Present with value `STALE` when the response was served from the stale-cache fallback (upstream unavailable). Absent otherwise.","schema":{"type":"string","enum":["STALE"]}},"X-Device-Status":{"description":"Present with value `offline` when the device was confirmed offline but the response was served from cached status. Absent otherwise.","schema":{"type":"string","enum":["offline"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"uniqueId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID derived from the device key; use as Matter UniqueID"},"reachable":{"type":"boolean","description":"False when the device is confirmed offline and cached data is served"},"stale":{"type":"boolean","description":"True when the data is not live (stale-cache fallback or device offline)"},"fetchedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the underlying status was fetched from SolarEast"},"pollIntervalMs":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recommended poll interval (the per-device downstream window)"},"configurationId":{"type":"string","description":"Installation variant that decides the endpoint composition"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]},"description":"Device types of the composed parent (Heat Pump)"},"basicInformation":{"type":"object","properties":{"nodeLabel":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"softwareVersionString":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["nodeLabel","serialNumber","softwareVersionString"]},"endpoints":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"key":{"type":"string","const":"thermostat"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"},"outdoorTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedCoolingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState","outdoorTemperature"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"waterHeater"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState"]}},"required":["id","featureMap","attributes"]},"waterHeaterManagement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"heaterTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"heatDemand":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"boostState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"BoostStateEnum: 0 Inactive"}},"required":["heaterTypes","heatDemand","boostState"]}},"required":["id","featureMap","attributes"]},"waterHeaterMode":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"supportedModes":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"mode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"modeTags":{"type":"array","items":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["value"]}}},"required":["label","mode","modeTags"]}},"currentMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["supportedModes","currentMode"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat","waterHeaterManagement","waterHeaterMode"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"electricalSensor"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"powerTopology":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"availableEndpointKeys":{"type":"array","items":{"type":"string"},"description":"Not a Matter attribute: the endpoint `key`s this sensor measures. The bridge maps them to the numeric endpoint IDs it assigned and publishes the result as `availableEndpoints`."}},"required":["availableEndpointKeys"]}},"required":["id","featureMap","attributes"]},"electricalPowerMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"powerMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"PowerModeEnum: 2 AC"},"numberOfMeasurementTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracy":{"type":"array","items":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]}},"voltage":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mV, null when unknown"},"activeCurrent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mA, null when unknown"},"activePower":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mW, null when unknown"}},"required":["powerMode","numberOfMeasurementTypes","accuracy","voltage","activeCurrent","activePower"]}},"required":["id","featureMap","attributes"]},"electricalEnergyMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"accuracy":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]},"cumulativeEnergyImported":{"anyOf":[{"type":"object","properties":{"energy":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"mWh"}},"required":["energy"]},{"type":"null"}],"description":"EnergyMeasurementStruct, null when unknown"}},"required":["accuracy","cumulativeEnergyImported"]}},"required":["id","featureMap","attributes"]}},"required":["powerTopology","electricalPowerMeasurement","electricalEnergyMeasurement"]}},"required":["key","deviceTypes","clusters"]}]}}},"required":["deviceKey","uniqueId","reachable","stale","fetchedAt","pollIntervalMs","configurationId","deviceTypes","basicInformation","endpoints"]}},"required":["data"]}}}},"304":{"description":"Not modified — the snapshot matches `If-None-Match`."},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"429":{"description":"Too many requests — upstream rate limit exhausted and no cached status to serve (Matter: BUSY)"},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}]},"patch":{"operationId":"patchV1IntegrationsSolareastBoilerByDeviceKeyMatter","tags":["SolarEast / Matter"],"summary":"Apply Matter write","description":"Applies Matter attribute writes (`systemMode` and the occupied heating/cooling setpoints, in Matter units) to the device and returns the updated Matter snapshot. Requires write access on the device. See `docs/matter-bridge.md` for the error → Matter status mapping.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Write applied (or already in effect); the updated Matter snapshot.","headers":{"Last-Modified":{"description":"When the boiler data was last fetched from the SolarEast upstream","schema":{"type":"string","format":"http-date"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deviceKey":{"type":"string"},"uniqueId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID derived from the device key; use as Matter UniqueID"},"reachable":{"type":"boolean","description":"False when the device is confirmed offline and cached data is served"},"stale":{"type":"boolean","description":"True when the data is not live (stale-cache fallback or device offline)"},"fetchedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the underlying status was fetched from SolarEast"},"pollIntervalMs":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recommended poll interval (the per-device downstream window)"},"configurationId":{"type":"string","description":"Installation variant that decides the endpoint composition"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]},"description":"Device types of the composed parent (Heat Pump)"},"basicInformation":{"type":"object","properties":{"nodeLabel":{"type":"string"},"serialNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"softwareVersionString":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["nodeLabel","serialNumber","softwareVersionString"]},"endpoints":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"key":{"type":"string","const":"thermostat"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"},"outdoorTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedCoolingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxCoolSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState","outdoorTemperature"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"waterHeater"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"localTemperature":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"occupiedHeatingSetpoint":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMinHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"absMaxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"minHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"maxHeatSetpointLimit":{"anyOf":[{"type":"integer","minimum":-27315,"maximum":32767},{"type":"null"}],"description":"Matter temperature: int16 centi-°C (2150 = 21.50 °C), null when unknown"},"controlSequenceOfOperation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"ControlSequenceOfOperationEnum"},"systemMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"thermostatRunningState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"RelayStateBitmap: bit 0 Heat, bit 1 Cool"}},"required":["localTemperature","occupiedHeatingSetpoint","absMinHeatSetpointLimit","absMaxHeatSetpointLimit","minHeatSetpointLimit","maxHeatSetpointLimit","controlSequenceOfOperation","systemMode","thermostatRunningState"]}},"required":["id","featureMap","attributes"]},"waterHeaterManagement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"heaterTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"heatDemand":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"WaterHeaterHeatSourceBitmap"},"boostState":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"BoostStateEnum: 0 Inactive"}},"required":["heaterTypes","heatDemand","boostState"]}},"required":["id","featureMap","attributes"]},"waterHeaterMode":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"supportedModes":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"mode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"modeTags":{"type":"array","items":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["value"]}}},"required":["label","mode","modeTags"]}},"currentMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["supportedModes","currentMode"]}},"required":["id","featureMap","attributes"]}},"required":["thermostat","waterHeaterManagement","waterHeaterMode"]}},"required":["key","deviceTypes","clusters"]},{"type":"object","properties":{"key":{"type":"string","const":"electricalSensor"},"deviceTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter device type ID"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Device type revision"}},"required":["id","revision"]}},"clusters":{"type":"object","properties":{"powerTopology":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"availableEndpointKeys":{"type":"array","items":{"type":"string"},"description":"Not a Matter attribute: the endpoint `key`s this sensor measures. The bridge maps them to the numeric endpoint IDs it assigned and publishes the result as `availableEndpoints`."}},"required":["availableEndpointKeys"]}},"required":["id","featureMap","attributes"]},"electricalPowerMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"powerMode":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"PowerModeEnum: 2 AC"},"numberOfMeasurementTypes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracy":{"type":"array","items":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]}},"voltage":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mV, null when unknown"},"activeCurrent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mA, null when unknown"},"activePower":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"mW, null when unknown"}},"required":["powerMode","numberOfMeasurementTypes","accuracy","voltage","activeCurrent","activePower"]}},"required":["id","featureMap","attributes"]},"electricalEnergyMeasurement":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Matter cluster ID"},"featureMap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Static cluster FeatureMap bitmap"},"attributes":{"type":"object","properties":{"accuracy":{"type":"object","properties":{"measurementType":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"measured":{"type":"boolean"},"minMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxMeasuredValue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"accuracyRanges":{"type":"array","items":{"type":"object","properties":{"rangeMin":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rangeMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"percentMax":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Accuracy in 1/100 %"}},"required":["rangeMin","rangeMax","percentMax"]}}},"required":["measurementType","measured","minMeasuredValue","maxMeasuredValue","accuracyRanges"]},"cumulativeEnergyImported":{"anyOf":[{"type":"object","properties":{"energy":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"mWh"}},"required":["energy"]},{"type":"null"}],"description":"EnergyMeasurementStruct, null when unknown"}},"required":["accuracy","cumulativeEnergyImported"]}},"required":["id","featureMap","attributes"]}},"required":["powerTopology","electricalPowerMeasurement","electricalEnergyMeasurement"]}},"required":["key","deviceTypes","clusters"]}]}}},"required":["deviceKey","uniqueId","reachable","stale","fetchedAt","pollIntervalMs","configurationId","deviceTypes","basicInformation","endpoints"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"A weather curve controls the targeted setpoint (Matter: INVALID_IN_STATE)","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"422":{"description":"Setpoint out of range, unsupported systemMode, or endpoint absent for this configuration (Matter: CONSTRAINT_ERROR)","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"429":{"description":"Too many requests — upstream rate limit exhausted and no cached status to serve (Matter: BUSY)"},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"503":{"description":"Service unavailable — device offline with no cached status to serve","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"deviceKey","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"thermostat":{"type":"object","properties":{"systemMode":{"type":"integer","minimum":0,"maximum":255,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"occupiedHeatingSetpoint":{"type":"integer","minimum":-27315,"maximum":32767,"description":"Matter temperature: int16 centi-°C"},"occupiedCoolingSetpoint":{"type":"integer","minimum":-27315,"maximum":32767,"description":"Matter temperature: int16 centi-°C"}},"additionalProperties":false},"waterHeater":{"type":"object","properties":{"systemMode":{"type":"integer","minimum":0,"maximum":255,"description":"SystemModeEnum: 0 Off, 3 Cool, 4 Heat"},"occupiedHeatingSetpoint":{"type":"integer","minimum":-27315,"maximum":32767,"description":"Matter temperature: int16 centi-°C"}},"additionalProperties":false}},"additionalProperties":false}}}}}},"/v1/integrations/homey/oauth/authorize":{"get":{"operationId":"getV1IntegrationsHomeyOauthAuthorize","tags":["Homey"],"summary":"Start Homey connect flow","description":"Redirects the authenticated browser to Athom's OAuth2 authorization endpoint. A single-use `state` is stored server-side and mirrored in an httpOnly cookie so the public callback can be bound to the initiating browser.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"302":{"description":"Redirect to Athom's authorization endpoint."},"401":{"description":"Unauthenticated.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}}},"/v1/integrations/homey/oauth/callback":{"get":{"operationId":"getV1IntegrationsHomeyOauthCallback","tags":["Homey"],"summary":"Complete Homey connect flow","description":"Public OAuth2 redirect target for Athom. Validates the single-use state against the httpOnly cookie, exchanges the authorization code, stores the encrypted tokens, and redirects back to the initiating path. Clients should not call this endpoint directly.","responses":{"302":{"description":"Redirect back to the initiating path."},"400":{"description":"Missing/invalid state, state-cookie mismatch, or token exchange failure.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}}},"/v1/integrations/homey/connection":{"get":{"operationId":"getV1IntegrationsHomeyConnection","tags":["Homey"],"summary":"Get Homey connection status","description":"Reports whether the authenticated user has connected a Homey account, and if so since when.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Connection status for the authenticated user.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"connected":{"type":"boolean"},"homeyUserId":{"type":"string"},"connectedAt":{"type":"string"}},"required":["connected"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}},"delete":{"operationId":"deleteV1IntegrationsHomeyConnection","tags":["Homey"],"summary":"Disconnect Homey account","description":"Removes the stored Homey OAuth tokens for the authenticated user. Cached Homey data becomes unreachable; reconnecting issues a fresh connection.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Homey account disconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}}},"/v1/integrations/homey/homeys":{"get":{"operationId":"getV1IntegrationsHomeyHomeys","tags":["Homey"],"summary":"List Homeys","description":"Returns the Homeys linked to the authenticated user's connected Homey account.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Homeys linked to the connected account.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"platform":{"type":"string","enum":["local","cloud"]},"localUrl":{"type":"string"},"localUrlSecure":{"type":"string"},"remoteUrl":{"type":"string"}},"required":["id","name"]}}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}}}},"/v1/integrations/homey/homeys/{homeyId}/devices":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdDevices","tags":["Homey"],"summary":"List devices in a Homey","description":"Returns the devices known to the given Homey, read-only.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Devices in the given Homey.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"class":{"type":"string"},"zone":{"type":"string"},"available":{"type":"boolean"},"driverId":{"type":"string"},"ownerUri":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"capabilityValues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string"}]},"type":{"type":"string"},"units":{"type":"string"}},"required":["id","value"]}},"values":{"type":"object","properties":{"measure_power":{"type":"number"},"meter_power":{"type":"number"},"meter_power.imported":{"type":"number"},"meter_power.exported":{"type":"number"},"meter_power.charged":{"type":"number"},"meter_power.discharged":{"type":"number"},"meter_gas":{"type":"number"},"measure_battery":{"type":"number"},"target_power":{"type":"number"},"evcharger_charging":{"type":"boolean"},"onoff":{"type":"boolean"},"measure_temperature":{"type":"number"},"target_temperature":{"type":"number"}}},"energyCumulative":{"type":"boolean"},"energy":{"type":"object","properties":{"role":{"anyOf":[{"type":"string","enum":["grid","solar","battery","ev","home","gas","water","device"]},{"type":"null"}]}},"required":["role"]}},"required":["id","name"]}}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/integrations/homey/homeys/{homeyId}/devices/{deviceId}":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdDevicesByDeviceId","tags":["Homey"],"summary":"Get a Homey device","description":"Returns a single device in the given Homey, read-only.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"The requested device.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"class":{"type":"string"},"zone":{"type":"string"},"available":{"type":"boolean"},"driverId":{"type":"string"},"ownerUri":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"capabilityValues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string"}]},"type":{"type":"string"},"units":{"type":"string"}},"required":["id","value"]}},"values":{"type":"object","properties":{"measure_power":{"type":"number"},"meter_power":{"type":"number"},"meter_power.imported":{"type":"number"},"meter_power.exported":{"type":"number"},"meter_power.charged":{"type":"number"},"meter_power.discharged":{"type":"number"},"meter_gas":{"type":"number"},"measure_battery":{"type":"number"},"target_power":{"type":"number"},"evcharger_charging":{"type":"boolean"},"onoff":{"type":"boolean"},"measure_temperature":{"type":"number"},"target_temperature":{"type":"number"}}},"energyCumulative":{"type":"boolean"},"energy":{"type":"object","properties":{"role":{"anyOf":[{"type":"string","enum":["grid","solar","battery","ev","home","gas","water","device"]},{"type":"null"}]}},"required":["role"]}},"required":["id","name"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"deviceId","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/integrations/homey/homeys/{homeyId}/flows":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdFlows","tags":["Homey"],"summary":"List flows in a Homey","description":"Returns the flows known to the given Homey, read-only. Each flow carries a `homeNextRelated` hint: true when a card is an app-level HomeNext card or a device card whose device belongs to the HomeNext app (ownership is resolved through the device list; standard device cards carry no `uri`). Requires the `homey.flow.readonly` scope; a connection that predates it returns 409 and must be reconnected.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Flows in the given Homey.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"enabled":{"type":"boolean"},"folder":{"type":"string"},"trigger":{"anyOf":[{"type":"object","properties":{"uri":{"type":"string"},"id":{"type":"string"},"group":{"type":"string"},"args":{}},"required":["id"]},{"type":"null"}]},"conditions":{"type":"array","items":{"type":"object","properties":{"uri":{"type":"string"},"id":{"type":"string"},"group":{"type":"string"},"args":{}},"required":["id"]}},"actions":{"type":"array","items":{"type":"object","properties":{"uri":{"type":"string"},"id":{"type":"string"},"group":{"type":"string"},"args":{}},"required":["id"]}},"homeNextRelated":{"type":"boolean"}},"required":["id","name","trigger","conditions","actions","homeNextRelated"]}}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/integrations/homey/homeys/{homeyId}/flows/{flowId}":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdFlowsByFlowId","tags":["Homey"],"summary":"Get a Homey flow","description":"Returns a single flow in the given Homey, read-only. Requires the `homey.flow.readonly` scope; a connection that predates it returns 409 and must be reconnected.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"The requested flow.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"enabled":{"type":"boolean"},"folder":{"type":"string"},"trigger":{"anyOf":[{"type":"object","properties":{"uri":{"type":"string"},"id":{"type":"string"},"group":{"type":"string"},"args":{}},"required":["id"]},{"type":"null"}]},"conditions":{"type":"array","items":{"type":"object","properties":{"uri":{"type":"string"},"id":{"type":"string"},"group":{"type":"string"},"args":{}},"required":["id"]}},"actions":{"type":"array","items":{"type":"object","properties":{"uri":{"type":"string"},"id":{"type":"string"},"group":{"type":"string"},"args":{}},"required":["id"]}},"homeNextRelated":{"type":"boolean"}},"required":["id","name","trigger","conditions","actions","homeNextRelated"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"flowId","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/integrations/homey/homeys/{homeyId}/energy/live":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdEnergyLive","tags":["Homey"],"summary":"Get live Homey energy","description":"Whole-home live power with per-device draw and role-based category sums (grid, solar, battery, EV). Absent categories are null.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Live energy report.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"totalConsumedW":{"anyOf":[{"type":"number"},{"type":"null"}]},"totalGeneratedW":{"anyOf":[{"type":"number"},{"type":"null"}]},"totalCumulativeW":{"anyOf":[{"type":"number"},{"type":"null"}]},"gridW":{"anyOf":[{"type":"number"},{"type":"null"}]},"solarW":{"anyOf":[{"type":"number"},{"type":"null"}]},"batteryW":{"anyOf":[{"type":"number"},{"type":"null"}]},"evW":{"anyOf":[{"type":"number"},{"type":"null"}]},"updatedAt":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"deviceId":{"type":"string"},"name":{"type":"string"},"class":{"type":"string"},"powerW":{"type":"number"}},"required":["deviceId","name","powerW"]}}},"required":["totalConsumedW","totalGeneratedW","totalCumulativeW","gridW","solarW","batteryW","evW","updatedAt","items"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true}]}},"/v1/integrations/homey/homeys/{homeyId}/energy/report":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdEnergyReport","tags":["Homey"],"summary":"Get Homey day energy report","description":"Energy totals for one Homey-local day. `date` is passed through to Homey (defaults to Homey's today). Categories the household does not report are null.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Day energy report.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"date":{"type":"string"},"consumedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"importedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"exportedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"generatedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"batteryChargedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"batteryDischargedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"evChargedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"gasDm3":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["date","consumedWh","importedWh","exportedWh","generatedWh","batteryChargedWh","batteryDischargedWh","evChargedWh","gasDm3"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true},{"in":"query","name":"date","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}]}},"/v1/integrations/homey/homeys/{homeyId}/energy/hourly":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdEnergyHourly","tags":["Homey"],"summary":"Get Homey hourly energy","description":"Exactly 24 hours of whole-home energy for a Homey-local day, plus the indices with no data. Homey insights only offer a relative last-24h window, so `date` selects which local day to emit (defaults to the latest day in the window, i.e. Homey's today); it is not forwarded upstream. Categories the household does not report are null.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Hourly energy series.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"date":{"type":"string"},"hours":{"minItems":24,"maxItems":24,"type":"array","items":{"type":"object","properties":{"hour":{"type":"integer","minimum":0,"maximum":23},"consumedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"importedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"exportedWh":{"anyOf":[{"type":"number"},{"type":"null"}]},"generatedWh":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["hour","consumedWh","importedWh","exportedWh","generatedWh"]}},"gaps":{"type":"array","items":{"type":"integer","minimum":0,"maximum":23}}},"required":["date","hours","gaps"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true},{"in":"query","name":"date","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}]}},"/v1/integrations/homey/homeys/{homeyId}/energy/prices":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdEnergyPrices","tags":["Homey"],"summary":"Get Homey electricity prices","description":"Electricity prices for one Homey-local day. Dynamic tariffs return hourly means plus the true (possibly quarter-hour) intervals; a fixed tariff returns the same price for every hour.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Electricity prices.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"date":{"type":"string"},"type":{"type":"string"},"currency":{"type":"string"},"resolution":{"type":"string","enum":["hour","quarter"]},"hours":{"type":"array","items":{"type":"object","properties":{"hour":{"type":"integer","minimum":0,"maximum":23},"allInX10000":{"type":"number"},"marketX10000":{"type":"number"}},"required":["hour","allInX10000"]}},"intervals":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"allInX10000":{"type":"number"},"marketX10000":{"type":"number"}},"required":["from","to","allInX10000"]}}},"required":["date","type","currency","resolution","hours"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true},{"in":"query","name":"date","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}]}},"/v1/integrations/homey/homeys/{homeyId}/energy/contract":{"get":{"operationId":"getV1IntegrationsHomeyHomeysByHomeyIdEnergyContract","tags":["Homey"],"summary":"Get Homey energy contract","description":"Tariff type, currency and fixed prices. Fields with no Homey source (supplier name, gas price, feed-in price) are null.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Energy contract summary.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string"},"currency":{"type":"string"},"supplierName":{"anyOf":[{"type":"string"},{"type":"null"}]},"fixedElectricityX10000":{"anyOf":[{"type":"number"},{"type":"null"}]},"fixedGasX10000":{"anyOf":[{"type":"number"},{"type":"null"}]},"feedInX10000":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["type","currency","supplierName","fixedElectricityX10000","fixedGasX10000","feedInX10000"]}},"required":["data"]}}}},"400":{"description":"Bad request — validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"409":{"description":"Homey account not connected (or the connection was revoked), or the connection is missing a scope and must be reconnected.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"},"connectUrl":{"type":"string"}},"required":["type","title","status","detail","connectUrl"]}}}},"429":{"description":"Too many requests — the per-identity upstream budget is exhausted.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}},"502":{"description":"The Homey upstream API returned an error.","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"]}}}}},"parameters":[{"in":"path","name":"homeyId","schema":{"type":"string","minLength":1},"required":true}]}},"/health/ready":{"get":{"operationId":"getHealthReady","tags":["Health"],"summary":"Service readiness","description":"Lightweight health check. Returns 200 when the API can serve requests. Suitable for load-balancer and orchestrator probes.","responses":{"200":{"description":"Service is ready to accept traffic.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","const":"ready"},"timestamp":{"type":"string"},"uptime":{"type":"number"}},"required":["status","timestamp","uptime"]}}}}}}},"/health/integrations":{"get":{"operationId":"getHealthIntegrations","tags":["Health"],"summary":"List available integrations","description":"Lists the device integrations this API exposes. Use the returned ids to build integration-specific request paths.","responses":{"200":{"description":"Available integrations.","content":{"application/json":{"schema":{"type":"object","properties":{"integrations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"integration":{"type":"string"}},"required":["id","name","integration"]}},"count":{"type":"number"},"timestamp":{"type":"string"}},"required":["integrations","count","timestamp"]}}}}}}}}}