{"openapi":"3.1.0","info":{"title":"Enfy API","description":"\nEnfy Odin is the backend API for Enfy's energy management platform.\n\nAuthentication and Authorization\n- OAuth2 Resource Server with JWT (Authorization: Bearer <token>)\n- API Key (Authorization: APIKey <key>)\n- All endpoints require authentication and appropriate roles/permissions\n- Swagger UI \"Authorize\" button accepts a valid Bearer token or API Key\n\nRequest Requirements\n- X-Client header should identify the calling app (e.g. \"Enfy Control Panel\" or \"Enfy Edge\");\n  it is automatically added when using Swagger UI.\n\nAPI Groups (Swagger Tags)\n- Area Price, Grid Supplier, Credentials, Support, Energy Meter,\n  Energy System, Energy Controller, Solar Panel, Realtime Operation,\n  Prediction, Profile, Permission, Energy Sharing, Weather Forecast\n\nVersioning & Stability\n- Current version: v1. Backwards-compatible changes may be added without notice.\n- Breaking changes are announced in release notes.\n\nRate Limiting & Reliability\n- 20 requests per second per client (identified by X-Client header)\n- The API employs retries and fallbacks where appropriate; clients should implement their own retries for idempotent operations.\n\nDocumentation & Monitoring\n- Landing Page: / (root)\n- Swagger UI: /swagger-ui\n- OpenAPI JSON: /api-docs\n- Health: /actuator/health\n\nAuthentication & Authorization\n- https://app.enfy.no/api/auth/reference\n\nSupport\n- For access, onboarding, or questions, contact Enfy support.\n        ","contact":{"name":"Enfy","url":"https://www.enfy.no/","email":"enfy@support.no"},"version":"v1"},"servers":[{"url":"/","description":"Default Server URL"}],"security":[{"bearer":[]},{"apiKey":[]}],"tags":[{"name":"Weather Forecast","description":"Insight in the weather forecasts"},{"name":"Energy Meter","description":"Manage energy meters"},{"name":"Profile","description":"Endpoints for managing profiles"},{"name":"Production","description":"Measured energy production for an energy system"},{"name":"System Health","description":"Fleet-wide, domain-aware site health for the Enfy team (Admin only)"},{"name":"Prediction Analytics","description":"Forecast-vs-realized drift analytics over persisted forecast history"},{"name":"Credentials","description":"Endpoints for managing energy system credentials"},{"name":"Hafslund Flex API","description":"Endpoints for Hafslund Flex Asset Manager integration"},{"name":"Hardware Testing","description":"Manage test groups"},{"name":"Balancing","description":"Balancing market entity management"},{"name":"Grid Rental Prices","description":"Manage grid rental prices"},{"name":"Support Messages","description":"Manage support ticket messages"},{"name":"Commissioning","description":"Manage commissioning sessions"},{"name":"Energy Controllers","description":"Manage energy controllers"},{"name":"Hardware Testing","description":"Execute and monitor test runs"},{"name":"Support Tickets","description":"Manage support tickets"},{"name":"FCR Pre-qualification","description":"Manage FCR pre-qualification sessions"},{"name":"Scenarios","description":"Manage scenarios for operation plans"},{"name":"User permissions","description":"Query user permissions"},{"name":"Hardware Testing","description":"Manage hardware test definitions"},{"name":"Webhooks","description":"Manage webhooks"},{"name":"Energy System Predictions","description":"Manage energy system predictions"},{"name":"Area Price","description":"Insight in area prices"},{"name":"Energy system permissions","description":"Manage energy system permissions"},{"name":"Grid Signal","description":"Aggregated site grid signal for multi-meter energy systems (import-positive W, with provenance)"},{"name":"Hafslund Asset References","description":"Manage asset references for Hafslund integration"},{"name":"Grid Suppliers","description":"Manage grid suppliers"},{"name":"Solar Panels","description":"Manage solar panels"},{"name":"Energy Systems","description":"Manage energy systems"}],"paths":{"/api/v1/webhooks/subscriptions/{id}":{"put":{"tags":["Webhooks"],"summary":"Update a webhook subscription","operationId":"update","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookSubscription"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook subscription","operationId":"delete","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"boolean"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/solar-panels/{id}":{"get":{"tags":["Solar Panels"],"summary":"Find a solar panel by id","operationId":"findSolarPanelById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SolarPanelResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Solar Panels"],"summary":"Update a solar panel (Admin only)","operationId":"updateSolarPanel","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSolarPanelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Solar Panels"],"summary":"Delete a solar panel (Admin only)","operationId":"deleteSolarPanel","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/scenarios/{id}":{"get":{"tags":["Scenarios"],"summary":"Finds a scenario (Admin only)","operationId":"findScenario","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ScenarioResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Scenarios"],"summary":"Updates a scenario (Admin only)","operationId":"updateScenario","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScenarioRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Scenarios"],"summary":"Deletes a scenario (Admin only)","operationId":"deleteScenario","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"204":{"description":"No Content","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/profile/{userId}":{"get":{"tags":["Profile"],"summary":"Find a profile","operationId":"findUserProfile","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Profile"],"summary":"Update a profile","operationId":"updateUserProfile","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserProfileRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/grid-suppliers/{id}":{"get":{"tags":["Grid Suppliers"],"summary":"Find grid supplier","operationId":"findGridSupplier","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GridSupplierDetailsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Grid Suppliers"],"summary":"Update grid supplier (Admin only)","operationId":"updateGridSupplier","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGridSupplierRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Grid Suppliers"],"summary":"Remove grid supplier (Admin only)","operationId":"removeGridSupplier","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/grid-rental-prices/{id}":{"get":{"tags":["Grid Rental Prices"],"summary":"Find grid rental price by Id","operationId":"findGridRentalPrice","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GridRentalPriceResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Grid Rental Prices"],"summary":"Update an existing grid rental price (Admin only)","operationId":"updateGridRentalPrice","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGridRentalPriceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Grid Rental Prices"],"summary":"Delete a grid rental price (Admin only)","operationId":"deleteGridRentalPrice","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}":{"get":{"tags":["Energy Systems"],"summary":"Finds an energy system","operationId":"findEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergySystemDetailResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Energy Systems"],"summary":"Updates an energy system (Admin only)","operationId":"updateEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEnergySystemRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Energy Systems"],"summary":"Deletes an energy system (Admin only)","operationId":"deleteEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}":{"get":{"tags":["Energy Controllers"],"summary":"Finds energy controller for an energy system","operationId":"findEnergyController","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergyControllerResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Energy Controllers"],"summary":"Updates an energy controller (Admin only)","operationId":"updateEnergyController","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEnergyControllerRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Energy Controllers"],"summary":"Deletes an energy controller (Admin only)","operationId":"deleteEnergyController","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/users/{userId}":{"put":{"tags":["Energy system permissions"],"summary":"Change access to energy system","operationId":"changeAccessToEnergySystem","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeAccessToUserRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Energy system permissions"],"summary":"Revoke access from energy system","operationId":"revokeAccessFromEnergySystem","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"204":{"description":"No Content","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-meters/{id}":{"get":{"tags":["Energy Meter"],"summary":"Find energy meter","operationId":"findEnergyMeter","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergyMeterDetailsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Energy Meter"],"summary":"Update energy meter (Admin only)","operationId":"updateEnergyMeter","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterEnergyMeterRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/credentials/{id}":{"get":{"tags":["Credentials"],"summary":"Find credential by ID (Admin only)","operationId":"findCredential","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CredentialResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Credentials"],"summary":"Update credential (Admin only)","operationId":"updateCredential","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCredentialRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Credentials"],"summary":"Remove credential (Admin only)","operationId":"removeCredential","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/balancing/entities/{entityId}":{"get":{"tags":["Balancing"],"summary":"Get balancing providing entity","operationId":"getEntity","parameters":[{"name":"entityId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BalancingEntityResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Balancing"],"summary":"Update balancing providing entity (Admin only)","operationId":"update_1","parameters":[{"name":"entityId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBalancingEntityRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/asset-references/{id}":{"get":{"tags":["Hafslund Asset References"],"summary":"Finds an asset reference by ID","operationId":"findById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AssetReferenceResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"put":{"tags":["Hafslund Asset References"],"summary":"Updates an asset reference","operationId":"update_2","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssetReferenceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"delete":{"tags":["Hafslund Asset References"],"summary":"Deletes an asset reference","operationId":"delete_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1.1/assets/{assetId}/consumption/schedule":{"put":{"tags":["Hafslund Flex API"],"summary":"Send the scheduled power consumption for an asset for the given time period","operationId":"putConsumptionSchedule","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"startTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"endTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledConsumption"}}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/tasks/rerun":{"post":{"tags":["task-admin-controller"],"operationId":"runNow","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string"}},{"name":"name","in":"query","required":true,"schema":{"type":"string"}},{"name":"scheduleTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/tasks/rerunGroup":{"post":{"tags":["task-admin-controller"],"operationId":"runAllNow","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string"}},{"name":"onlyFailed","in":"query","required":true,"schema":{"type":"boolean"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/tasks/delete":{"post":{"tags":["task-admin-controller"],"operationId":"deleteTaskNow","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string"}},{"name":"name","in":"query","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/webhooks/subscriptions":{"get":{"tags":["Webhooks"],"summary":"List webhook subscriptions for current user","operationId":"list","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookSubscription"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Webhooks"],"summary":"Create a webhook subscription","operationId":"create","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookSubscription"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/webhooks/subscriptions/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test webhook delivery for this subscription","operationId":"test","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"boolean"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/test-runs":{"get":{"tags":["Hardware Testing"],"summary":"List all test runs","operationId":"findAll","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TestRun"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Hardware Testing"],"summary":"Start a test run (Admin only)","operationId":"start","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTestRunRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/test-runs/{id}/cancel":{"post":{"tags":["Hardware Testing"],"summary":"Cancel a running test (Admin only)","operationId":"cancel","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/test-groups":{"get":{"tags":["Hardware Testing"],"summary":"List all test groups","operationId":"findAll_1","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TestGroup"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Hardware Testing"],"summary":"Create a test group (Admin only)","operationId":"create_1","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTestGroupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/test-definitions":{"get":{"tags":["Hardware Testing"],"summary":"List all test definitions","operationId":"findAll_2","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TestDefinition"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Hardware Testing"],"summary":"Create a test definition (Admin only)","operationId":"create_2","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTestDefinitionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/support/tickets":{"get":{"tags":["Support Tickets"],"summary":"Get all support tickets","operationId":"findAll_3","parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SupportTicketStatus"}},{"name":"category","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SupportTicketCategory"}},{"name":"energySystemId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SupportTicketsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Support Tickets"],"summary":"Create a new support ticket","operationId":"create_3","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSupportTicketRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/support/tickets/{ticketId}/messages":{"get":{"tags":["Support Messages"],"summary":"Get all messages for a support ticket","operationId":"findAllMessages","parameters":[{"name":"ticketId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SupportMessagesResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Support Messages"],"summary":"Add a message to a support ticket","operationId":"addMessage","parameters":[{"name":"ticketId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSupportMessageRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/support/tickets/{ticketId}/assign":{"post":{"tags":["Support Messages"],"summary":"Assign a support ticket to an agent (Admin only)","operationId":"assignTicket","parameters":[{"name":"ticketId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignSupportTicketRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/support/tickets/{id}/status":{"post":{"tags":["Support Tickets"],"summary":"Update the status of a support ticket","operationId":"updateStatus","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSupportTicketStatusRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/solar-panels":{"get":{"tags":["Solar Panels"],"summary":"Find solar panels by energy system","operationId":"findSolarPanels","parameters":[{"name":"energySystemId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SolarPanelResponse"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Solar Panels"],"summary":"Register a new solar panel (Admin only)","operationId":"registerSolarPanel","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterSolarPanelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/site-health/mutes":{"post":{"tags":["System Health"],"summary":"Mute a health-issue kind for a target (Admin only)","description":"Suppresses the given issue kind on the given target (controller or meter) from the health rollup, summary counts, and status until it is unmuted. Idempotent. Supply (targetType, targetId); energyControllerId is a deprecated alias.","operationId":"mute","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuteHealthIssueRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/scenarios":{"get":{"tags":["Scenarios"],"summary":"Finds all scenarios (Admin only)","operationId":"findScenarios","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ScenariosResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Scenarios"],"summary":"Creates a new scenario (Admin only)","operationId":"registerScenario","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterScenarioRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/realtime-operations":{"get":{"tags":["realtime-operation-controller"],"summary":"Find realtime operations for an energy system","operationId":"findRealtimeOperationsBy","parameters":[{"name":"energySystemId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RealtimeOperationsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["realtime-operation-controller"],"summary":"Submit a realtime operation to ONE energy controller (flow is per controller, not per site)","description":"Sets a standing power setpoint on a single energy controller for the given time period. `flow` is in watts and applies to THAT CONTROLLER ALONE, not to the energy system: on a multi-controller system (e.g. Hogas, two 500 kW battery banks behind one connection point) submitting X to each of N controllers asks the plant for N x X at the grid connection. The setpoint is admitted against the controller's own battery rating and its rating-weighted share of the system's configured grid import/export cap; anything above either bound is REFUSED with 400 (errorCode REALTIME_OPERATION_EXCEEDS_LIMITS), whose message names the requested value, the highest deliverable value and which bound was hit. Nothing is persisted or published when a submit is refused. Both bounds are on the SETPOINT ITSELF: a standing setpoint outlives whatever the site happened to be drawing when it was posted, so the site's own load is not netted into the cap check and the instantaneous exchange at the connection point can still exceed the cap through load alone.","operationId":"submitRealtimeOperation","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitRealtimeOperationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/grid-suppliers":{"get":{"tags":["Grid Suppliers"],"summary":"Find grid suppliers","operationId":"findGridSuppliers","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GridSuppliersResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Grid Suppliers"],"summary":"Register grid supplier (Admin only)","operationId":"registerGridSupplier","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterGridSupplierRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/grid-rental-prices":{"post":{"tags":["Grid Rental Prices"],"summary":"Create a new grid rental price (Admin only)","operationId":"createGridRentalPrice","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGridRentalPriceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/fcr/prequalification":{"post":{"tags":["FCR Pre-qualification"],"summary":"Start a pre-qualification session (Admin only)","operationId":"start_1","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartPrequalificationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/fcr/prequalification/{sessionId}/cancel":{"post":{"tags":["FCR Pre-qualification"],"summary":"Cancel a pre-qualification session (Admin only)","operationId":"cancel_1","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems":{"get":{"tags":["Energy Systems"],"summary":"Finds all energy systems","operationId":"findEnergySystems","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergySystemsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Energy Systems"],"summary":"Registers new energy systems on behalf of an owner (Admin only)","operationId":"registerEnergySystem","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterEnergySystemRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/rename":{"post":{"tags":["Energy Systems"],"summary":"Rename an energy system","operationId":"renameEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameEnergySystemRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/norgespris/deactivate":{"post":{"tags":["Energy Systems"],"summary":"Deactives Norges pris for an energy system (Admin only)","operationId":"deactivatesNorgesPrisForEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/norgespris/activate":{"post":{"tags":["Energy Systems"],"summary":"Activates Norges pris for an energy system (Admin only)","operationId":"activateNorgesPrisForEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers":{"post":{"tags":["Energy Controllers"],"summary":"Registers a new energy controller","operationId":"registerEnergyController","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterEnergyControllerRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/operation-strategy":{"post":{"tags":["Energy Controllers"],"summary":"Changes the operation strategy of an energy controller (kill switch)","operationId":"changeOperationStrategy","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeOperationStrategyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements":{"post":{"tags":["Energy Controllers"],"summary":"Finds all measurements for a specific energy controller within a time period","operationId":"findInverterMeasurements","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimePeriodRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InverterMeasurementResponse"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/control-mode":{"post":{"tags":["Energy Controllers"],"summary":"Changes the control mode of an energy controller","operationId":"changeControlMode","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeControlModeRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/commands":{"post":{"tags":["Energy Controllers"],"summary":"Send modbus commands to an energy controller and return the device's results (Admin only)","operationId":"sendModbusCommandsToEnergyController","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModbusCommandsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ModbusCommandOutcome"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/deactivate":{"post":{"tags":["Energy Systems"],"summary":"Deactivates an energy system (Admin only)","operationId":"deactivateEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/activate":{"post":{"tags":["Energy Systems"],"summary":"Activates an energy system (Admin only)","operationId":"activateEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/users":{"get":{"tags":["Energy system permissions"],"summary":"Find users with access to energy system","operationId":"findUsersWithAccessToEnergySystem","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergySystemPermissionsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Energy system permissions"],"summary":"Grant access to energy system","operationId":"grantAccessToEnergySystem","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantAccessToUserRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-meters":{"get":{"tags":["Energy Meter"],"summary":"Find all energy meters","operationId":"findEnergyMeters","parameters":[{"name":"available","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergyMetersResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Energy Meter"],"summary":"Register energy meter (Admin only)","operationId":"registerEnergyMeter","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterEnergyMeterRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-meters/{id}/assign-to-energy-system":{"post":{"tags":["Energy Meter"],"summary":"Assign energy meter to energy system (Admin only)","operationId":"assignEnergyMeterToEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignEnergyMeterToEnergySystemRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/credentials":{"get":{"tags":["Credentials"],"summary":"Find credentials (Admin only)","operationId":"findCredentials","parameters":[{"name":"energySystemId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"systemName","in":"query","required":false,"schema":{"type":"string"}},{"name":"isActive","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CredentialsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Credentials"],"summary":"Register new credential (Admin only)","operationId":"registerCredential","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterCredentialRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/commissioning/{sessionId}/cancel":{"post":{"tags":["Commissioning"],"summary":"Cancel a commissioning session (Admin only)","operationId":"cancel_2","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/commissioning/start":{"post":{"tags":["Commissioning"],"summary":"Start a commissioning session (Admin only)","operationId":"start_2","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartCommissioningRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/balancing/entities":{"get":{"tags":["Balancing"],"summary":"Get balancing providing entities (Admin only)","operationId":"getEntities","parameters":[{"name":"type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/EntityType"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/EntityStatus"}},{"name":"energySystemId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BalancingEntitiesResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Balancing"],"summary":"Register balancing providing entity (Admin only)","operationId":"register","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterBalancingEntityRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/balancing/entities/{entityId}/deactivate":{"post":{"tags":["Balancing"],"summary":"Deactivate balancing mode on entity (Admin only)","operationId":"deactivate","parameters":[{"name":"entityId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/balancing/entities/{entityId}/activate":{"post":{"tags":["Balancing"],"summary":"Activate balancing mode on entity (Admin only)","operationId":"activate","parameters":[{"name":"entityId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/asset-references":{"get":{"tags":["Hafslund Asset References"],"summary":"Lists asset references by energyControllerId or energySystemId","operationId":"findBy","parameters":[{"name":"energyControllerId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"energySystemId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AssetReferencesResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]},"post":{"tags":["Hafslund Asset References"],"summary":"Registers a new asset reference","operationId":"register_1","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterAssetReferenceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/credentials/{id}/deactivate":{"patch":{"tags":["Credentials"],"summary":"Deactivate credential (Admin only)","operationId":"deactivateCredential","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler/js/context-path.js":{"get":{"tags":["index-html-controller"],"operationId":"contextPath","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"text/javascript":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler/index.html":{"get":{"tags":["index-html-controller"],"operationId":"indexHtml","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler/history/all":{"get":{"tags":["index-html-controller"],"operationId":"indexHtml_1","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler":{"get":{"tags":["index-html-controller"],"operationId":"indexHtml_2","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler/history/all/index.html":{"get":{"tags":["index-html-controller"],"operationId":"indexHtml_3","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/tasks/poll":{"get":{"tags":["task-controller"],"operationId":"pollForUpdates","parameters":[{"name":"params","in":"query","required":true,"schema":{"$ref":"#/components/schemas/TaskDetailsRequestParams"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PollResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/tasks/details":{"get":{"tags":["task-controller"],"operationId":"getTaskDetails","parameters":[{"name":"params","in":"query","required":true,"schema":{"$ref":"#/components/schemas/TaskDetailsRequestParams"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GetTasksResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/tasks/all":{"get":{"tags":["task-controller"],"operationId":"getTasks","parameters":[{"name":"params","in":"query","required":true,"schema":{"$ref":"#/components/schemas/TaskRequestParams"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GetTasksResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/logs/poll":{"get":{"tags":["log-controller"],"operationId":"pollLogs","parameters":[{"name":"params","in":"query","required":true,"schema":{"$ref":"#/components/schemas/TaskDetailsRequestParams"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/LogPollResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/logs/all":{"get":{"tags":["log-controller"],"operationId":"getAllLogs","parameters":[{"name":"params","in":"query","required":true,"schema":{"$ref":"#/components/schemas/TaskDetailsRequestParams"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GetLogsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/db-scheduler-api/config":{"get":{"tags":["config-controller"],"operationId":"getConfig","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ConfigResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/weather-forecasts":{"get":{"tags":["Weather Forecast"],"summary":"Find today weather forecast for all locations","operationId":"findWeatherForecasts","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WeatherForecastsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/users/{userId}/permissions":{"get":{"tags":["User permissions"],"summary":"Find permissions by user","operationId":"findPermissionsByUserId","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergySystemPermissionsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/users/permissions":{"get":{"tags":["User permissions"],"summary":"Find all permissions (Admin only)","operationId":"findPermissions","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergySystemPermissionsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/test-runs/{id}":{"get":{"tags":["Hardware Testing"],"summary":"Get test run details","operationId":"findById_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TestRun"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/test-runs/{id}/readings":{"get":{"tags":["Hardware Testing"],"summary":"Get readings for a test run","operationId":"getReadings","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InverterMeasurement"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/support/tickets/{id}":{"get":{"tags":["Support Tickets"],"summary":"Get a support ticket by ID","operationId":"findById_2","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SupportTicketResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/site-health":{"get":{"tags":["System Health"],"summary":"Computes fleet-wide site health on request (Admin only)","description":"Returns every active energy system grouped with its controllers' current health. PV-only inverters are excluded from battery SOC checks; low SOC is judged against each battery's own minimum.","operationId":"findSiteHealth","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SiteHealthResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/profile":{"get":{"tags":["Profile"],"summary":"Find all profiles","operationId":"findUserProfiles","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserProfilesResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/grid-rental-prices/grid-supplier/{gridSupplierId}":{"get":{"tags":["Grid Rental Prices"],"summary":"Find grid rental prices by grid supplier Id","operationId":"findGridRentalPricesByGridSupplier","parameters":[{"name":"gridSupplierId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GridRentalPricesResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/grid-rental-prices/active":{"get":{"tags":["Grid Rental Prices"],"summary":"Find active grid rental price for a grid supplier, customer type, and voltage level","operationId":"findActiveGridRentalPrice","parameters":[{"name":"gridSupplierId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"customerType","in":"query","required":true,"schema":{"$ref":"#/components/schemas/CustomerType"}},{"name":"voltageLevel","in":"query","required":false,"schema":{"$ref":"#/components/schemas/VoltageLevel"}},{"name":"atTime","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GridRentalPriceResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/fcr/prequalification/{sessionId}":{"get":{"tags":["FCR Pre-qualification"],"summary":"Get pre-qualification session status","operationId":"getSession","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PrequalificationSessionResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/fcr/prequalification/{sessionId}/export":{"get":{"tags":["FCR Pre-qualification"],"summary":"Export TSO report as ZIP with CSVs","operationId":"export","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"application/zip":{"schema":{"type":"string","format":"byte"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/fcr/prequalification/entity/{entityId}":{"get":{"tags":["FCR Pre-qualification"],"summary":"Get all pre-qualification sessions for an entity","operationId":"getSessionsByEntity","parameters":[{"name":"entityId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PrequalificationSessionResponse"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/production":{"get":{"tags":["Production"],"summary":"Actual measured solar production for an energy system, summed across all controllers and bucketed by the requested resolution (energy in kWh).","operationId":"findActualProduction","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","default":"hour"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ProductionResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/operational-plans":{"get":{"tags":["Energy Systems"],"summary":"Returns the forward dispatch plan (current hour through the planning horizon) for an energy system","operationId":"findOperationPlansByEnergySystem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/OperationPlanDetailResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/health":{"get":{"tags":["Energy Systems"],"summary":"Returns a redacted, customer-facing health summary for an energy system","operationId":"findEnergySystemHealth","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CustomerSystemHealthResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements/statistics":{"get":{"tags":["Energy Controllers"],"summary":"Gets statistics for a specific energy controller within a time period","operationId":"getInverterMeasurementStatistics","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimePeriodRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements/power-above":{"get":{"tags":["Energy Controllers"],"summary":"Finds measurements for a specific energy controller with power above a threshold","operationId":"findInverterMeasurementsByPowerAbove","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PowerThresholdWithTimePeriodRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InverterMeasurementResponse"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements/max-power":{"get":{"tags":["Energy Controllers"],"summary":"Gets the maximum power for a specific energy controller within a time period","operationId":"getMaxPower","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimePeriodRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"number","format":"double"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements/latest":{"get":{"tags":["Energy Controllers"],"summary":"Finds the latest measurement for a specific energy controller","operationId":"findLatestInverterMeasurement","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/InverterMeasurementResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements/battery-state-of-charge":{"get":{"tags":["Energy Controllers"],"summary":"Finds measurements for a specific energy controller with battery state of charge within a range","operationId":"findInverterMeasurementsByBatteryStateOfCharge","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatteryStateOfChargeRangeWithTimePeriodRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InverterMeasurementResponse"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements/average-battery-state-of-charge":{"get":{"tags":["Energy Controllers"],"summary":"Gets the average battery state of charge for a specific energy controller within a time period","operationId":"getAverageBatteryStateOfCharge","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimePeriodRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"number","format":"double"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/energy-controllers/{energyControllerId}/measurements/at":{"get":{"tags":["Energy Controllers"],"summary":"Finds measurements for a specific energy controller at a specific timestamp","operationId":"findInverterMeasurementAt","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"timestamp","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/InverterMeasurementResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{id}/capacity-tier":{"get":{"tags":["Energy Systems"],"summary":"Returns the current Døgnmaks capacity tier (billing-period peak + current step) for an energy system","operationId":"findCapacityTier","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CapacityTierResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/predictions/production":{"get":{"tags":["Energy System Predictions"],"summary":"Find production predictions for an energy system","operationId":"getProductionPredictions","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ProductionPredictionsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/predictions/consumption":{"get":{"tags":["Energy System Predictions"],"summary":"Find consumption predictions for an energy system","operationId":"getConsumptionPredictions","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ConsumptionPredictionsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/grid-signal/timeseries":{"get":{"tags":["Grid Signal"],"summary":"Find the aggregated site grid signal time series for an energy system over a time period of at most 7 days (rows are per-minute).","operationId":"findGridSignalTimeseries","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GridSignalTimeseriesResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/grid-signal/latest":{"get":{"tags":["Grid Signal"],"summary":"Find the latest aggregated site grid signal for an energy system. 404 when no aggregate exists (single-meter system, or no aggregator row yet).","operationId":"findLatestGridSignal","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GridSignalResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/analytics/drift":{"get":{"tags":["Prediction Analytics"],"summary":"Per-day forecast-vs-realized drift (UTC days; the current UTC day is excluded)","operationId":"getForecastDrift","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"days","in":"query","description":"Number of complete UTC days to return (1-90)","required":false,"schema":{"type":"integer","format":"int32","default":7},"example":7},{"name":"asOf","in":"query","description":"Compare the forecast generation valid as of this instant (ISO-8601); omit for the latest/closest-to-delivery generation","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ForecastDriftResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/{energySystemId}/analytics/drift/hourly":{"get":{"tags":["Prediction Analytics"],"summary":"Per-UTC-hour forecast-vs-realized drill-down for one past UTC day","operationId":"getHourlyForecastVsRealized","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"date","in":"query","description":"The UTC day to inspect (YYYY-MM-DD); must be a past, complete UTC day","required":true,"schema":{"type":"string","format":"date"},"example":"2026-06-16"},{"name":"asOf","in":"query","description":"Compare the forecast generation valid as of this instant (ISO-8601); omit for the latest/closest-to-delivery generation","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/HourlyForecastVsRealizedResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-systems/energy-controllers":{"get":{"tags":["Energy Controllers"],"summary":"Finds all energy controllers","operationId":"findEnergyControllers","parameters":[{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergyControllersResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-meters/{id}/consumption/total":{"get":{"tags":["Energy Meter"],"summary":"Find total energy consumption for an energy meter over a time period","operationId":"findTotalEnergyConsumption","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"startTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"endTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AveragePowerConsumptionResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-meters/{id}/consumption/timeseries":{"get":{"tags":["Energy Meter"],"summary":"Find energy consumption time series for an energy meter over a time period","operationId":"findEnergyConsumption","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"startTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"endTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnergyConsumptionResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/energy-meters/{id}/consumption/latest":{"get":{"tags":["Energy Meter"],"summary":"Find latest energy consumption for an energy meter","operationId":"findLatestEnergyConsumption","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CurrentPowerResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/credentials/energy-system/{energySystemId}":{"get":{"tags":["Credentials"],"summary":"Find credentials by energy system ID (Admin only)","operationId":"findCredentialsByEnergySystemId","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CredentialsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/commissioning/{sessionId}":{"get":{"tags":["Commissioning"],"summary":"Get commissioning session status","operationId":"getSession_1","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommissioningSessionResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/commissioning/energy-system/{energySystemId}":{"get":{"tags":["Commissioning"],"summary":"Get all commissioning sessions for an energy system","operationId":"getSessionsByEnergySystem","parameters":[{"name":"energySystemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommissioningSessionResponse"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/area-prices":{"get":{"tags":["Area Price"],"summary":"Returns a list of area prices for a given date or multiple dates","operationId":"findAreaPrices","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"dates","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","format":"date"},"uniqueItems":true}},{"name":"codes","in":"query","description":"Delivery area codes","required":false,"allowEmptyValue":true,"schema":{"type":"array","items":{"type":"string"},"uniqueItems":true},"example":"NO1,NO2"},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AreaPricesResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1.1/meters/{meterId}/consumption/historical":{"get":{"tags":["Hafslund Flex API"],"summary":"Optional: returns meters readings in kW given in chosen resolution. Only needed for support of grid tariff optimization.","operationId":"getMeterHistoricalConsumption","parameters":[{"name":"meterId","in":"path","required":true,"schema":{"type":"string"}},{"name":"startTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"endTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","default":900.000000000}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MeterReading"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1.1/assets":{"get":{"tags":["Hafslund Flex API"],"summary":"Returns all assets that are available for use in Hafslund Flex","operationId":"getAssets","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":100}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GetFlexibilityAssetsResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1.1/assets/{assetId}/solar/properties":{"get":{"tags":["Hafslund Flex API"],"summary":"Returns the properties of the solar site for the requested time range","operationId":"getSolarProperties","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SolarProperties"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1.1/assets/{assetId}/consumption/historical":{"get":{"tags":["Hafslund Flex API"],"summary":"Returns historical power consumption in kW given in chosen resolution","operationId":"getAssetHistoricalConsumption","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"startTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"endTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","default":900.000000000}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PowerMeasurement"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1.1/assets/{assetId}/battery/state":{"get":{"tags":["Hafslund Flex API"],"summary":"Returns the current state of the battery","operationId":"getBatteryState","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BatteryState"}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1.1/assets/{assetId}/battery/properties":{"get":{"tags":["Hafslund Flex API"],"summary":"Returns the properties of the battery for the requested time range","operationId":"getBatteryProperties","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"startTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"endTime","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","default":900.000000000}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BatteryProperties"}}}}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/test-definitions/{id}":{"delete":{"tags":["Hardware Testing"],"summary":"Delete a test definition (Admin only)","operationId":"delete_2","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/site-health/mutes/{targetType}/{targetId}/{kind}":{"delete":{"tags":["System Health"],"summary":"Unmute a health-issue kind for a target (Admin only)","operationId":"unmute","parameters":[{"name":"targetType","in":"path","required":true,"schema":{"$ref":"#/components/schemas/MuteTargetType"}},{"name":"targetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"kind","in":"path","required":true,"schema":{"$ref":"#/components/schemas/HealthIssueKind"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}},"/api/v1/site-health/mutes/{energyControllerId}/{kind}":{"delete":{"tags":["System Health"],"summary":"DEPRECATED — unmute a controller health-issue kind (use the target form)","operationId":"unmuteControllerLegacy","parameters":[{"name":"energyControllerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"kind","in":"path","required":true,"schema":{"$ref":"#/components/schemas/HealthIssueKind"}},{"name":"X-Client","in":"header","description":"Something that identifies the client or system. Examples: \"Enfy Control Panel\", \"Enfy Edge\". Must be set unless the request is made directly in a browser.","schema":{},"example":"Enfy Swagger UI"}],"responses":{"200":{"description":"OK","content":{}},"400":{"description":"Invalid input"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]},{"apiKey":[]}]}}},"components":{"schemas":{"UpdateWebhookSubscriptionRequest":{"type":"object","properties":{"url":{"type":"string"},"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEvent"},"uniqueItems":true},"secret":{"type":"string"},"active":{"type":"boolean"}}},"WebhookEvent":{"type":"string","enum":["CONSUMPTION","INVERTER_READINGS","REALTIME_OPERATIONS"]},"WebhookSubscription":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEvent"},"uniqueItems":true},"active":{"type":"boolean"},"secret":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"failureCount":{"type":"integer","format":"int32"}},"required":["active","createdAt","events","failureCount","id","url","userId"]},"UpdateSolarPanelRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"},"peakPower":{"type":"number","format":"double"},"azimuth":{"type":"number","format":"double"},"tilt":{"type":"number","format":"double"},"installDate":{"type":"string","format":"date-time"}},"required":["azimuth","energySystemId","installDate","peakPower","tilt"]},"ScenarioCriteriaRequest":{"type":"object","properties":{"priority":{"type":"integer","format":"int32"},"description":{"type":"string"}},"required":["description","priority"]},"UpdateScenarioRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"criterias":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioCriteriaRequest"}}},"required":["criterias","description","name"]},"UpdateUserProfileRequest":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"avatarUrl":{"type":"string"},"phoneNumber":{"type":"string"},"street":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"postalCode":{"type":"string"}},"required":["firstName","lastName"]},"UpdateGridSupplierRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1},"email":{"type":"string","minLength":1},"phoneNumber":{"type":"string","minLength":1},"website":{"type":"string","minLength":1},"region":{"type":"string","minLength":1},"country":{"type":"string","minLength":1}},"required":["country","email","name","phoneNumber","region","website"]},"AdditionalFeeRequest":{"type":"object","properties":{"name":{"type":"string"},"amount":{"type":"number","format":"double"},"type":{"type":"string"},"description":{"type":"string"}},"required":["amount","name","type"]},"CustomerType":{"type":"string","enum":["PRIVATE","BUSINESS"]},"GridRentalPriceType":{"type":"string","enum":["FIXED_PRICE","ENERGY_BASED","CAPACITY_BASED","TIME_OF_USE","STEPPED_PRICING","NORWEGIAN_HYBRID"]},"PricingModelRequest":{"type":"object","discriminator":{"propertyName":"type"},"properties":{"type":{"$ref":"#/components/schemas/GridRentalPriceType"}},"required":["type"]},"UpdateGridRentalPriceRequest":{"type":"object","properties":{"customerType":{"$ref":"#/components/schemas/CustomerType"},"voltageLevel":{"$ref":"#/components/schemas/VoltageLevel"},"pricingModel":{"$ref":"#/components/schemas/PricingModelRequest"},"validFrom":{"type":"string","format":"date-time"},"validTo":{"type":"string","format":"date-time"},"includesVat":{"type":"boolean"},"additionalFees":{"type":"array","items":{"$ref":"#/components/schemas/AdditionalFeeRequest"}}},"required":["additionalFees","customerType","includesVat","pricingModel","validFrom","voltageLevel"]},"VoltageLevel":{"type":"string","enum":["LOW_VOLTAGE","MEDIUM_VOLTAGE","HIGH_VOLTAGE","TRANSMISSION"]},"DeliveryArea":{"type":"string","enum":["NO1","NO2","NO3","NO4","NO5"]},"UpdateEnergySystemRequest":{"type":"object","properties":{"name":{"type":"string"},"projectReference":{"type":"string"},"description":{"type":"string"},"area":{"$ref":"#/components/schemas/DeliveryArea"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"address":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"manufacturerId":{"type":"string","format":"uuid"},"gridSupplierId":{"type":"string","format":"uuid"},"dischargeEffectivenessPercentage":{"type":"number","format":"double"},"norgesprisEnabled":{"type":"boolean"},"maxGridImportPower":{"type":"number","format":"double"},"maxGridExportPower":{"type":"number","format":"double"}},"required":["address","area","city","country","description","dischargeEffectivenessPercentage","gridSupplierId","latitude","longitude","manufacturerId","name","norgesprisEnabled","projectReference","state"]},"ControlMode":{"type":"string","enum":["MANUAL","AUTOMATIC","PREPAREDNESS","TEST","FCR"]},"InverterBrand":{"type":"string","enum":["SOLIS","AFORE","ATESSHPS","GROWATT","SUNGROW","KACO","FFD_POWER","EVE_ENERGY","PYLONTECH"]},"InverterType":{"type":"string","enum":["HYBRID","SOLAR","BATTERY"]},"UpdateEnergyControllerRequest":{"type":"object","properties":{"inverter":{"$ref":"#/components/schemas/InverterBrand"},"type":{"$ref":"#/components/schemas/InverterType"},"controlMode":{"$ref":"#/components/schemas/ControlMode"},"slaveIds":{"type":"array","items":{"type":"integer","format":"int32"},"uniqueItems":true},"maxBatteryCapacity":{"type":"number","format":"double"},"maxBatteryCharge":{"type":"number","format":"double"},"maxBatteryDischarge":{"type":"number","format":"double"},"maxProduction":{"type":"number","format":"double"},"minBatterySoC":{"type":"integer","format":"int32"},"maxBatterySoC":{"type":"integer","format":"int32"},"maxInverterAcOutputCurrentA":{"type":"number","format":"double"}},"required":["controlMode","inverter","maxBatteryCapacity","maxBatteryCharge","maxBatteryDischarge","maxProduction","slaveIds","type"]},"Authority":{"type":"string","enum":["PARTICIPANT","MANAGER","OWNER"]},"ChangeAccessToUserRequest":{"type":"object","properties":{"authority":{"$ref":"#/components/schemas/Authority"}},"required":["authority"]},"EnergyMeterRole":{"type":"string","enum":["GRID_EXCHANGE","SHADOW","SUBMETER"]},"EnergyMeterType":{"type":"string","enum":["UTILTECH_POW","TIBBER_PULSE","WM20"]},"RegisterEnergyMeterRequest":{"type":"object","properties":{"measurementPointId":{"type":"string"},"energySystemId":{"type":"string","format":"uuid"},"type":{"$ref":"#/components/schemas/EnergyMeterType"},"isMaster":{"type":"boolean"},"powerFactor":{"type":"number","format":"double"},"description":{"type":"string"},"meterRole":{"$ref":"#/components/schemas/EnergyMeterRole"},"shadowOfMeterId":{"type":"string","format":"uuid"},"exportCapable":{"type":"boolean"}},"required":["isMaster","measurementPointId","powerFactor","type"]},"UpdateCredentialRequest":{"type":"object","properties":{"systemName":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"description":{"type":"string"}}},"BalancingMarket":{"type":"string","enum":["FCR_N","FCR_D_UP","FCR_D_DOWN","AFRR","MFRR"]},"EntityType":{"type":"string","enum":["UNIT","GROUP"]},"MarketParticipationRequest":{"type":"object","properties":{"market":{"$ref":"#/components/schemas/BalancingMarket"},"variant":{"$ref":"#/components/schemas/MarketVariant"},"theoreticalCapacityW":{"type":"number","format":"double"},"reductionFactorSs":{"type":"number","format":"double"},"reductionFactorDyn":{"type":"number","format":"double"},"biddingEnabled":{"type":"boolean"}},"required":["biddingEnabled","market","reductionFactorDyn","reductionFactorSs","theoreticalCapacityW"]},"MarketVariant":{"type":"string","enum":["DYNAMIC","STATIC"]},"UpdateBalancingEntityRequest":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/EntityType"},"energySystemId":{"type":"string","format":"uuid"},"controllerIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true},"marketParticipations":{"type":"array","items":{"$ref":"#/components/schemas/MarketParticipationRequest"}},"isLer":{"type":"boolean"}},"required":["controllerIds","energySystemId","isLer","marketParticipations","type"]},"UpdateAssetReferenceRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid","description":"Energy System ID"},"energyControllerId":{"type":"string","format":"uuid","description":"Energy Controller ID"}},"required":["energyControllerId","energySystemId"]},"Currency":{"type":"string","enum":["NOK"]},"Price":{"type":"object","properties":{"amount":{"type":"number","format":"double"},"currency":{"$ref":"#/components/schemas/Currency"}},"required":["amount","currency"]},"ScheduledConsumption":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"powerConsumptionTarget":{"type":"number","format":"double"},"expectedIncomeFromTrading":{"$ref":"#/components/schemas/Price"},"expectedSavingsFromCostOptimization":{"$ref":"#/components/schemas/Price"}},"required":["endTime","powerConsumptionTarget","startTime"]},"CreateWebhookSubscriptionRequest":{"type":"object","properties":{"url":{"type":"string","minLength":1},"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEvent"},"minItems":1,"uniqueItems":true},"secret":{"type":"string"}},"required":["events","url"]},"StartTestRunRequest":{"type":"object","properties":{"testDefinitionId":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"},"energyMeterId":{"type":"string","format":"uuid"}},"required":["energyControllerId","testDefinitionId"]},"CreateTestGroupRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"testDefinitionIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["description","name","testDefinitionIds"]},"ComparisonOperator":{"type":"string","enum":["GTE","LTE","BETWEEN","WITHIN_PERCENT"]},"CreateTestDefinitionRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"category":{"$ref":"#/components/schemas/TestCategory"},"samplingRateHz":{"type":"integer","format":"int32"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/TestStepDefinition"}},"evaluationCriteria":{"type":"array","items":{"$ref":"#/components/schemas/EvaluationCriterion"}}},"required":["category","description","evaluationCriteria","name","samplingRateHz","steps"]},"EvaluationCriterion":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/EvaluationMetric"},"operator":{"$ref":"#/components/schemas/ComparisonOperator"},"threshold":{"type":"number","format":"double"},"tolerancePercent":{"type":"number","format":"double"},"upperBound":{"type":"number","format":"double"},"appliesTo":{"$ref":"#/components/schemas/StepSelector"},"description":{"type":"string"}},"required":["appliesTo","description","metric","operator","threshold"]},"EvaluationMetric":{"type":"string","enum":["ACTIVE_POWER","BATTERY_STATE_OF_CHARGE","RESPONSE_TIME","OVER_DELIVERY","GRID_FREQUENCY","BATTERY_POWER","SOLAR_POWER","APPLIED_FREQUENCY","ACTIVATION_ACCURACY","STEADY_STATE_POWER","RAMP_RATE","DEACTIVATION_TIME","NEM_ACTIVATION","AEM_STATUS","ENDURANCE_DURATION","POWER_SETPOINT_RECEIVED","FAULT_CODE_SEVERITY","BATTERY_TEMPERATURE","IGBT_TEMPERATURE"]},"FrequencySignalDefinition":{"type":"object","properties":{"signalType":{"$ref":"#/components/schemas/FrequencySignalType"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/FrequencySignalStep"}},"sineParameters":{"$ref":"#/components/schemas/SineParameters"}},"required":["signalType","steps"]},"FrequencySignalStep":{"type":"object","properties":{"startTimeSeconds":{"type":"number","format":"double"},"durationSeconds":{"type":"number","format":"double"},"frequencyHz":{"type":"number","format":"double"},"rampSpeedHzPerSecond":{"type":"number","format":"double"}},"required":["durationSeconds","frequencyHz","startTimeSeconds"]},"FrequencySignalType":{"type":"string","enum":["STEP","SINE","RAMP","LINEARITY_STAIRCASE","CONSTANT"]},"SineParameters":{"type":"object","properties":{"centerFrequencyHz":{"type":"number","format":"double"},"amplitudeHz":{"type":"number","format":"double"},"periodSeconds":{"type":"number","format":"double"},"stationaryPeriods":{"type":"integer","format":"int32"},"totalPeriods":{"type":"integer","format":"int32"}},"required":["amplitudeHz","centerFrequencyHz","periodSeconds","stationaryPeriods","totalPeriods"]},"StepSelector":{"discriminator":{"propertyName":"type"},"properties":{"type":{"type":"string"}},"required":["type"]},"TestCategory":{"type":"string","enum":["FCR_N","FCR_D_OPP","FCR_D_NED","MFFR","AFFR","CUSTOM","COMMISSIONING"]},"TestStepDefinition":{"type":"object","properties":{"order":{"type":"integer","format":"int32"},"name":{"type":"string"},"powerSetpointWatts":{"type":"integer","format":"int32"},"durationSeconds":{"type":"integer","format":"int32"},"stabilizationSeconds":{"type":"integer","format":"int32"},"frequencySignal":{"$ref":"#/components/schemas/FrequencySignalDefinition"}},"required":["durationSeconds","name","order","powerSetpointWatts","stabilizationSeconds"]},"CreateSupportTicketRequest":{"type":"object","properties":{"subject":{"type":"string"},"category":{"$ref":"#/components/schemas/SupportTicketCategory"},"initialMessage":{"type":"string"},"priority":{"$ref":"#/components/schemas/SupportTicketPriority"},"energySystemId":{"type":"string","format":"uuid"},"attachmentUrls":{"type":"array","items":{"type":"string"}}},"required":["category","initialMessage","subject"]},"SupportTicketCategory":{"type":"string","enum":["ACCOUNT_ACCESS","HARDWARE","ENERGY_CONSUMPTION","BILLING","OPERATION_PLAN","USER_INTERFACE","OTHER"]},"SupportTicketPriority":{"type":"string","enum":["LOW","MEDIUM","HIGH","CRITICAL"]},"AddSupportMessageRequest":{"type":"object","properties":{"content":{"type":"string"},"attachmentUrls":{"type":"array","items":{"type":"string"}}},"required":["content"]},"AssignSupportTicketRequest":{"type":"object","properties":{"agentId":{"type":"string"}},"required":["agentId"]},"SupportTicketStatus":{"type":"string","enum":["OPEN","IN_PROGRESS","WAITING_FOR_CUSTOMER","RESOLVED","CLOSED"]},"UpdateSupportTicketStatusRequest":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/SupportTicketStatus"},"comment":{"type":"string"}},"required":["status"]},"RegisterSolarPanelRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"},"peakPower":{"type":"number","format":"double"},"azimuth":{"type":"number","format":"double"},"tilt":{"type":"number","format":"double"},"installDate":{"type":"string","format":"date-time"}},"required":["azimuth","energySystemId","installDate","peakPower","tilt"]},"HealthIssueKind":{"type":"string","enum":["OFFLINE","FAULT","LOW_SOC","HIGH_BATTERY_TEMPERATURE","HIGH_INVERTER_TEMPERATURE","SETPOINT_MISMATCH","DISK_LOW","HIGH_CPU","STALE_DATA","NO_DATA","CALIBRATION_OVERDUE","BATTERY_UNRESPONSIVE","UNCOMMANDED_POWER","IMPLAUSIBLE_SOC","DISPATCH_SILENCE","INVERTER_STATE_FAULT","METER_INACTIVE","METER_ERROR","AC_SATURATED"]},"MuteHealthIssueRequest":{"type":"object","properties":{"targetType":{"$ref":"#/components/schemas/MuteTargetType"},"targetId":{"type":"string"},"energyControllerId":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/HealthIssueKind"},"note":{"type":"string"}},"required":["kind"]},"MuteTargetType":{"type":"string","enum":["CONTROLLER","METER"]},"RegisterScenarioRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"criterias":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioCriteriaRequest"}}},"required":["criterias","description","name"]},"OperationType":{"type":"string","enum":["CHARGE_FROM_SOLAR","CHARGE_FROM_GRID","DISCHARGE_TO_LOAD","DISCHARGE_TO_GRID"]},"SubmitRealtimeOperationRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"},"flow":{"type":"number","format":"double"},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"type":{"$ref":"#/components/schemas/OperationType"}},"required":["end","energyControllerId","energySystemId","flow","start","type"]},"RegisterGridSupplierRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1},"email":{"type":"string"},"phoneNumber":{"type":"string"},"website":{"type":"string","minLength":1},"region":{"type":"string","minLength":1},"country":{"type":"string","minLength":1}},"required":["country","name","region","website"]},"CreateGridRentalPriceRequest":{"type":"object","properties":{"gridSupplierId":{"type":"string","format":"uuid"},"customerType":{"$ref":"#/components/schemas/CustomerType"},"voltageLevel":{"$ref":"#/components/schemas/VoltageLevel"},"pricingModel":{"$ref":"#/components/schemas/PricingModelRequest"},"validFrom":{"type":"string","format":"date-time"},"validTo":{"type":"string","format":"date-time"},"includesVat":{"type":"boolean"},"additionalFees":{"type":"array","items":{"$ref":"#/components/schemas/AdditionalFeeRequest"}}},"required":["additionalFees","customerType","gridSupplierId","includesVat","pricingModel","validFrom","voltageLevel"]},"StartPrequalificationRequest":{"type":"object","properties":{"fcrProvidingEntityId":{"type":"string","format":"uuid"},"products":{"type":"array","items":{"$ref":"#/components/schemas/BalancingMarket"},"uniqueItems":true},"variant":{"$ref":"#/components/schemas/MarketVariant"},"isLer":{"type":"boolean"},"resourceIdentifier":{"type":"string"},"areaCode":{"type":"string"},"timezone":{"type":"string"}},"required":["areaCode","fcrProvidingEntityId","isLer","products","resourceIdentifier","timezone","variant"]},"RegisterEnergySystemRequest":{"type":"object","properties":{"name":{"type":"string"},"projectReference":{"type":"string"},"description":{"type":"string"},"area":{"$ref":"#/components/schemas/DeliveryArea"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"address":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"gridSupplierId":{"type":"string","format":"uuid"},"dischargeEffectivenessPercentage":{"type":"number","format":"double"},"ownerId":{"type":"string"},"norgesprisEnabled":{"type":"boolean"},"maxGridImportPower":{"type":"number","format":"double"},"maxGridExportPower":{"type":"number","format":"double"}},"required":["address","area","city","country","description","dischargeEffectivenessPercentage","gridSupplierId","latitude","longitude","name","norgesprisEnabled","ownerId","projectReference","state"]},"RenameEnergySystemRequest":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"RegisterEnergyControllerRequest":{"type":"object","properties":{"inverter":{"$ref":"#/components/schemas/InverterBrand"},"type":{"$ref":"#/components/schemas/InverterType"},"slaveIds":{"type":"array","items":{"type":"integer","format":"int32"},"uniqueItems":true},"maxBatteryCapacity":{"type":"number","format":"double"},"maxBatteryCharge":{"type":"number","format":"double"},"maxBatteryDischarge":{"type":"number","format":"double"},"maxProduction":{"type":"number","format":"double"},"minBatterySoC":{"type":"integer","format":"int32"},"maxBatterySoC":{"type":"integer","format":"int32"},"maxInverterAcOutputCurrentA":{"type":"number","format":"double"}},"required":["inverter","maxBatteryCapacity","maxBatteryCharge","maxBatteryDischarge","maxProduction","slaveIds","type"]},"ChangeOperationStrategyRequest":{"type":"object","properties":{"operationStrategy":{"$ref":"#/components/schemas/OperationStrategyType"}},"required":["operationStrategy"]},"OperationStrategyType":{"type":"string","enum":["LIVE","HYBRID","FSM"]},"TimePeriodRequest":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}},"required":["from","to"]},"InverterMeasurementResponse":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"inverterSerialNumber":{"type":"string"},"currentPower":{"type":"integer","format":"int32"},"powerSetpoint":{"type":"integer","format":"int32"},"currentSolarPower":{"type":"integer","format":"int32"},"currentBatteryPower":{"type":"integer","format":"int32"},"batteryStateOfCharge":{"type":"integer","format":"int32"},"batteryVoltage":{"type":"number","format":"double"},"batteryCurrent":{"type":"number","format":"double"},"gridVoltage":{"type":"number","format":"double"},"gridFrequency":{"type":"number","format":"double"},"gridCurrent":{"type":"number","format":"double"},"status":{"type":"integer","format":"int32"},"operatingStatus":{"type":"integer","format":"int32"},"faultCodes":{"type":"integer","format":"int32"},"bmsStatus":{"type":"integer","format":"int32"},"igbtTemperature":{"type":"integer","format":"int32"},"batteryTemperature":{"type":"integer","format":"int32"},"leakageCurrent":{"type":"number","format":"double"},"decodedFaultCodes":{"type":"array","items":{"type":"string"}},"severity":{"type":"string"}},"required":["timestamp"]},"ChangeControlModeRequest":{"type":"object","properties":{"controlMode":{"$ref":"#/components/schemas/ControlMode"}},"required":["controlMode"]},"ModbusCommandRequest":{"type":"object","properties":{"slaveId":{"type":"integer","format":"int32"},"functionCode":{"type":"integer","format":"int32"},"registerAddress":{"type":"integer","format":"int32"},"value":{},"quantity":{"type":"integer","format":"int32"}},"required":["functionCode","quantity","registerAddress","slaveId","value"]},"ModbusCommandsRequest":{"type":"object","properties":{"commands":{"type":"array","items":{"$ref":"#/components/schemas/ModbusCommandRequest"}}},"required":["commands"]},"ModbusCommandOutcome":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/ModbusCommandStatus"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ModbusCommandResult"}},"completedAt":{"type":"string","format":"date-time"}},"required":["requestId","results","status"]},"ModbusCommandResult":{"type":"object","properties":{"registerAddress":{"type":"integer","format":"int32"},"success":{"type":"boolean"},"values":{"type":"array","items":{"type":"integer","format":"int32"}},"value":{"type":"integer","format":"int32"},"error":{"type":"string"}},"required":["registerAddress","success"]},"ModbusCommandStatus":{"type":"string","enum":["PENDING","OK","ERROR"]},"GrantAccessToUserRequest":{"type":"object","properties":{"userId":{"type":"string"},"authority":{"$ref":"#/components/schemas/Authority"}},"required":["authority","userId"]},"AssignEnergyMeterToEnergySystemRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"}},"required":["energySystemId"]},"RegisterCredentialRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"systemName":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"description":{"type":"string"}},"required":["energySystemId","password","systemName","username"]},"StartCommissioningRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"}},"required":["energySystemId"]},"RegisterBalancingEntityRequest":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/EntityType"},"energySystemId":{"type":"string","format":"uuid"},"controllerIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true},"marketParticipations":{"type":"array","items":{"$ref":"#/components/schemas/MarketParticipationRequest"}},"isLer":{"type":"boolean"}},"required":["controllerIds","energySystemId","isLer","marketParticipations","type"]},"RegisterAssetReferenceRequest":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid","description":"Energy System ID"},"energyControllerId":{"type":"string","format":"uuid","description":"Energy Controller ID"}},"required":["energyControllerId","energySystemId"]},"TaskDetailsRequestParams":{"type":"object","properties":{"filter":{"$ref":"#/components/schemas/TaskFilter"},"pageNumber":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"sorting":{"$ref":"#/components/schemas/TaskSort"},"asc":{"type":"boolean"},"searchTermTaskName":{"type":"string"},"searchTermTaskInstance":{"type":"string"},"taskNameExactMatch":{"type":"boolean"},"taskInstanceExactMatch":{"type":"boolean"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"refresh":{"type":"boolean"},"taskId":{"type":"string"},"taskName":{"type":"string"}}},"TaskFilter":{"type":"string","enum":["ALL","FAILED","RUNNING","SCHEDULED","SUCCEEDED"]},"TaskSort":{"type":"string","enum":["DEFAULT","NAME"]},"PollResponse":{"type":"object","properties":{"newFailures":{"type":"integer","format":"int32"},"newRunning":{"type":"integer","format":"int32"},"newTasks":{"type":"integer","format":"int32"},"stoppedFailing":{"type":"integer","format":"int32"},"finishedRunning":{"type":"integer","format":"int32"}}},"GetTasksResponse":{"type":"object","properties":{"numberOfItems":{"type":"integer","format":"int32"},"items":{"type":"array","items":{"$ref":"#/components/schemas/TaskModel"}},"pageSize":{"type":"integer","format":"int32","writeOnly":true},"numberOfPages":{"type":"integer","format":"int32"}}},"TaskModel":{"type":"object","properties":{"taskName":{"type":"string"},"taskInstance":{"type":"array","items":{"type":"string"}},"taskData":{"type":"array","items":{}},"executionTime":{"type":"array","items":{"type":"string","format":"date-time"}},"picked":{"type":"array","items":{"type":"boolean"}},"pickedBy":{"type":"array","items":{"type":"string"}},"lastSuccess":{"type":"array","items":{"type":"string","format":"date-time"}},"lastFailure":{"type":"string","format":"date-time"},"consecutiveFailures":{"type":"array","items":{"type":"integer","format":"int32"}},"lastHeartbeat":{"type":"string","format":"date-time"},"version":{"type":"integer","format":"int32"}}},"TaskRequestParams":{"type":"object","properties":{"filter":{"$ref":"#/components/schemas/TaskFilter"},"pageNumber":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"sorting":{"$ref":"#/components/schemas/TaskSort"},"asc":{"type":"boolean"},"searchTermTaskName":{"type":"string"},"searchTermTaskInstance":{"type":"string"},"taskNameExactMatch":{"type":"boolean"},"taskInstanceExactMatch":{"type":"boolean"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"refresh":{"type":"boolean"}}},"LogPollResponse":{"type":"object","properties":{"newFailures":{"type":"integer","format":"int32"},"newSucceeded":{"type":"integer","format":"int32"}}},"GetLogsResponse":{"type":"object","properties":{"numberOfItems":{"type":"integer","format":"int32"},"items":{"type":"array","items":{"$ref":"#/components/schemas/LogModel"}},"pageSize":{"type":"integer","format":"int32","writeOnly":true},"numberOfPages":{"type":"integer","format":"int32"}}},"LogModel":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"taskName":{"type":"string"},"taskInstance":{"type":"string"},"taskData":{},"timeStarted":{"type":"string","format":"date-time"},"timeFinished":{"type":"string","format":"date-time"},"succeeded":{"type":"boolean"},"durationMs":{"type":"integer","format":"int64"},"exceptionClass":{"type":"string"},"exceptionMessage":{"type":"string"},"exceptionStackTrace":{"type":"string"}}},"ConfigResponse":{"type":"object","properties":{"showHistory":{"type":"boolean"},"readOnly":{"type":"boolean"}}},"HourlyWeatherResponse":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"temperature":{"type":"number","format":"double"},"windSpeed":{"type":"number","format":"double"},"windDirection":{"type":"number","format":"double"},"cloudAreaFraction":{"type":"number","format":"double"}},"required":["cloudAreaFraction","endTime","startTime","temperature","windDirection","windSpeed"]},"WeatherForecastResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"indication":{"$ref":"#/components/schemas/WeatherIndication"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"hourlyWeather":{"type":"array","items":{"$ref":"#/components/schemas/HourlyWeatherResponse"}},"date":{"type":"string","format":"date"},"fetchedAt":{"type":"string","format":"date-time"}},"required":["date","fetchedAt","hourlyWeather","id","indication","latitude","longitude"]},"WeatherForecastsResponse":{"type":"object","properties":{"weatherForecasts":{"type":"array","items":{"$ref":"#/components/schemas/WeatherForecastResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["totalCount","weatherForecasts"]},"WeatherIndication":{"type":"string","enum":["CLEARSKY_DAY","CLEARSKY_NIGHT","CLEARSKY_POLARTWILIGHT","FAIR_DAY","FAIR_NIGHT","FAIR_POLARTWILIGHT","PARTLYCLOUDY_DAY","PARTLYCLOUDY_NIGHT","PARTLYCLOUDY_POLARTWILIGHT","CLOUDY","FOG","LIGHTRAIN","RAIN","HEAVYRAIN","LIGHTRAINANDTHUNDER","RAINANDTHUNDER","HEAVYRAINANDTHUNDER","LIGHTRAINSHOWERS_DAY","LIGHTRAINSHOWERS_NIGHT","LIGHTRAINSHOWERS_POLARTWILIGHT","RAINSHOWERS_DAY","RAINSHOWERS_NIGHT","RAINSHOWERS_POLARTWILIGHT","HEAVYRAINSHOWERS_DAY","HEAVYRAINSHOWERS_NIGHT","HEAVYRAINSHOWERS_POLARTWILIGHT","LIGHTRAINSHOWERSANDTHUNDER_DAY","LIGHTRAINSHOWERSANDTHUNDER_NIGHT","LIGHTRAINSHOWERSANDTHUNDER_POLARTWILIGHT","RAINSHOWERSANDTHUNDER_DAY","RAINSHOWERSANDTHUNDER_NIGHT","RAINSHOWERSANDTHUNDER_POLARTWILIGHT","HEAVYRAINSHOWERSANDTHUNDER_DAY","HEAVYRAINSHOWERSANDTHUNDER_NIGHT","HEAVYRAINSHOWERSANDTHUNDER_POLARTWILIGHT","LIGHTSLEET","SLEET","HEAVYSLEET","LIGHTSLEETANDTHUNDER","SLEETANDTHUNDER","HEAVYSLEETANDTHUNDER","LIGHTSLEETSHOWERS_DAY","LIGHTSLEETSHOWERS_NIGHT","LIGHTSLEETSHOWERS_POLARTWILIGHT","SLEETSHOWERS_DAY","SLEETSHOWERS_NIGHT","SLEETSHOWERS_POLARTWILIGHT","HEAVYSLEETSHOWERS_DAY","HEAVYSLEETSHOWERS_NIGHT","HEAVYSLEETSHOWERS_POLARTWILIGHT","LIGHTSSLEETSHOWERSANDTHUNDER_DAY","LIGHTSSLEETSHOWERSANDTHUNDER_NIGHT","LIGHTSSLEETSHOWERSANDTHUNDER_POLARTWILIGHT","SLEETSHOWERSANDTHUNDER_DAY","SLEETSHOWERSANDTHUNDER_NIGHT","SLEETSHOWERSANDTHUNDER_POLARTWILIGHT","HEAVYSLEETSHOWERSANDTHUNDER_DAY","HEAVYSLEETSHOWERSANDTHUNDER_NIGHT","HEAVYSLEETSHOWERSANDTHUNDER_POLARTWILIGHT","LIGHTSNOW","SNOW","HEAVYSNOW","LIGHTSNOWANDTHUNDER","SNOWANDTHUNDER","HEAVYSNOWANDTHUNDER","LIGHTSNOWSHOWERS_DAY","LIGHTSNOWSHOWERS_NIGHT","LIGHTSNOWSHOWERS_POLARTWILIGHT","SNOWSHOWERS_DAY","SNOWSHOWERS_NIGHT","SNOWSHOWERS_POLARTWILIGHT","HEAVYSNOWSHOWERS_DAY","HEAVYSNOWSHOWERS_NIGHT","HEAVYSNOWSHOWERS_POLARTWILIGHT","LIGHTSSNOWSHOWERSANDTHUNDER_DAY","LIGHTSSNOWSHOWERSANDTHUNDER_NIGHT","LIGHTSSNOWSHOWERSANDTHUNDER_POLARTWILIGHT","SNOWSHOWERSANDTHUNDER_DAY","SNOWSHOWERSANDTHUNDER_NIGHT","SNOWSHOWERSANDTHUNDER_POLARTWILIGHT","HEAVYSNOWSHOWERSANDTHUNDER_DAY","HEAVYSNOWSHOWERSANDTHUNDER_NIGHT","HEAVYSNOWSHOWERSANDTHUNDER_POLARTWILIGHT"]},"EnergySystemPermissionResponse":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"energySystemName":{"type":"string"},"userId":{"type":"string"},"userFullName":{"type":"string"},"userEmail":{"type":"string"},"authority":{"$ref":"#/components/schemas/Authority"},"grantedAt":{"type":"string","format":"date-time"}},"required":["authority","energySystemId","energySystemName","grantedAt","userEmail","userFullName","userId"]},"EnergySystemPermissionsResponse":{"type":"object","properties":{"permissions":{"type":"array","items":{"$ref":"#/components/schemas/EnergySystemPermissionResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["permissions","totalCount"]},"CriterionResult":{"type":"object","properties":{"criterion":{"$ref":"#/components/schemas/EvaluationCriterion"},"measuredValue":{"type":"number","format":"double"},"passed":{"type":"boolean"},"details":{"type":"string"}},"required":["criterion","details","measuredValue","passed"]},"ReadingsWindow":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"}},"required":["endTime","startTime"]},"TestResult":{"type":"string","enum":["PASS","FAIL","INCONCLUSIVE"]},"TestRun":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"testDefinitionId":{"type":"string","format":"uuid"},"testGroupRunId":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"},"energyMeterId":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/TestRunStatus"},"currentStepIndex":{"type":"integer","format":"int32"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"startedBy":{"type":"string"},"result":{"$ref":"#/components/schemas/TestResult"},"stepResults":{"type":"array","items":{"$ref":"#/components/schemas/TestStepResult"}}},"required":["energyControllerId","id","startedBy","status","stepResults","testDefinitionId"]},"TestRunStatus":{"type":"string","enum":["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED"]},"TestStepResult":{"type":"object","properties":{"stepIndex":{"type":"integer","format":"int32"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"commandSentAt":{"type":"string","format":"date-time"},"readings":{"$ref":"#/components/schemas/ReadingsWindow"},"evaluationResults":{"type":"array","items":{"$ref":"#/components/schemas/CriterionResult"}},"result":{"$ref":"#/components/schemas/TestResult"}},"required":["commandSentAt","completedAt","evaluationResults","readings","result","startedAt","stepIndex"]},"InverterFaultSeverity":{"type":"string","enum":["NONE","INFO","WARNING","ERROR","CRITICAL"]},"InverterMeasurement":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"inverterSerialNumber":{"type":"string"},"currentSolarPower":{"type":"integer","format":"int32"},"currentPower":{"type":"integer","format":"int32"},"powerSetpoint":{"type":"integer","format":"int32"},"batteryStateOfCharge":{"type":"integer","format":"int32"},"batteryVoltage":{"type":"number","format":"double"},"batteryCurrent":{"type":"number","format":"double"},"currentBatteryPower":{"type":"integer","format":"int32"},"gridVoltage":{"type":"number","format":"double"},"gridFrequency":{"type":"number","format":"double"},"gridCurrent":{"type":"number","format":"double"},"status":{"type":"integer","format":"int32"},"operatingStatus":{"type":"integer","format":"int32"},"faultCodes":{"type":"integer","format":"int32"},"bmsStatus":{"type":"integer","format":"int32"},"igbtTemperature":{"type":"integer","format":"int32"},"batteryTemperature":{"type":"integer","format":"int32"},"leakageCurrent":{"type":"number","format":"double"},"decodedFaultCodes":{"type":"array","items":{"type":"string"}},"severity":{"$ref":"#/components/schemas/InverterFaultSeverity"}},"required":["timestamp"]},"TestGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"testDefinitionIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["description","id","name","testDefinitionIds"]},"TestDefinition":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"category":{"$ref":"#/components/schemas/TestCategory"},"samplingRate":{"type":"integer","format":"int32"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/TestStepDefinition"}},"evaluationCriteria":{"type":"array","items":{"$ref":"#/components/schemas/EvaluationCriterion"}}},"required":["category","description","evaluationCriteria","id","name","samplingRate","steps"]},"SupportTicketResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"customerId":{"type":"string"},"customerEmail":{"type":"string"},"customerName":{"type":"string"},"assignedAgentId":{"type":"string"},"subject":{"type":"string"},"category":{"$ref":"#/components/schemas/SupportTicketCategory"},"status":{"$ref":"#/components/schemas/SupportTicketStatus"},"priority":{"$ref":"#/components/schemas/SupportTicketPriority"},"energySystemId":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"resolvedAt":{"type":"string","format":"date-time"},"closedAt":{"type":"string","format":"date-time"}},"required":["category","createdAt","customerEmail","customerId","customerName","id","priority","status","subject","updatedAt"]},"SupportTicketsResponse":{"type":"object","properties":{"tickets":{"type":"array","items":{"$ref":"#/components/schemas/SupportTicketResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["tickets","totalCount"]},"SupportMessageResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"ticketId":{"type":"string","format":"uuid"},"type":{"$ref":"#/components/schemas/SupportMessageType"},"content":{"type":"string"},"attachmentUrls":{"type":"array","items":{"type":"string"}},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["attachmentUrls","content","createdAt","createdBy","id","ticketId","type"]},"SupportMessageType":{"type":"string","enum":["CUSTOMER","AGENT","SYSTEM"]},"SupportMessagesResponse":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/SupportMessageResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["messages","totalCount"]},"SolarPanelResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"energySystemId":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"},"peakPower":{"type":"number","format":"double"},"azimuth":{"type":"number","format":"double"},"tilt":{"type":"number","format":"double"},"installDate":{"type":"string","format":"date-time"}},"required":["azimuth","energySystemId","id","installDate","peakPower","tilt"]},"ControllerHealth":{"type":"object","properties":{"energyControllerId":{"type":"string","format":"uuid"},"inverterBrand":{"type":"string"},"inverterType":{"type":"string"},"pvOnly":{"type":"boolean"},"controlMode":{"type":"string"},"readOnly":{"type":"boolean"},"status":{"$ref":"#/components/schemas/HealthStatus"},"isOperational":{"type":"boolean"},"lastHeartbeatAt":{"type":"string","format":"date-time"},"measurementAt":{"type":"string","format":"date-time"},"batteryStateOfCharge":{"type":"integer","format":"int32"},"socLimitMin":{"type":"integer","format":"int32"},"lastFullChargeAt":{"type":"string","format":"date-time"},"batteryTemperature":{"type":"integer","format":"int32"},"inverterTemperature":{"type":"integer","format":"int32"},"setpointMismatchPercent":{"type":"number","format":"double"},"diskFreePercent":{"type":"number","format":"double"},"diskFreeBytes":{"type":"integer","format":"int64"},"diskTotalBytes":{"type":"integer","format":"int64"},"cpuLoadPercent":{"type":"number","format":"double"},"systemMetricsAt":{"type":"string","format":"date-time"},"faultSeverity":{"type":"string"},"faultCodes":{"type":"array","items":{"type":"string"}},"issues":{"type":"array","items":{"$ref":"#/components/schemas/HealthIssue"}},"mutedIssues":{"type":"array","items":{"$ref":"#/components/schemas/MutedHealthIssueView"}}},"required":["controlMode","energyControllerId","faultCodes","inverterBrand","inverterType","isOperational","issues","mutedIssues","pvOnly","readOnly","status"]},"HealthIssue":{"type":"object","properties":{"kind":{"$ref":"#/components/schemas/HealthIssueKind"},"severity":{"$ref":"#/components/schemas/HealthStatus"},"message":{"type":"string"},"label":{"type":"string"}},"required":["kind","message","severity"]},"HealthStatus":{"type":"string","enum":["OK","WARNING","CRITICAL","OFFLINE"]},"MeterHealth":{"type":"object","properties":{"measurementPointId":{"type":"string"},"type":{"type":"string"},"isMaster":{"type":"boolean"},"status":{"type":"string"},"healthStatus":{"$ref":"#/components/schemas/HealthStatus"},"description":{"type":"string"},"issues":{"type":"array","items":{"$ref":"#/components/schemas/HealthIssue"}},"mutedIssues":{"type":"array","items":{"$ref":"#/components/schemas/MutedHealthIssueView"}}},"required":["healthStatus","isMaster","issues","measurementPointId","mutedIssues","status","type"]},"MutedHealthIssueView":{"type":"object","properties":{"muteId":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/HealthIssueKind"},"severity":{"$ref":"#/components/schemas/HealthStatus"},"message":{"type":"string"},"mutedBy":{"type":"string"},"mutedAt":{"type":"string","format":"date-time"}},"required":["kind","muteId","mutedAt","mutedBy"]},"SiteHealth":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"energySystemName":{"type":"string"},"area":{"type":"string"},"status":{"$ref":"#/components/schemas/HealthStatus"},"controllers":{"type":"array","items":{"$ref":"#/components/schemas/ControllerHealth"}},"meters":{"type":"array","items":{"$ref":"#/components/schemas/MeterHealth"}}},"required":["area","controllers","energySystemId","energySystemName","meters","status"]},"SiteHealthResponse":{"type":"object","properties":{"generatedAt":{"type":"string","format":"date-time"},"summary":{"$ref":"#/components/schemas/SiteHealthSummary"},"sites":{"type":"array","items":{"$ref":"#/components/schemas/SiteHealth"}}},"required":["generatedAt","sites","summary"]},"SiteHealthSummary":{"type":"object","properties":{"totalSites":{"type":"integer","format":"int32"},"ok":{"type":"integer","format":"int32"},"warning":{"type":"integer","format":"int32"},"critical":{"type":"integer","format":"int32"},"offline":{"type":"integer","format":"int32"},"totalControllers":{"type":"integer","format":"int32"},"pvOnlyControllers":{"type":"integer","format":"int32"},"totalMeters":{"type":"integer","format":"int32"}},"required":["critical","offline","ok","pvOnlyControllers","totalControllers","totalMeters","totalSites","warning"]},"ScenarioCriteriaResponse":{"type":"object","properties":{"priority":{"type":"integer","format":"int32"},"description":{"type":"string"}},"required":["description","priority"]},"ScenarioResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"criterias":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioCriteriaResponse"}}},"required":["criterias","description","id","name"]},"ScenariosResponse":{"type":"object","properties":{"scenarios":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioResponse"}}},"required":["scenarios"]},"OperationRationale":{"type":"object","discriminator":{"propertyName":"kind","mapping":{"hybrid":"#/components/schemas/HybridRationale","mpc":"#/components/schemas/MpcRationale","live":"#/components/schemas/LiveRationale","fsm":"#/components/schemas/FsmRationale"}},"oneOf":[{"$ref":"#/components/schemas/HybridRationale"},{"$ref":"#/components/schemas/MpcRationale"},{"$ref":"#/components/schemas/LiveRationale"},{"$ref":"#/components/schemas/FsmRationale"}],"properties":{"kind":{"type":"string"}},"required":["kind"]},"RealtimeOperation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"},"validFrom":{"type":"string","format":"date-time"},"validTo":{"type":"string","format":"date-time"},"type":{"$ref":"#/components/schemas/OperationType"},"value":{"type":"number","format":"double"},"expectedEnergyKWh":{"type":"number","format":"double"},"expectedRevenueNok":{"type":"number","format":"double"},"expectedCostNok":{"type":"number","format":"double"},"expectedProfitNok":{"type":"number","format":"double"},"reason":{"type":"string","description":"Human-readable decision summary (back-compat; equals the structured rationale's prose)."},"algorithm":{"type":"string","description":"Algorithm discriminator for the structured rationale. hybrid | live (mpc appears only nested; fsm reserved)."},"rationale":{"$ref":"#/components/schemas/OperationRationale","description":"Structured decision rationale (ENF-535). Discriminated on `kind`; unknown discriminators fall back to `reason`."}},"required":["energyControllerId","id","type","validFrom","validTo","value"]},"RealtimeOperationsResponse":{"type":"object","properties":{"operations":{"type":"array","items":{"$ref":"#/components/schemas/RealtimeOperation"}}},"required":["operations"]},"UserProfileResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"firstName":{"type":"string"},"lastName":{"type":"string"},"avatarUrl":{"type":"string"},"phoneNumber":{"type":"string"},"street":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"postalCode":{"type":"string"}},"required":["firstName","id","lastName"]},"UserProfilesResponse":{"type":"object","properties":{"userProfiles":{"type":"array","items":{"$ref":"#/components/schemas/UserProfileResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["totalCount","userProfiles"]},"GridSupplierResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string"},"phoneNumber":{"type":"string"},"website":{"type":"string"},"region":{"type":"string"},"country":{"type":"string"}},"required":["country","id","name","region","website"]},"GridSuppliersResponse":{"type":"object","properties":{"gridSuppliers":{"type":"array","items":{"$ref":"#/components/schemas/GridSupplierResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["gridSuppliers","totalCount"]},"AssociatedEnergySystemResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]},"GridSupplierDetailsResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string"},"phoneNumber":{"type":"string"},"website":{"type":"string"},"region":{"type":"string"},"country":{"type":"string"},"associatedEnergySystems":{"type":"array","items":{"$ref":"#/components/schemas/AssociatedEnergySystemResponse"}}},"required":["associatedEnergySystems","country","id","name","region","website"]},"AdditionalFeeResponse":{"type":"object","properties":{"name":{"type":"string"},"amount":{"type":"number","format":"double"},"type":{"type":"string"},"description":{"type":"string"}},"required":["amount","name","type"]},"GridRentalPriceResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"gridSupplierId":{"type":"string","format":"uuid"},"customerType":{"$ref":"#/components/schemas/CustomerType"},"voltageLevel":{"$ref":"#/components/schemas/VoltageLevel"},"pricingModel":{"$ref":"#/components/schemas/PricingModelResponse"},"validFrom":{"type":"string","format":"date-time"},"validTo":{"type":"string","format":"date-time"},"includesVat":{"type":"boolean"},"additionalFees":{"type":"array","items":{"$ref":"#/components/schemas/AdditionalFeeResponse"}}},"required":["additionalFees","customerType","gridSupplierId","id","includesVat","pricingModel","validFrom","voltageLevel"]},"PricingModelResponse":{"type":"object","properties":{"type":{"type":"string"}},"required":["type"]},"GridRentalPricesResponse":{"type":"object","properties":{"gridRentalPrices":{"type":"array","items":{"$ref":"#/components/schemas/GridRentalPriceResponse"}}},"required":["gridRentalPrices"]},"PrequalificationSessionResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"entityId":{"type":"string","format":"uuid"},"products":{"type":"array","items":{"$ref":"#/components/schemas/BalancingMarket"},"uniqueItems":true},"variant":{"$ref":"#/components/schemas/MarketVariant"},"isLer":{"type":"boolean"},"status":{"$ref":"#/components/schemas/PrequalificationStatus"},"testRunCount":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"}},"required":["createdAt","entityId","id","isLer","products","status","testRunCount","variant"]},"PrequalificationStatus":{"type":"string","enum":["PLANNING","IN_PROGRESS","COMPLETED","PASSED","FAILED","CANCELLED"]},"EnergySystemOperator":{"type":"string","enum":["ENFY","HAFSLUND"]},"EnergySystemResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"operator":{"$ref":"#/components/schemas/EnergySystemOperator"},"projectReference":{"type":"string"},"energyMeterMeasurementId":{"type":"string"},"description":{"type":"string"},"area":{"$ref":"#/components/schemas/DeliveryArea"},"status":{"$ref":"#/components/schemas/Status"},"norgesprisEnabled":{"type":"boolean"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"address":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"gridSupplierId":{"type":"string","format":"uuid"},"gridSupplierName":{"type":"string"},"dischargeEffectivenessPercentage":{"type":"number","format":"double"},"maxGridImportPower":{"type":"number","format":"double"},"maxGridExportPower":{"type":"number","format":"double"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["address","area","city","country","createdAt","description","dischargeEffectivenessPercentage","gridSupplierId","gridSupplierName","id","latitude","longitude","name","norgesprisEnabled","operator","projectReference","state","status","updatedAt"]},"EnergySystemsResponse":{"type":"object","properties":{"energySystems":{"type":"array","items":{"$ref":"#/components/schemas/EnergySystemResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["energySystems","totalCount"]},"Status":{"type":"string","enum":["INACTIVE","ACTIVE"]},"EnergyMeterResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"measurementPointId":{"type":"string"},"energySystemId":{"type":"string","format":"uuid"},"type":{"$ref":"#/components/schemas/EnergyMeterType"},"isMaster":{"type":"boolean"},"powerFactor":{"type":"number","format":"double"},"description":{"type":"string"},"status":{"$ref":"#/components/schemas/EnergyMeterStatus"},"meterRole":{"$ref":"#/components/schemas/EnergyMeterRole"},"shadowOfMeterId":{"type":"string","format":"uuid"},"exportCapable":{"type":"boolean"}},"required":["exportCapable","id","isMaster","measurementPointId","meterRole","powerFactor","status","type"]},"EnergyMeterStatus":{"type":"string","enum":["ACTIVE","INACTIVE","ERROR","PENDING","UNKNOWN"]},"EnergySystemDetailResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"operator":{"$ref":"#/components/schemas/EnergySystemOperator"},"projectReference":{"type":"string"},"description":{"type":"string"},"area":{"$ref":"#/components/schemas/DeliveryArea"},"status":{"$ref":"#/components/schemas/Status"},"norgesprisEnabled":{"type":"boolean"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"address":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"gridSupplierId":{"type":"string","format":"uuid"},"dischargeEffectivenessPercentage":{"type":"number","format":"double"},"maxGridImportPower":{"type":"number","format":"double"},"maxGridExportPower":{"type":"number","format":"double"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"owner":{"$ref":"#/components/schemas/EnergySystemOwnerDetailResponse"},"gridSupplier":{"$ref":"#/components/schemas/EnergySystemGridSupplierResponse"},"users":{"type":"array","items":{"$ref":"#/components/schemas/EnergySystemUserPermissionResponse"}},"energyMeters":{"type":"array","items":{"$ref":"#/components/schemas/EnergyMeterResponse"}}},"required":["address","area","city","country","createdAt","description","dischargeEffectivenessPercentage","gridSupplier","gridSupplierId","id","latitude","longitude","name","norgesprisEnabled","operator","projectReference","state","status","updatedAt"]},"EnergySystemGridSupplierResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]},"EnergySystemOwnerDetailResponse":{"type":"object","properties":{"id":{"type":"string"},"fullName":{"type":"string"},"email":{"type":"string"}},"required":["email","fullName","id"]},"EnergySystemUserPermissionResponse":{"type":"object","properties":{"id":{"type":"string"},"fullName":{"type":"string"},"email":{"type":"string"},"authority":{"$ref":"#/components/schemas/Authority"}},"required":["authority","email","fullName","id"]},"ProductionReading":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"energyKwh":{"type":"number","format":"double"}},"required":["endTime","energyKwh","startTime"]},"ProductionResponse":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"resolution":{"type":"string"},"readings":{"type":"array","items":{"$ref":"#/components/schemas/ProductionReading"}}},"required":["energySystemId","readings","resolution"]},"OperationPlanDetailResponse":{"type":"object","description":"The forward dispatch plan for an energy system: what the battery is planned to do from the current hour through the planning horizon (ENF-533)","properties":{"energySystemId":{"type":"string","format":"uuid"},"generatedAt":{"type":"string","format":"date-time","description":"When the most recent plan in this window was computed (its freshness); null if there is no plan"},"validFrom":{"type":"string","format":"date-time","description":"Start of the covered window (earliest planned operation, or the requested `from`)"},"validTo":{"type":"string","format":"date-time","description":"End of the covered window (latest planned operation)"},"operations":{"type":"array","description":"Planned per-hour operations across the system's controllers, ordered by valid_from","items":{"$ref":"#/components/schemas/OperationResponse"}}},"required":["energySystemId","operations","validFrom","validTo"]},"OperationResponse":{"type":"object","description":"One planned (forward-looking) battery operation for a single hour and controller","properties":{"energyControllerId":{"type":"string","format":"uuid"},"validFrom":{"type":"string","format":"date-time"},"validTo":{"type":"string","format":"date-time"},"type":{"$ref":"#/components/schemas/OperationType","description":"Charge/discharge direction; future hours classify by flow sign (charge->grid, discharge->load)"},"value":{"type":"number","format":"double","description":"Planned signed battery power in watts (+ charge / - discharge)"},"expectedEnergyKwh":{"type":"number","format":"double","description":"Planned energy moved this hour (kWh) = |value| x hour-duration / 1000"},"targetSocPercent":{"type":"number","format":"double","description":"Planned battery state-of-charge (%) at the end of this hour — the planned SoC line"},"algorithm":{"type":"string","description":"Algorithm discriminator for the structured rationale; always `mpc` for a planned hour (ENF-536)."},"rationale":{"$ref":"#/components/schemas/OperationRationale","description":"Slim per-hour structured rationale (ENF-536), mirroring RealtimeOperation so future-hour tooltips render the same labels."}},"required":["energyControllerId","type","validFrom","validTo","value"]},"CustomerHealthIssue":{"type":"object","properties":{"topic":{"$ref":"#/components/schemas/CustomerHealthTopic"},"severity":{"$ref":"#/components/schemas/HealthStatus"},"label":{"type":"string"},"since":{"type":"string","format":"date-time"}},"required":["label","severity","topic"]},"CustomerHealthTopic":{"type":"string","enum":["NOT_RECEIVING_DATA","TELEMETRY_UNRELIABLE","SYSTEM_FAULT","BATTERY_UNRESPONSIVE","EQUIPMENT_WARM","METER_NO_READINGS"]},"CustomerSystemHealthResponse":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/HealthStatus"},"issues":{"type":"array","items":{"$ref":"#/components/schemas/CustomerHealthIssue"}},"generatedAt":{"type":"string","format":"date-time"}},"required":["generatedAt","issues","status"]},"EnergyControllerOperator":{"type":"string","enum":["ENFY","SOLIS"]},"EnergyControllerResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"energySystemId":{"type":"string","format":"uuid"},"externalReferenceId":{"type":"string"},"operator":{"$ref":"#/components/schemas/EnergyControllerOperator"},"inverter":{"$ref":"#/components/schemas/InverterBrand"},"type":{"$ref":"#/components/schemas/InverterType"},"controlMode":{"$ref":"#/components/schemas/ControlMode"},"operationStrategy":{"$ref":"#/components/schemas/OperationStrategyType"},"updateStrategy":{"$ref":"#/components/schemas/UpdateStrategy"},"slaveIds":{"type":"array","items":{"type":"integer","format":"int32"},"uniqueItems":true},"maxBatteryCapacity":{"type":"number","format":"double"},"maxBatteryChargePower":{"type":"number","format":"double"},"maxBatteryDischargePower":{"type":"number","format":"double"},"minBatterySoC":{"type":"integer","format":"int32"},"maxBatterySoC":{"type":"integer","format":"int32"},"maxProductionPower":{"type":"number","format":"double"},"maxInverterAcOutputCurrentA":{"type":"number","format":"double"},"readOnly":{"type":"boolean"},"isOperational":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"lastHeartbeatAt":{"type":"string","format":"date-time"}},"required":["controlMode","createdAt","energySystemId","id","inverter","isOperational","maxBatteryCapacity","maxBatteryChargePower","maxBatteryDischargePower","maxBatterySoC","maxProductionPower","minBatterySoC","operationStrategy","operator","readOnly","slaveIds","type","updateStrategy"]},"UpdateStrategy":{"type":"string","enum":["PULL","PUSH"]},"PowerThresholdWithTimePeriodRequest":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"powerThreshold":{"type":"number","format":"double"}},"required":["from","powerThreshold","to"]},"BatteryStateOfChargeRangeWithTimePeriodRequest":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"minStateOfCharge":{"type":"integer","format":"int32"},"maxStateOfCharge":{"type":"integer","format":"int32"}},"required":["from","maxStateOfCharge","minStateOfCharge","to"]},"CapacityTierResponse":{"type":"object","properties":{"energySystemId":{"type":"string","format":"uuid"},"hasCapacityTariff":{"type":"boolean"},"totalSteps":{"type":"integer","format":"int32"},"currentPeakKw":{"type":"number","format":"double"},"billingPeriodStart":{"type":"string","format":"date-time"},"billingPeriodEnd":{"type":"string","format":"date-time"},"peakRecordedAt":{"type":"string","format":"date-time"},"currentStep":{"$ref":"#/components/schemas/CapacityTierStep"},"nextStepThresholdKw":{"type":"number","format":"double"},"peakBasis":{"$ref":"#/components/schemas/PeakBasis"}},"required":["energySystemId","hasCapacityTariff","totalSteps"]},"CapacityTierStep":{"type":"object","properties":{"stepNumber":{"type":"integer","format":"int32"},"fromKw":{"type":"number","format":"double"},"toKw":{"type":"number","format":"double"},"monthlyFeeNok":{"type":"number","format":"double"}},"required":["fromKw","monthlyFeeNok","stepNumber"]},"PeakBasis":{"type":"string","enum":["TOP_N_DAILY_AVG","SINGLE_MAX_HOUR"]},"ConfidenceIntervalResponse":{"type":"object","description":"Confidence interval for a prediction point","properties":{"lowerBound":{"type":"number","format":"double","description":"Lower bound (0..1)"},"upperBound":{"type":"number","format":"double","description":"Upper bound (0..1)"}},"required":["lowerBound","upperBound"]},"PredictionPointResponse":{"type":"object","description":"Prediction data point","properties":{"timestamp":{"type":"string","format":"date-time","description":"Timestamp of the prediction point (start of 15-min interval)"},"hour":{"type":"integer","format":"int32","description":"Hour of day (0-23)"},"value":{"type":"number","format":"double","description":"Predicted power (W)"},"confidenceInterval":{"$ref":"#/components/schemas/ConfidenceIntervalResponse"}},"required":["confidenceInterval","hour","timestamp","value"]},"ProductionPredictionsResponse":{"type":"object","description":"Production prediction response","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PredictionPointResponse"}}},"required":["items"]},"ConsumptionPredictionsResponse":{"type":"object","description":"Consumption prediction response","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PredictionPointResponse"}}},"required":["items"]},"GridSignalResponse":{"type":"object","properties":{"time":{"type":"string","format":"date-time"},"gridPowerW":{"type":"number","format":"double"},"metersExpected":{"type":"integer","format":"int32"},"metersPresent":{"type":"integer","format":"int32"},"staleMeterIds":{"type":"array","items":{"type":"string"}},"degraded":{"type":"boolean"},"exportBlind":{"type":"boolean"},"primaryMemberTime":{"type":"string","format":"date-time"}},"required":["degraded","exportBlind","gridPowerW","metersExpected","metersPresent","staleMeterIds","time"]},"GridSignalTimeseriesResponse":{"type":"object","properties":{"energySystemId":{"type":"string"},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"signals":{"type":"array","items":{"$ref":"#/components/schemas/GridSignalResponse"}}},"required":["end","energySystemId","signals","start"]},"DailyDriftResponse":{"type":"object","description":"Mean absolute forecast error for one UTC day","properties":{"date":{"type":"string","format":"date","description":"The UTC day"},"pvForecastErrorKWh":{"type":"number","format":"double","description":"Mean |forecast - realized| PV energy over covered hours (kWh); null if no covered hours"},"loadForecastErrorKWh":{"type":"number","format":"double","description":"Mean |forecast - realized| customer load over covered hours (kWh); null if no covered hours"},"pvHoursCovered":{"type":"integer","format":"int32","description":"Hours where both PV forecast and realized PV were present"},"loadHoursCovered":{"type":"integer","format":"int32","description":"Hours where both load forecast and realized load were present"},"suspectClampedHours":{"type":"integer","format":"int32","description":"Hours where the load forecast was ~0 while realized load was material and the inverter was active (ENF-522 signature)"}},"required":["date","loadHoursCovered","pvHoursCovered","suspectClampedHours"]},"ForecastDriftResponse":{"type":"object","description":"Per-day forecast-vs-realized drift for an energy system (UTC days; the current UTC day is excluded)","properties":{"energySystemId":{"type":"string","format":"uuid"},"asOf":{"type":"string","format":"date-time","description":"Forecast generation compared; null = latest generation per delivery point (closest-to-delivery)"},"days":{"type":"integer","format":"int32","description":"Number of complete UTC days returned"},"items":{"type":"array","description":"One entry per UTC day, newest first","items":{"$ref":"#/components/schemas/DailyDriftResponse"}}},"required":["days","energySystemId","items"]},"HourlyDriftPointResponse":{"type":"object","description":"Forecast and realized energy for one UTC hour (kWh)","properties":{"hour":{"type":"integer","format":"int32","description":"Hour of day in UTC (0-23)"},"hourStart":{"type":"string","format":"date-time","description":"Start of the UTC hour"},"pvForecastKWh":{"type":"number","format":"double"},"pvRealizedKWh":{"type":"number","format":"double"},"loadForecastKWh":{"type":"number","format":"double"},"loadRealizedKWh":{"type":"number","format":"double"},"inverterActive":{"type":"boolean","description":"Whether any controller was non-trivially active in the hour"},"suspectClampedLoad":{"type":"boolean","description":"Load forecast ~0 while realized load was material and the inverter was active (ENF-522 signature)"}},"required":["hour","hourStart","inverterActive","suspectClampedLoad"]},"HourlyForecastVsRealizedResponse":{"type":"object","description":"Per-UTC-hour forecast-vs-realized drill-down for one day","properties":{"energySystemId":{"type":"string","format":"uuid"},"date":{"type":"string","format":"date","description":"The UTC day"},"asOf":{"type":"string","format":"date-time","description":"Forecast generation compared; null = latest generation per delivery point (closest-to-delivery)"},"items":{"type":"array","description":"All 24 UTC hours; either side may be null where data is missing","items":{"$ref":"#/components/schemas/HourlyDriftPointResponse"}}},"required":["date","energySystemId","items"]},"EnergyControllersResponse":{"type":"object","properties":{"energyControllers":{"type":"array","items":{"$ref":"#/components/schemas/EnergyControllerResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["energyControllers","totalCount"]},"EnergyMetersResponse":{"type":"object","properties":{"energyMeters":{"type":"array","items":{"$ref":"#/components/schemas/EnergyMeterResponse"}},"totalCount":{"type":"integer","format":"int32"}},"required":["energyMeters","totalCount"]},"EnergyMeterDetailsResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"measurementPointId":{"type":"string"},"energySystemId":{"type":"string","format":"uuid"},"type":{"$ref":"#/components/schemas/EnergyMeterType"},"isMaster":{"type":"boolean"},"powerFactor":{"type":"number","format":"double"},"description":{"type":"string"},"status":{"$ref":"#/components/schemas/EnergyMeterStatus"},"meterRole":{"$ref":"#/components/schemas/EnergyMeterRole"},"shadowOfMeterId":{"type":"string","format":"uuid"},"exportCapable":{"type":"boolean"}},"required":["exportCapable","id","isMaster","measurementPointId","meterRole","powerFactor","status","type"]},"AveragePowerConsumptionResponse":{"type":"object","properties":{"energyMeterId":{"type":"string","format":"uuid"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"activeEnergy":{"type":"number","format":"double"}},"required":["activeEnergy","endTime","energyMeterId","startTime"]},"EffectResponse":{"type":"object","properties":{"time":{"type":"string","format":"date-time"},"effect":{"type":"number","format":"double"},"frequency":{"type":"number","format":"double"}},"required":["effect","time"]},"EnergyConsumptionResponse":{"type":"object","properties":{"energyMeterId":{"type":"string","format":"uuid"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"energyConsumption":{"type":"array","items":{"$ref":"#/components/schemas/EffectResponse"}}},"required":["endTime","energyConsumption","energyMeterId","startTime"]},"CurrentPowerResponse":{"type":"object","properties":{"meterId":{"type":"string","format":"uuid"},"effect":{"type":"number","format":"double"},"time":{"type":"string","format":"date-time"},"frequency":{"type":"number","format":"double"}},"required":["effect","meterId","time"]},"CredentialResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"energySystemId":{"type":"string","format":"uuid"},"systemName":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"description":{"type":"string"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","energySystemId","id","isActive","password","systemName","updatedAt","username"]},"CredentialsResponse":{"type":"object","properties":{"credentials":{"type":"array","items":{"$ref":"#/components/schemas/CredentialResponse"}}},"required":["credentials"]},"CommissioningGroupResultResponse":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/CommissioningTestGroup"},"energyControllerId":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/TestResult"},"testRunIds":{"type":"array","items":{"type":"string","format":"uuid"}},"skippedTests":{"type":"array","items":{"type":"string"}},"preCheckFailure":{"type":"string"}},"required":["group","skippedTests","status","testRunIds"]},"CommissioningSessionResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"energySystemId":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/CommissioningStatus"},"groups":{"type":"array","items":{"$ref":"#/components/schemas/CommissioningGroupResultResponse"}},"startedBy":{"type":"string"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"}},"required":["energySystemId","groups","id","startedAt","startedBy","status"]},"CommissioningStatus":{"type":"string","enum":["PLANNING","RUNNING","COMPLETED","FAILED","CANCELLED"]},"CommissioningTestGroup":{"type":"string","enum":["CONTROLLER_CONNECTIVITY","INVERTER_RESPONSE","BATTERY_HEALTH","ENERGY_METER"]},"EntityStatus":{"type":"string","enum":["IDLE","ACTIVE","SUSPENDED"]},"BalancingEntitiesResponse":{"type":"object","properties":{"entities":{"type":"array","items":{"$ref":"#/components/schemas/BalancingEntityResponse"}},"totalCount":{"type":"integer","format":"int64"}},"required":["entities","totalCount"]},"BalancingEntityResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"$ref":"#/components/schemas/EntityType"},"energySystemId":{"type":"string","format":"uuid"},"controllerIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true},"marketParticipations":{"type":"array","items":{"$ref":"#/components/schemas/MarketParticipationResponse"}},"isLer":{"type":"boolean"},"status":{"$ref":"#/components/schemas/EntityStatus"}},"required":["controllerIds","energySystemId","id","isLer","marketParticipations","status","type"]},"MarketParticipationResponse":{"type":"object","properties":{"market":{"$ref":"#/components/schemas/BalancingMarket"},"variant":{"$ref":"#/components/schemas/MarketVariant"},"theoreticalCapacityW":{"type":"number","format":"double"},"approvedCapacityW":{"type":"number","format":"double"},"reductionFactorSs":{"type":"number","format":"double"},"reductionFactorDyn":{"type":"number","format":"double"},"biddingEnabled":{"type":"boolean"}},"required":["approvedCapacityW","biddingEnabled","market","reductionFactorDyn","reductionFactorSs","theoreticalCapacityW"]},"AssetReferenceResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"energySystemId":{"type":"string","format":"uuid"},"energyControllerId":{"type":"string","format":"uuid"}},"required":["energyControllerId","energySystemId","id"]},"AssetReferencesResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AssetReferenceResponse"}}},"required":["items"]},"AreaPriceResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"area":{"$ref":"#/components/schemas/DeliveryArea"},"currency":{"$ref":"#/components/schemas/Currency"},"hourlyPrices":{"type":"array","items":{"$ref":"#/components/schemas/HourlyPrice"}},"date":{"type":"string","format":"date"}},"required":["area","currency","date","hourlyPrices","id"]},"AreaPricesResponse":{"type":"object","properties":{"areaPrices":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/AreaPriceResponse"}}},"totalCount":{"type":"integer","format":"int32"}},"required":["areaPrices","totalCount"]},"HourlyPrice":{"type":"object","properties":{"period":{"type":"string","format":"date-time"},"price":{"type":"number"},"currency":{"$ref":"#/components/schemas/Currency"},"durationMinutes":{"type":"integer","format":"int64"}},"required":["currency","durationMinutes","period","price"]},"MeterReading":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"averagePower":{"type":"number","format":"double"}},"required":["averagePower","endTime","startTime"]},"AssetStatus":{"type":"string","enum":["enabled","opt-out","disabled"]},"AssetType":{"type":"string","enum":["ev-charger","battery","solar-panel","generic"]},"Coordinates":{"type":"object","properties":{"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"}},"required":["latitude","longitude"]},"FlexibilityAsset":{"type":"object","properties":{"assetId":{"type":"string"},"meterId":{"type":"string"},"name":{"type":"string"},"brp":{"type":"string"},"status":{"$ref":"#/components/schemas/AssetStatus"},"coordinates":{"$ref":"#/components/schemas/Coordinates"},"type":{"$ref":"#/components/schemas/AssetType"}},"required":["assetId","brp","coordinates","meterId","name","status","type"]},"GetFlexibilityAssetsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FlexibilityAsset"}},"nextCursor":{"type":"string"},"limit":{"type":"integer","format":"int32"}},"required":["data","limit"]},"SolarPanel":{"type":"object","properties":{"peakPower":{"type":"number","format":"double"},"azimuth":{"type":"integer","format":"int32"},"tilt":{"type":"integer","format":"int32"},"installDate":{"type":"string","format":"date-time"}}},"SolarProperties":{"type":"object","properties":{"panels":{"type":"array","items":{"$ref":"#/components/schemas/SolarPanel"}}}},"PowerMeasurement":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"averagePower":{"type":"number","format":"double"}},"required":["averagePower","endTime","startTime"]},"BatteryState":{"type":"object","properties":{"time":{"type":"string","format":"date-time"},"stateOfCharge":{"type":"number","format":"double"}},"required":["stateOfCharge","time"]},"BatteryProperties":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"minStateOfCharge":{"type":"number","format":"double"},"maxStateOfCharge":{"type":"number","format":"double"},"batteryCapacity":{"type":"number","format":"double"},"maxChargeRate":{"type":"number","format":"double"},"chargingEfficiencyFactor":{"type":"number","format":"double"},"maxDischargeRate":{"type":"number","format":"double"},"dischargingEfficiencyFactor":{"type":"number","format":"double"},"optOutFromActivation":{"type":"boolean"}},"required":["batteryCapacity","chargingEfficiencyFactor","dischargingEfficiencyFactor","endTime","maxChargeRate","maxDischargeRate","maxStateOfCharge","minStateOfCharge","optOutFromActivation","startTime"]},"FsmRationale":{"allOf":[{"$ref":"#/components/schemas/OperationRationale"},{"type":"object","properties":{"mode":{"type":"string"},"priceLevel":{"type":"string"}}}]},"HybridRationale":{"properties":{"mode":{"type":"string"},"setpointW":{"type":"number","format":"double"},"socIntent":{"$ref":"#/components/schemas/SocIntent"},"delegate":{"$ref":"#/components/schemas/OperationRationale"},"kind":{"type":"string"}}},"LiveRationale":{"allOf":[{"$ref":"#/components/schemas/OperationRationale"},{"type":"object","properties":{"mode":{"type":"string"},"priceLevel":{"type":"string"},"setpointW":{"type":"number","format":"double"},"supplySplit":{"$ref":"#/components/schemas/SupplySplit"}}}]},"MpcRationale":{"allOf":[{"$ref":"#/components/schemas/OperationRationale"},{"type":"object","properties":{"setpointW":{"type":"number","format":"double"},"socIntent":{"$ref":"#/components/schemas/SocIntent"},"provenance":{"$ref":"#/components/schemas/Provenance"},"planHorizon":{"type":"array","items":{"$ref":"#/components/schemas/PlanHorizonEntry"}}}}]},"PlanHorizonEntry":{"properties":{"from":{"type":"string","format":"date-time"},"type":{"$ref":"#/components/schemas/PlannedOperationType"},"powerW":{"type":"number","format":"double"}}},"PlannedOperationType":{"type":"string","enum":["CHARGE_FROM_SOLAR","CHARGE_FROM_GRID","DISCHARGE_TO_LOAD","DISCHARGE_TO_GRID"]},"Provenance":{"properties":{"source":{"type":"string"},"horizonHours":{"type":"integer","format":"int32"},"computedAt":{"type":"string","format":"date-time"}}},"SocIntent":{"properties":{"currentPct":{"type":"integer","format":"int32"},"targetPct":{"type":"integer","format":"int32"},"deadline":{"type":"string","format":"date-time"}}},"SupplySplit":{"properties":{"batteryPct":{"type":"integer","format":"int32"},"gridPct":{"type":"integer","format":"int32"}}}},"securitySchemes":{"apiKey":{"type":"apiKey","name":"x-api-key","in":"header"},"bearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}}}