Files
home-automation/frontend/src/api/schema.d.ts
T

3766 lines
117 KiB
TypeScript
Raw Normal View History

/**
* This file was auto-generated by openapi-typescript.
* Do not make direct changes to the file.
*/
export interface paths {
"/status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get Status */
get: operations["get_status_status_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Config
* @description Return all configuration sections. Secret field values are masked (empty string).
*/
get: operations["get_config_api_config_get"];
/**
* Put Config
* @description Save configuration updates.
*
* - Blank secret value keeps the existing stored value (no change).
* - Invalid values return 422 and nothing is written to the database.
* - If MQTT-related settings changed, the MQTT client reconnects automatically.
*/
put: operations["put_config_api_config_put"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/config/smtp/test": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Smtp Test
* @description Send a test SMTP email using the current runtime settings.
*
* Returns a structured result indicating success or the category of failure.
* Three possible outcomes:
* - 200 { "result": "success", "message": ... }
* - 400 { "result": "config-error", "message": ... } (EmailConfigurationError)
* - 502 { "result": "failed", "message": ... } (EmailDeliveryError)
*
* SMTP credentials are never echoed in the response.
*/
post: operations["post_smtp_test_api_config_smtp_test_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/config/mqtt/test": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Mqtt Test
* @description Test MQTT broker connectivity by attempting to connect and publishing a
* test message to ``<ha_discovery_prefix>/home-automation/test``.
*
* The message is visible in MQTT Explorer (or any subscriber) so users can
* confirm the full broker publish path is working.
*
* Three possible outcomes:
* - 200 { "result": "success", "message": ... }
* - 400 { "result": "config-error", "message": ... } (not configured)
* - 502 { "result": "failed", "message": ... } (connection/publish error)
*
* MQTT credentials are never echoed in the response.
*/
post: operations["post_mqtt_test_api_config_mqtt_test_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/locations": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Locations
* @description Return location records with optional time-window filtering and pagination.
*
* - ``start`` / ``end`` are ISO8601 strings; filtering is **inclusive** on both bounds.
* - Results are ordered by ``datetime`` ascending.
* - ``limit`` is capped at 5000 to prevent full-table exports.
*/
get: operations["get_locations_api_locations_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/poo": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Poo
* @description Return poo records ordered by timestamp descending (most recent first).
*
* ``limit`` is capped at 1000 to prevent full-table exports.
*/
get: operations["get_poo_api_poo_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/public-ip": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Public Ip
* @description Return the current public IP state and recent history.
*
* - ``state`` is ``null`` if no IP check has been performed yet.
* - ``history`` is ordered by ``observed_at`` descending (most recent first).
* - ``limit`` applies to the history list and is capped at 1000.
*/
get: operations["get_public_ip_api_public_ip_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/locations/{person}/{datetime}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* Delete Location Record
* @description Delete the single location record identified by its composite PK.
*
* - Exactly one row is deleted; **404** if the PK does not exist.
* - No batch delete / truncate path is available.
*/
delete: operations["delete_location_record_api_locations__person___datetime__delete"];
options?: never;
head?: never;
/**
* Patch Location
* @description Update the non-PK fields of a single location record.
*
* - ``person`` and ``datetime`` identify the row (composite PK) and are immutable.
* - Only ``latitude``, ``longitude``, and ``altitude`` may be updated.
* - Omitted body fields are left unchanged.
* - Returns **404** if the PK does not exist.
*/
patch: operations["patch_location_api_locations__person___datetime__patch"];
trace?: never;
};
"/api/poo/{timestamp}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* Delete Poo
* @description Delete the single poo record identified by its PK.
*
* - Exactly one row is deleted; **404** if the PK does not exist.
* - No batch delete / truncate path is available.
*/
delete: operations["delete_poo_api_poo__timestamp__delete"];
options?: never;
head?: never;
/**
* Patch Poo
* @description Update the non-PK fields of a single poo record.
*
* - ``timestamp`` is the PK and is immutable.
* - Only ``status``, ``latitude``, and ``longitude`` may be updated.
* - Omitted body fields are left unchanged.
* - Returns **404** if the PK does not exist.
*/
patch: operations["patch_poo_api_poo__timestamp__patch"];
trace?: never;
};
"/api/energy/prices": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Prices
* @description Return the price curve for the active contract.
*
* **Tibber contracts** (kind="tibber"):
* Fetches ``tibber_price`` rows within ``[start, end]``, ordered ascending
* by ``starts_at``. At most ``limit`` rows are returned (most recent first
* within the window, then reversed to ascending order — identical to the
* modbus readings pattern).
*
* Response ``points`` carries per-slot:
* - ``buy = total`` (Tibber all-inclusive price)
* - ``sell = total energy_tax sell_adjust`` (from active version values)
* - ``level`` (Tibber price level, may be null)
*
* ``tariff`` is null.
*
* **Manual contracts** (kind="manual"):
* ``points`` is empty. ``tariff`` carries the four effective prices
* derived using the billing engine formula:
* - ``buy_dal = energy.buy.dal + energy_tax + ode``
* - ``buy_normal = energy.buy.normal + energy_tax + ode``
* - ``sell_dal = energy.sell.dal``
* - ``sell_normal = energy.sell.normal``
*
* **No active contract**: returns kind=null, currency="EUR", points=[], tariff=null (200).
*/
get: operations["get_prices_api_energy_prices_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/costs": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Costs
* @description Return energy_cost_period rows within a time window.
*
* Rows are ordered by ``period_start`` ascending. When the window contains
* more rows than ``limit``, the **most recent** N rows are returned (DESC LIMIT),
* then reversed to ascending order — identical to the modbus readings pattern.
*
* Query parameters:
* - ``start``: inclusive lower bound on ``period_start`` (ISO 8601 datetime).
* - ``end``: inclusive upper bound on ``period_start`` (ISO 8601 datetime).
* - ``limit``: max rows to return (default 500, max {_COSTS_LIMIT_MAX}).
*/
get: operations["get_costs_api_energy_costs_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/costs/summary": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Costs Summary
* @description Aggregate billing for a time interval.
*
* Calls ``energy_cost.summarize(session, start, end)`` which computes:
*
* total_payable = Σ(net_cost) + fixed_costs credits
*
* where ``fixed_costs`` is (network_fee + management_fee) apportioned to the
* interval length in days (÷30 per month), and ``credits`` is heffingskorting
* apportioned similarly (÷365 per year).
*
* Both ``fixed_costs`` and ``credits`` are derived from the **currently active
* contract version at ``end``**. When no active contract exists they are 0.
*/
get: operations["get_costs_summary_api_energy_costs_summary_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/dsmr/latest": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Dsmr Latest
* @description Return the most recent dsmr_reading row.
*
* Returns ``{"found": false, "recorded_at": null, "payload": null}`` (200, not
* 404) when no rows exist yet, so the front-end can distinguish "no data" from
* a server error.
*/
get: operations["get_dsmr_latest_api_energy_dsmr_latest_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/costs/recompute": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Recompute
* @description Idempotently recompute billing records in a time window.
*
* Calls ``energy_cost.recompute_range(session, start, end)`` which overwrites
* existing rows (including successful ones) for every UTC quarter-hour boundary
* in ``[start, end)``.
*
* **Idempotency**: repeated calls with the same window produce the same
* outcome. No rows are deleted; only upserted.
*
* **Window constraint**: the maximum allowed range is {_RECOMPUTE_MAX_DAYS} days.
* Requests exceeding this return 422.
*
* Returns the number of periods for which a billing record was written.
* Periods skipped due to missing contract or missing Tibber price are not counted.
*/
post: operations["post_recompute_api_energy_costs_recompute_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/tibber/test": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Tibber Test
* @description Test Tibber API connectivity by fetching the current price point.
*
* Three possible outcomes:
*
* - **200** ``{ result: "success", message: ..., price: {...} }``
* The Tibber API responded with a valid current price. ``price`` contains
* starts_at, total, energy, tax, currency, and level.
*
* - **400** ``{ result: "config-error", message: ... }``
* The Tibber API token is empty or not configured.
*
* - **502** ``{ result: "failed", message: ... }``
* The API call failed (authentication rejected, network error, timeout,
* unexpected response, etc.).
*
* The API token is **never** included in the response body or logged.
*/
post: operations["post_tibber_test_api_energy_tibber_test_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/profiles": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Profiles
* @description List all available pricing profile structures.
*
* Returns the full profile structure for each supported contract kind
* (``manual`` and ``tibber``). The front-end uses this to dynamically
* render the correct fields and labels for the contract creation/editing form.
*/
get: operations["get_profiles_api_energy_profiles_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/contracts": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List Energy Contracts
* @description List all energy contracts with their active status.
*
* Returns a flat list (no embedded version history); use
* GET /api/energy/contracts/{id} to fetch the full version history for a
* specific contract.
*/
get: operations["list_energy_contracts_api_energy_contracts_get"];
put?: never;
/**
* Create Energy Contract
* @description Create a new energy contract with an initial pricing version.
*
* The ``values`` dict is validated against the YAML profile for the given
* ``kind``; non-conforming values result in 422 Unprocessable Entity.
* The new contract is created with ``active=False``; use
* PATCH /api/energy/contracts/{id} with ``active=true`` to activate it.
*/
post: operations["create_energy_contract_api_energy_contracts_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/contracts/{contract_id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Energy Contract
* @description Return a single energy contract with its full version history.
*
* Versions are ordered by ``effective_from`` ascending so the caller can
* easily inspect the pricing timeline.
*/
get: operations["get_energy_contract_api_energy_contracts__contract_id__get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Patch Energy Contract
* @description Partially update a contract: rename or change activation status.
*
* - ``name``: updates the human-readable label.
* - ``active=true``: activates this contract (all others are deactivated).
* - ``active=false``: deactivates this contract (no effect on others).
*
* At most one contract may be active at any time; the service layer enforces
* mutual exclusion.
*/
patch: operations["patch_energy_contract_api_energy_contracts__contract_id__patch"];
trace?: never;
};
"/api/energy/contracts/{contract_id}/versions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Add Contract Version
* @description Add a new pricing version to an existing contract.
*
* This is how price changes are recorded: the current open version is
* automatically closed (its ``effective_to`` is set to ``body.effective_from``)
* and a new version is created starting at ``body.effective_from``.
*
* The ``values`` dict must conform to the contract's pricing profile.
* Non-conforming values return 422. If ``effective_from`` is not strictly
* after the previous version's ``effective_from``, 422 is returned without
* writing any rows.
*
* Historical versions are never modified; this endpoint is append-only.
*/
post: operations["add_contract_version_api_energy_contracts__contract_id__versions_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/expose": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Expose
* @description Return the full exposable-entity catalog with toggle states and MQTT status.
*
* The catalog is computed dynamically from registered providers (e.g. the
* Modbus provider enumerates all enabled devices and their metric entities).
* Toggle states come from the ``exposed_entity_toggle`` table; entities with
* no row default to ``enabled=False``.
*/
get: operations["get_expose_api_expose_get"];
/**
* Put Expose
* @description Set per-entity toggle state.
*
* Accepts a map of ``{key: bool}`` and upserts rows in the
* ``exposed_entity_toggle`` table. Only keys present in ``body.toggles``
* are touched; other entities' toggles are left unchanged.
*
* After writing the toggles, triggers a HA Discovery re-publish so any
* changes (enabled ↔ disabled) are reflected in Home Assistant immediately.
*/
put: operations["put_expose_api_expose_put"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/expose/republish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Expose Republish
* @description Manually trigger a full HA Discovery re-publish.
*
* Calls ``publish_discovery(session)`` from the HA discovery service (M5-T11).
* Returns a status indicating whether the publish was attempted (or skipped
* because MQTT / discovery is not enabled / connected).
*/
post: operations["post_expose_republish_api_expose_republish_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/modbus/profiles": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Profiles
* @description List all available Modbus YAML profiles (name + description).
*
* Intended for the front-end's device-creation profile drop-down.
*/
get: operations["get_profiles_api_modbus_profiles_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/modbus/devices": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List Devices
* @description Return all Modbus devices (no pagination — device counts stay small).
*/
get: operations["list_devices_api_modbus_devices_get"];
put?: never;
/**
* Create Device
* @description Create a new Modbus device.
*
* - Validates that the referenced ``profile`` exists; returns 422 if not.
* - Returns 201 with the created device on success.
*/
post: operations["create_device_api_modbus_devices_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/modbus/devices/{uuid}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Device
* @description Return a single Modbus device by UUID.
*/
get: operations["get_device_api_modbus_devices__uuid__get"];
put?: never;
post?: never;
/**
* Delete Device
* @description Delete a Modbus device.
*
* Returns 409 Conflict if the device has any associated readings; use
* ``enabled=false`` to disable it instead.
*
* **Application-layer safety**: the check is performed via an explicit
* SELECT COUNT query — not by relying on SQLite's FK RESTRICT constraint,
* which is not enforced at runtime in this project (no PRAGMA foreign_keys=ON).
*/
delete: operations["delete_device_api_modbus_devices__uuid__delete"];
options?: never;
head?: never;
/**
* Patch Device
* @description Partially update a Modbus device (including enable/disable).
*
* Only fields explicitly provided in the request body are updated.
* Providing ``profile`` triggers a profile-existence check (422 if unknown).
*/
patch: operations["patch_device_api_modbus_devices__uuid__patch"];
trace?: never;
};
"/api/modbus/devices/{uuid}/latest": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Latest Reading
* @description Return the most recent reading for a device.
*
* If no readings exist yet, returns ``{"found": false, "recorded_at": null,
* "payload": null}`` (200, not 404) so the front-end can distinguish
* "device exists but has no data" from "device not found".
*/
get: operations["get_latest_reading_api_modbus_devices__uuid__latest_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/modbus/devices/{uuid}/readings": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Readings
* @description Return time-range readings for a device.
*
* When the window contains more rows than ``limit``, the **most recent** N rows
* are returned (``ORDER BY recorded_at DESC LIMIT n``), then reversed to
* ascending order before being sent to the client. This ensures that for long
* time-range requests (e.g. 6 h / 24 h) the caller always sees the latest data
* rather than the oldest segment of the window.
*
* When the window has fewer rows than ``limit`` the full window is returned in
* ascending order — behaviour is identical to a plain ascending query.
*
* The response schema is unchanged: items are always ``recorded_at`` ascending.
*
* The query uses the ``(device_id, recorded_at)`` composite index for
* efficient time-window scans.
*
* Query parameters:
* - ``start``: inclusive lower bound (ISO8601 datetime)
* - ``end``: inclusive upper bound (ISO8601 datetime)
* - ``limit``: max rows to return (default 500, max {_READINGS_LIMIT_MAX})
*/
get: operations["get_readings_api_modbus_devices__uuid__readings_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/modbus/devices/{uuid}/metrics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Metrics
* @description Return the metric catalogue for a device's profile.
*
* Each entry has ``key``, ``label`` (derived from key if the profile has
* none — underscores → spaces, title-cased), ``unit``, and ``device_class``.
* This is the authoritative metadata source for front-end card labels and
* chart axis labels.
*/
get: operations["get_metrics_api_modbus_devices__uuid__metrics_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/modbus/devices/{uuid}/test": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Test Read
* @description Immediately read and decode the device once without persisting any data.
*
* Useful for validating gateway connectivity and Modbus address settings
* before relying on the background polling job.
*
* This is a write-class endpoint (it initiates network I/O on demand) and
* therefore requires a CSRF token. The response payload is never stored.
*/
post: operations["test_read_api_modbus_devices__uuid__test_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/session": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Session
* @description Return the current session user and CSRF token. Returns 401 if not authenticated.
*/
get: operations["get_session_api_session_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/auth/login": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Login
* @description Authenticate with username and password.
*
* On success, sets an HttpOnly session cookie and returns the session user + CSRF token.
* On failure, returns 401 with no cookie set.
* Repeated failures trigger exponential back-off (429 + Retry-After).
* No X-CSRF-Token required (unauthenticated endpoint).
*/
post: operations["post_login_api_auth_login_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/auth/logout": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Logout
* @description Revoke the current session and clear the session cookie.
* Requires authentication and X-CSRF-Token header.
* Returns 204 No Content.
*/
post: operations["post_logout_api_auth_logout_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/auth/password": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Change Password
* @description Change the current user's password.
* Requires authentication and X-CSRF-Token header.
* On AuthPasswordChangeError returns 400 with a generic message.
* On success, force_password_change becomes False (handled by the service).
* Returns 204 No Content.
*/
post: operations["post_change_password_api_auth_password_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/auth/totp/setup": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Totp Setup
* @description Generate a new pending TOTP secret, otpauth URI, and one-time recovery codes.
*
* The secret is stored in the DB but TOTP is NOT yet enabled (totp_enabled stays
* False until the user confirms with POST /api/auth/totp/enable).
*
* Recovery codes are returned here as plaintext exactly once; their Argon2 hashes
* are persisted immediately so enable only needs to flip the enabled flag.
*
* Repeating this call replaces any prior pending secret and regenerates codes.
*
* Requires: session cookie + X-CSRF-Token.
*/
post: operations["post_totp_setup_api_auth_totp_setup_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/auth/totp/enable": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Totp Enable
* @description Enable TOTP by confirming with the current 6-digit code from the authenticator app.
*
* Requires a prior call to POST /api/auth/totp/setup (so that a pending secret
* exists). On success, totp_enabled becomes True.
*
* Returns 400 if the code is wrong or there is no pending secret.
* Requires: session cookie + X-CSRF-Token.
*/
post: operations["post_totp_enable_api_auth_totp_enable_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/auth/totp/disable": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Post Totp Disable
* @description Disable TOTP. The caller must provide exactly one of:
* - ``password``: the user's current login password, OR
* - ``code``: the current 6-digit TOTP code.
*
* On success: totp_enabled=False, totp_secret cleared, all recovery codes deleted.
* Returns 400 if neither credential matches or neither is provided.
* Requires: session cookie + X-CSRF-Token.
*/
post: operations["post_totp_disable_api_auth_totp_disable_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/auth/totp": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Totp Status
* @description Return the current TOTP status for the authenticated user.
*
* Response contains only ``{"enabled": bool}``.
* Secret and recovery codes are NEVER returned here.
* Requires: session cookie only (no CSRF — read-only).
*/
get: operations["get_totp_status_api_auth_totp_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/homeassistant/publish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Publish From Homeassistant */
post: operations["publish_from_homeassistant_homeassistant_publish_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/location/record": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Create Location Record */
post: operations["create_location_record_location_record_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/poo/record": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Create Poo Record */
post: operations["create_poo_record_poo_record_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/poo/latest": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Notify Latest Poo */
get: operations["notify_latest_poo_poo_latest_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public-ip/check": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Run Public Ip Check */
get: operations["run_public_ip_check_public_ip_check_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/ticktick/auth/start": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Start Ticktick Auth */
get: operations["start_ticktick_auth_ticktick_auth_start_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/ticktick/auth/code": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Handle Ticktick Auth Code */
get: operations["handle_ticktick_auth_code_ticktick_auth_code_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
}
export type webhooks = Record<string, never>;
export interface components {
schemas: {
/**
* CatalogEntrySchema
* @description An entity from the catalog with its current toggle state.
*/
CatalogEntrySchema: {
entity: components["schemas"]["ExposableEntitySchema"];
/** Enabled */
enabled: boolean;
};
/** ConfigField */
ConfigField: {
/** Env Name */
env_name: string;
/** Label */
label: string;
/** Value */
value: string;
/** Secret */
secret: boolean;
/** Input Type */
input_type: string;
/** Configured */
configured: boolean;
};
/** ConfigResponse */
ConfigResponse: {
/** Sections */
sections: components["schemas"]["ConfigSection"][];
};
/** ConfigSection */
ConfigSection: {
/** Name */
name: string;
/** Fields */
fields: components["schemas"]["ConfigField"][];
};
/**
* ConfigUpdateRequest
* @description Flat mapping of env_name → value, mirroring the existing form semantics.
*/
ConfigUpdateRequest: {
/** Updates */
updates: {
[key: string]: string;
};
};
/** ConfigUpdateResponse */
ConfigUpdateResponse: {
/** Sections */
sections: components["schemas"]["ConfigSection"][];
};
/**
* ContractCreate
* @description Request body for POST /api/energy/contracts.
*
* ``effective_from`` defaults to the current UTC time if not provided,
* giving the first version an open-ended start from "now".
* ``kind`` is validated at the application layer against the profile registry;
* clients should send ``"manual"`` or ``"tibber"``.
*/
ContractCreate: {
/** Name */
name: string;
/** Kind */
kind: string;
/**
* Currency
* @default EUR
*/
currency: string;
/** Values */
values: {
[key: string]: unknown;
};
/**
* Effective From
* @description UTC datetime from which the first pricing version is effective. Defaults to the current UTC time when omitted.
*/
effective_from?: string | null;
};
/**
* ContractDetailResponse
* @description Response schema for a single EnergyContract with full version history.
*
* Returned by GET /api/energy/contracts/{id} and by successful POST / PATCH
* operations where the caller needs to see all version data.
*/
ContractDetailResponse: {
/** Id */
id: number;
/** Name */
name: string;
/** Kind */
kind: string;
/** Active */
active: boolean;
/** Currency */
currency: string;
/**
* Created At
* Format: date-time
*/
created_at: string;
/**
* Updated At
* Format: date-time
*/
updated_at: string;
/** Versions */
versions: components["schemas"]["ContractVersionResponse"][];
};
/**
* ContractListResponse
* @description Response schema for GET /api/energy/contracts.
*/
ContractListResponse: {
/** Items */
items: components["schemas"]["ContractResponse"][];
/** Total */
total: number;
};
/**
* ContractPatch
* @description Request body for PATCH /api/energy/contracts/{id}.
*
* All fields are optional. Sending ``active=true`` activates this contract
* (deactivating all others); ``active=false`` deactivates it without affecting
* other contracts.
*/
ContractPatch: {
/** Name */
name?: string | null;
/** Active */
active?: boolean | null;
};
/**
* ContractResponse
* @description Response schema for a single EnergyContract (without embedded versions).
*
* Used for list responses where embedding all versions would be expensive.
*/
ContractResponse: {
/** Id */
id: number;
/** Name */
name: string;
/** Kind */
kind: string;
/** Active */
active: boolean;
/** Currency */
currency: string;
/**
* Created At
* Format: date-time
*/
created_at: string;
/**
* Updated At
* Format: date-time
*/
updated_at: string;
};
/**
* ContractVersionResponse
* @description Response schema for a single EnergyContractVersion row.
*/
ContractVersionResponse: {
/** Id */
id: number;
/**
* Effective From
* Format: date-time
*/
effective_from: string;
/** Effective To */
effective_to: string | null;
/** Values */
values: {
[key: string]: unknown;
};
/**
* Created At
* Format: date-time
*/
created_at: string;
};
/**
* CostPeriodSchema
* @description One 15-minute billing record from the energy_cost_period table.
*/
CostPeriodSchema: {
/**
* Period Start
* Format: date-time
*/
period_start: string;
/**
* D1 Kwh
* @description Delivered low-tariff kWh for this period.
*/
d1_kwh: number;
/**
* D2 Kwh
* @description Delivered normal-tariff kWh for this period.
*/
d2_kwh: number;
/**
* R1 Kwh
* @description Returned low-tariff kWh for this period.
*/
r1_kwh: number;
/**
* R2 Kwh
* @description Returned normal-tariff kWh for this period.
*/
r2_kwh: number;
/**
* Import Cost
* @description Cost of electricity drawn from grid (EUR).
*/
import_cost: number;
/**
* Export Revenue
* @description Revenue from electricity fed to grid (EUR).
*/
export_revenue: number;
/**
* Net Cost
* @description import_cost export_revenue (EUR).
*/
net_cost: number;
/**
* Currency
* @description ISO 4217 currency code.
*/
currency: string;
/**
* Degraded
* @description True when the period was computed with incomplete data.
*/
degraded: boolean;
/**
* Contract Version Id
* @description FK to the contract version used for this billing period (null when degraded).
*/
contract_version_id?: number | null;
};
/**
* CostsResponse
* @description Response for GET /api/energy/costs.
*/
CostsResponse: {
/** Items */
items: components["schemas"]["CostPeriodSchema"][];
/**
* Total
* @description Number of items returned.
*/
total: number;
};
/**
* DeviceInfoSchema
* @description HA device grouping info for an exposable entity.
*/
DeviceInfoSchema: {
/** Identifiers */
identifiers: string[];
/** Name */
name: string;
};
/**
* DsmrLatestResponse
* @description Response for GET /api/energy/dsmr/latest.
*
* ``found`` is False when no dsmr_reading rows exist yet. The front-end
* should check ``found`` before reading ``recorded_at`` or ``payload``.
*/
DsmrLatestResponse: {
/** Found */
found: boolean;
/** Recorded At */
recorded_at?: string | null;
/** Payload */
payload?: {
[key: string]: unknown;
} | null;
};
/**
* ExposableEntitySchema
* @description One exposable entity in the catalog.
*
* ``value_getter`` is intentionally excluded — it is a non-serialisable
* callable and is only used internally by the HA Discovery service.
*/
ExposableEntitySchema: {
/** Key */
key: string;
/** Component */
component: string;
device: components["schemas"]["DeviceInfoSchema"];
/** Device Class */
device_class: string | null;
/** Unit */
unit: string;
/** Name */
name: string;
/** State Class */
state_class?: string | null;
};
/**
* ExposeResponse
* @description Response for GET /api/expose.
*/
ExposeResponse: {
/** Catalog */
catalog: components["schemas"]["CatalogEntrySchema"][];
mqtt_status: components["schemas"]["MqttStatusSchema"];
};
/**
* ExposeUpdateRequest
* @description Request body for PUT /api/expose.
*
* ``toggles`` is a map from entity key to desired enabled state (bool).
* Only keys present in the map are updated; absent keys are untouched.
*/
ExposeUpdateRequest: {
/** Toggles */
toggles: {
[key: string]: boolean;
};
};
/**
* ExposeUpdateResponse
* @description Response for PUT /api/expose (returns updated catalog + status).
*/
ExposeUpdateResponse: {
/** Catalog */
catalog: components["schemas"]["CatalogEntrySchema"][];
mqtt_status: components["schemas"]["MqttStatusSchema"];
};
/** HTTPValidationError */
HTTPValidationError: {
/** Detail */
detail?: components["schemas"]["ValidationError"][];
};
/** LocationRecord */
LocationRecord: {
/** Person */
person: string;
/** Datetime */
datetime: string;
/** Latitude */
latitude: number;
/** Longitude */
longitude: number;
/** Altitude */
altitude: number | null;
};
/**
* LocationUpdateRequest
* @description PATCH body for a location record — all fields optional; PK fields excluded.
*/
LocationUpdateRequest: {
/** Latitude */
latitude?: number | null;
/** Longitude */
longitude?: number | null;
/** Altitude */
altitude?: number | null;
};
/** LocationsResponse */
LocationsResponse: {
/** Items */
items: components["schemas"]["LocationRecord"][];
/** Limit */
limit: number;
/** Offset */
offset: number;
};
/** LoginRequest */
LoginRequest: {
/** Username */
username: string;
/** Password */
password: string;
/** Totp Code */
totp_code?: string | null;
};
/**
* ManualTariffSchema
* @description Fixed-tariff breakdown for manual contracts.
*
* Prices are the *effective* buy prices as used by the billing engine
* (energy_buy_x + energy_tax + ode) and the raw sell prices.
*/
ManualTariffSchema: {
/**
* Buy Dal
* @description Effective buy price, low-tariff / dal (EUR/kWh).
*/
buy_dal: number;
/**
* Buy Normal
* @description Effective buy price, normal / high-tariff (EUR/kWh).
*/
buy_normal: number;
/**
* Sell Dal
* @description Sell price, low-tariff / dal (EUR/kWh).
*/
sell_dal: number;
/**
* Sell Normal
* @description Sell price, normal / high-tariff (EUR/kWh).
*/
sell_normal: number;
};
/**
* MetricInfo
* @description Metadata for a single measurable quantity in a device's profile.
*/
MetricInfo: {
/** Key */
key: string;
/** Label */
label: string;
/** Unit */
unit: string;
/** Device Class */
device_class: string;
};
/**
* ModbusDeviceCreate
* @description Request body for POST /api/modbus/devices.
*/
ModbusDeviceCreate: {
/** Friendly Name */
friendly_name: string;
/**
* Transport
* @default tcp
*/
transport: string;
/** Host */
host: string;
/**
* Port
* @default 502
*/
port: number;
/**
* Unit Id
* @default 1
*/
unit_id: number;
/** Profile */
profile: string;
/**
* Poll Interval S
* @default 5
*/
poll_interval_s: number;
/**
* Enabled
* @default true
*/
enabled: boolean;
};
/**
* ModbusDeviceListResponse
* @description Response schema for listing Modbus devices.
*/
ModbusDeviceListResponse: {
/** Items */
items: components["schemas"]["ModbusDeviceResponse"][];
/** Total */
total: number;
};
/**
* ModbusDeviceResponse
* @description Response schema for a single Modbus device.
*/
ModbusDeviceResponse: {
/** Uuid */
uuid: string;
/** Friendly Name */
friendly_name: string;
/** Transport */
transport: string;
/** Host */
host: string;
/** Port */
port: number;
/** Unit Id */
unit_id: number;
/** Profile */
profile: string;
/** Poll Interval S */
poll_interval_s: number;
/** Enabled */
enabled: boolean;
/** Last Poll At */
last_poll_at: string | null;
/** Last Poll Ok */
last_poll_ok: boolean | null;
/**
* Created At
* Format: date-time
*/
created_at: string;
/**
* Updated At
* Format: date-time
*/
updated_at: string;
};
/**
* ModbusDeviceUpdate
* @description Request body for PATCH /api/modbus/devices/{uuid} — all fields optional.
*/
ModbusDeviceUpdate: {
/** Friendly Name */
friendly_name?: string | null;
/** Transport */
transport?: string | null;
/** Host */
host?: string | null;
/** Port */
port?: number | null;
/** Unit Id */
unit_id?: number | null;
/** Profile */
profile?: string | null;
/** Poll Interval S */
poll_interval_s?: number | null;
/** Enabled */
enabled?: boolean | null;
};
/**
* ModbusLatestResponse
* @description Response for the /latest endpoint.
*
* ``found`` is False and ``recorded_at``/``payload`` are None when the device
* has no readings yet. Callers should check ``found`` before using the values.
*/
ModbusLatestResponse: {
/** Found */
found: boolean;
/** Recorded At */
recorded_at: string | null;
/** Payload */
payload: {
[key: string]: unknown;
} | null;
};
/**
* ModbusMetricsResponse
* @description Response schema for GET /api/modbus/devices/{uuid}/metrics.
*/
ModbusMetricsResponse: {
/** Profile */
profile: string;
/** Metrics */
metrics: components["schemas"]["MetricInfo"][];
};
/**
* ModbusProfilesResponse
* @description Response schema for GET /api/modbus/profiles.
*/
ModbusProfilesResponse: {
/** Profiles */
profiles: components["schemas"]["ProfileSummary"][];
};
/**
* ModbusReadingResponse
* @description A single reading row: timestamp + decoded payload.
*/
ModbusReadingResponse: {
/**
* Recorded At
* Format: date-time
*/
recorded_at: string;
/** Payload */
payload: {
[key: string]: unknown;
};
};
/**
* ModbusReadingsResponse
* @description Response schema for the readings time-range endpoint.
*/
ModbusReadingsResponse: {
/** Items */
items: components["schemas"]["ModbusReadingResponse"][];
};
/**
* ModbusTestReadResponse
* @description Response for POST /api/modbus/devices/{uuid}/test.
*
* On success ``ok=True`` and ``payload`` contains the decoded values.
* On failure ``ok=False`` and ``error`` describes the problem.
*/
ModbusTestReadResponse: {
/** Ok */
ok: boolean;
/** Payload */
payload?: {
[key: string]: unknown;
} | null;
/** Error */
error?: string | null;
};
/**
* MqttStatusSchema
* @description Connection status for MQTT and HA Discovery.
*/
MqttStatusSchema: {
/** Mqtt Configured */
mqtt_configured: boolean;
/** Mqtt Connected */
mqtt_connected: boolean;
/** Discovery Enabled */
discovery_enabled: boolean;
};
/**
* MqttTestResponse
* @description Response from POST /api/config/mqtt/test.
*/
MqttTestResponse: {
/**
* Result
* @enum {string}
*/
result: "success" | "config-error" | "failed";
/** Message */
message: string;
};
/** PasswordChangeRequest */
PasswordChangeRequest: {
/** Current Password */
current_password: string;
/** New Password */
new_password: string;
/** Confirm Password */
confirm_password: string;
};
/** PooRecord */
PooRecord: {
/** Timestamp */
timestamp: string;
/** Status */
status: string;
/** Latitude */
latitude: number;
/** Longitude */
longitude: number;
};
/** PooResponse */
PooResponse: {
/** Items */
items: components["schemas"]["PooRecord"][];
/** Limit */
limit: number;
/** Offset */
offset: number;
};
/**
* PooUpdateRequest
* @description PATCH body for a poo record — all fields optional; PK field excluded.
*/
PooUpdateRequest: {
/** Status */
status?: string | null;
/** Latitude */
latitude?: number | null;
/** Longitude */
longitude?: number | null;
};
/**
* PricePointSchema
* @description A single 15-minute price point (tibber) or placeholder entry.
*/
PricePointSchema: {
/**
* Starts At
* Format: date-time
*/
starts_at: string;
/**
* Buy
* @description All-in buy price in EUR/kWh (including taxes).
*/
buy: number;
/**
* Sell
* @description Net sell price in EUR/kWh.
*/
sell: number;
/**
* Level
* @description Tibber price level (CHEAP / NORMAL / EXPENSIVE); null for manual.
*/
level?: string | null;
};
/**
* PricesResponse
* @description Response for GET /api/energy/prices.
*
* ``kind`` mirrors the active contract kind:
* - ``"tibber"`` → ``points`` has actual 15-min price entries; ``tariff`` is null.
* - ``"manual"`` → ``points`` is empty; ``tariff`` carries the fixed-rate table.
* - ``None`` → no active contract; both ``points`` and ``tariff`` are empty/null.
*
* ``currency`` comes from the active contract (or "EUR" fallback).
* ``points`` is always ascending by ``starts_at``.
*/
PricesResponse: {
/**
* Kind
* @description Active contract kind ('tibber' or 'manual'), or null if no active contract.
*/
kind: string | null;
/**
* Currency
* @description ISO 4217 currency code.
*/
currency: string;
/**
* Points
* @description 15-minute price points for tibber contracts (ascending by starts_at). Empty for manual contracts or when no active contract exists.
*/
points: components["schemas"]["PricePointSchema"][];
/** @description Fixed tariff table for manual contracts. Null for tibber contracts and when no active contract exists. */
tariff?: components["schemas"]["ManualTariffSchema"] | null;
};
/**
* ProfileSummary
* @description One entry in the GET /api/modbus/profiles response.
*/
ProfileSummary: {
/** Name */
name: string;
/** Description */
description: string;
};
/**
* ProfilesResponse
* @description Response schema for GET /api/energy/profiles.
*
* ``profiles`` is a list of raw profile dicts as produced by
* ``list_profiles()`` (Pydantic model dumps). Each entry contains at minimum
* ``kind`` and ``label``; the full nested structure allows the front-end to
* render a type-appropriate form for each pricing profile.
*/
ProfilesResponse: {
/** Profiles */
profiles: {
[key: string]: unknown;
}[];
};
/** PublicIPCheckResponse */
PublicIPCheckResponse: {
/**
* Status
* @enum {string}
*/
status: "first_seen" | "unchanged" | "changed" | "error";
/**
* Checked At
* Format: date-time
*/
checked_at: string;
/** Changed */
changed: boolean;
};
/** PublicIPHistorySchema */
PublicIPHistorySchema: {
/** Id */
id: number;
/** Ipv4 */
ipv4: string;
/**
* Observed At
* Format: date-time
*/
observed_at: string;
/** Change Type */
change_type: string;
/** Provider */
provider: string | null;
};
/** PublicIPResponse */
PublicIPResponse: {
state: components["schemas"]["PublicIPStateSchema"] | null;
/** History */
history: components["schemas"]["PublicIPHistorySchema"][];
};
/** PublicIPStateSchema */
PublicIPStateSchema: {
/** Id */
id: number;
/** Current Ipv4 */
current_ipv4: string;
/** Previous Ipv4 */
previous_ipv4: string | null;
/**
* First Seen At
* Format: date-time
*/
first_seen_at: string;
/**
* Last Checked At
* Format: date-time
*/
last_checked_at: string;
/** Last Changed At */
last_changed_at: string | null;
/** Last Check Status */
last_check_status: string;
/** Last Check Error */
last_check_error: string | null;
/** Last Provider */
last_provider: string | null;
};
/**
* RecomputeResponse
* @description Response for POST /api/energy/costs/recompute.
*/
RecomputeResponse: {
/**
* Recomputed
* @description Number of 15-minute periods for which a billing record was written (inserted or updated). Periods skipped due to missing contract or missing Tibber price are not counted.
*/
recomputed: number;
};
/**
* RepublishResponse
* @description Response for POST /api/expose/republish.
*/
RepublishResponse: {
/** Ok */
ok: boolean;
/** Message */
message: string;
};
/** SessionResponse */
SessionResponse: {
user: components["schemas"]["SessionUser"];
/** Csrf Token */
csrf_token: string;
};
/** SessionUser */
SessionUser: {
/** Username */
username: string;
/** Force Password Change */
force_password_change: boolean;
};
/**
* SmtpTestResponse
* @description Response from POST /api/config/smtp/test.
*/
SmtpTestResponse: {
/**
* Result
* @enum {string}
*/
result: "success" | "config-error" | "failed";
/** Message */
message: string;
};
/** StatusResponse */
StatusResponse: {
/** Status */
status: string;
};
/**
* SummaryResponse
* @description Response for GET /api/energy/costs/summary.
*
* All monetary values are in ``currency``.
*
* ``total_payable = metered_net + fixed_costs credits``
*/
SummaryResponse: {
/** Currency */
currency: string;
/**
* Metered Import
* @description Σ import_cost for non-degraded periods.
*/
metered_import: number;
/**
* Metered Export
* @description Σ export_revenue for non-degraded periods.
*/
metered_export: number;
/**
* Metered Net
* @description Σ net_cost for non-degraded periods.
*/
metered_net: number;
/**
* Fixed Costs
* @description Standing charges (network_fee + management_fee) apportioned over the interval.
*/
fixed_costs: number;
/**
* Credits
* @description Energy-tax credit (heffingskorting) apportioned over the interval.
*/
credits: number;
/**
* Total Payable
* @description metered_net + fixed_costs credits (actual amount owed).
*/
total_payable: number;
/**
* Period Count
* @description Number of non-degraded billing periods in range.
*/
period_count: number;
/**
* Degraded Count
* @description Number of degraded billing periods in range.
*/
degraded_count: number;
/**
* Days
* @description Interval length in days.
*/
days: number;
};
/**
* TibberTestPriceSchema
* @description Current Tibber price point returned on a successful test.
*
* Carries enough fields for the front-end to confirm the API is working and
* display the live price. The API token is **never** included.
*/
TibberTestPriceSchema: {
/**
* Starts At
* Format: date-time
*/
starts_at: string;
/** Total */
total: number;
/** Energy */
energy: number;
/** Tax */
tax: number;
/** Currency */
currency: string;
/** Level */
level?: string | null;
};
/**
* TibberTestResponse
* @description Three-state response for POST /api/energy/tibber/test.
*
* Possible ``result`` values:
*
* - ``"success"`` — Tibber API responded with a valid price.
* - ``"config-error"`` — Token is missing or not configured.
* - ``"failed"`` — API call failed (auth rejected, network error, timeout, etc.).
*
* ``price`` is populated only on ``"success"``; it is null otherwise.
* ``message`` always contains a human-readable explanation.
*/
TibberTestResponse: {
/**
* Result
* @enum {string}
*/
result: "success" | "config-error" | "failed";
/** Message */
message: string;
price?: components["schemas"]["TibberTestPriceSchema"] | null;
};
/**
* TotpDisableRequest
* @description Disable TOTP by proving identity.
*
* Exactly one of ``password`` or ``code`` must be provided.
*/
TotpDisableRequest: {
/** Password */
password?: string | null;
/** Code */
code?: string | null;
};
/**
* TotpEnableRequest
* @description The user confirms setup by providing the 6-digit TOTP code.
*/
TotpEnableRequest: {
/** Code */
code: string;
};
/**
* TotpSetupResponse
* @description Returned once after a setup call.
*
* ``secret`` and ``recovery_codes`` are **one-time plaintext values**.
* They are never returned again by any subsequent API call.
* The frontend must display and instruct the user to save them before confirming.
*/
TotpSetupResponse: {
/** Secret */
secret: string;
/** Otpauth Uri */
otpauth_uri: string;
/** Recovery Codes */
recovery_codes: string[];
};
/**
* TotpStatusResponse
* @description Minimal status response — never exposes secret or recovery codes.
*/
TotpStatusResponse: {
/** Enabled */
enabled: boolean;
};
/** ValidationError */
ValidationError: {
/** Location */
loc: (string | number)[];
/** Message */
msg: string;
/** Error Type */
type: string;
};
/**
* VersionCreate
* @description Request body for POST /api/energy/contracts/{id}/versions.
*/
VersionCreate: {
/**
* Effective From
* Format: date-time
*/
effective_from: string;
/** Values */
values: {
[key: string]: unknown;
};
};
};
responses: never;
parameters: never;
requestBodies: never;
headers: never;
pathItems: never;
}
export type $defs = Record<string, never>;
export interface operations {
get_status_status_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["StatusResponse"];
};
};
};
};
get_config_api_config_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ConfigResponse"];
};
};
};
};
put_config_api_config_put: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ConfigUpdateRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ConfigUpdateResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_smtp_test_api_config_smtp_test_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SmtpTestResponse"];
};
};
/** @description Bad Request */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SmtpTestResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
/** @description Bad Gateway */
502: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SmtpTestResponse"];
};
};
};
};
post_mqtt_test_api_config_mqtt_test_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MqttTestResponse"];
};
};
/** @description Bad Request */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MqttTestResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
/** @description Bad Gateway */
502: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MqttTestResponse"];
};
};
};
};
get_locations_api_locations_get: {
parameters: {
query?: {
limit?: number;
offset?: number;
start?: string | null;
end?: string | null;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["LocationsResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_poo_api_poo_get: {
parameters: {
query?: {
limit?: number;
offset?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PooResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_public_ip_api_public_ip_get: {
parameters: {
query?: {
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PublicIPResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
delete_location_record_api_locations__person___datetime__delete: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
person: string;
datetime: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
patch_location_api_locations__person___datetime__patch: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
person: string;
datetime: string;
};
cookie?: never;
};
requestBody?: {
content: {
"application/json": components["schemas"]["LocationUpdateRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["LocationRecord"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
delete_poo_api_poo__timestamp__delete: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
timestamp: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
patch_poo_api_poo__timestamp__patch: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
timestamp: string;
};
cookie?: never;
};
requestBody?: {
content: {
"application/json": components["schemas"]["PooUpdateRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PooRecord"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_prices_api_energy_prices_get: {
parameters: {
query?: {
/** @description Inclusive start of the time window (ISO 8601). Defaults to the start of today UTC when omitted. */
start?: string | null;
/** @description Inclusive end of the time window (ISO 8601). Defaults to the end of tomorrow UTC when omitted. */
end?: string | null;
/** @description Maximum number of Tibber price points to return. */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PricesResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_costs_api_energy_costs_get: {
parameters: {
query?: {
/** @description Inclusive lower bound for period_start (ISO 8601). */
start?: string | null;
/** @description Inclusive upper bound for period_start (ISO 8601). */
end?: string | null;
/** @description Maximum number of cost periods to return (default 500, max 5000). */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CostsResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_costs_summary_api_energy_costs_summary_get: {
parameters: {
query?: {
/** @description Inclusive start of the summary interval (ISO 8601). Defaults to the start of the current UTC day. */
start?: string | null;
/** @description Exclusive end of the summary interval (ISO 8601). Defaults to the start of the next UTC day (i.e. today's full data). */
end?: string | null;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SummaryResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_dsmr_latest_api_energy_dsmr_latest_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["DsmrLatestResponse"];
};
};
};
};
post_recompute_api_energy_costs_recompute_post: {
parameters: {
query: {
/** @description Inclusive start of the recompute window (ISO 8601). Required. */
start: string;
/** @description Exclusive end of the recompute window (ISO 8601). Required. */
end: string;
};
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["RecomputeResponse"];
};
};
/** @description Validation error (missing window or range too large) */
422: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
post_tibber_test_api_energy_tibber_test_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["TibberTestResponse"];
};
};
/** @description Bad Request */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["TibberTestResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
/** @description Bad Gateway */
502: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["TibberTestResponse"];
};
};
};
};
get_profiles_api_energy_profiles_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ProfilesResponse"];
};
};
};
};
list_energy_contracts_api_energy_contracts_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ContractListResponse"];
};
};
};
};
create_energy_contract_api_energy_contracts_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ContractCreate"];
};
};
responses: {
/** @description Successful Response */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ContractDetailResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_energy_contract_api_energy_contracts__contract_id__get: {
parameters: {
query?: never;
header?: never;
path: {
contract_id: number;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ContractDetailResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
patch_energy_contract_api_energy_contracts__contract_id__patch: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
contract_id: number;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ContractPatch"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ContractDetailResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
add_contract_version_api_energy_contracts__contract_id__versions_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
contract_id: number;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["VersionCreate"];
};
};
responses: {
/** @description Successful Response */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ContractDetailResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_expose_api_expose_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ExposeResponse"];
};
};
};
};
put_expose_api_expose_put: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ExposeUpdateRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ExposeUpdateResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_expose_republish_api_expose_republish_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["RepublishResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_profiles_api_modbus_profiles_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusProfilesResponse"];
};
};
};
};
list_devices_api_modbus_devices_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusDeviceListResponse"];
};
};
};
};
create_device_api_modbus_devices_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ModbusDeviceCreate"];
};
};
responses: {
/** @description Successful Response */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusDeviceResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_device_api_modbus_devices__uuid__get: {
parameters: {
query?: never;
header?: never;
path: {
uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusDeviceResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
delete_device_api_modbus_devices__uuid__delete: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
patch_device_api_modbus_devices__uuid__patch: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
uuid: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ModbusDeviceUpdate"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusDeviceResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_latest_reading_api_modbus_devices__uuid__latest_get: {
parameters: {
query?: never;
header?: never;
path: {
uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusLatestResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_readings_api_modbus_devices__uuid__readings_get: {
parameters: {
query?: {
start?: string | null;
end?: string | null;
limit?: number;
};
header?: never;
path: {
uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusReadingsResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_metrics_api_modbus_devices__uuid__metrics_get: {
parameters: {
query?: never;
header?: never;
path: {
uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusMetricsResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
test_read_api_modbus_devices__uuid__test_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ModbusTestReadResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_session_api_session_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SessionResponse"];
};
};
};
};
post_login_api_auth_login_post: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["LoginRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SessionResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_logout_api_auth_logout_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_change_password_api_auth_password_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PasswordChangeRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_totp_setup_api_auth_totp_setup_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["TotpSetupResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_totp_enable_api_auth_totp_enable_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["TotpEnableRequest"];
};
};
responses: {
/** @description Successful Response */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_totp_disable_api_auth_totp_disable_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["TotpDisableRequest"];
};
};
responses: {
/** @description Successful Response */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_totp_status_api_auth_totp_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["TotpStatusResponse"];
};
};
};
};
publish_from_homeassistant_homeassistant_publish_post: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
};
};
create_location_record_location_record_post: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
};
};
create_poo_record_poo_record_post: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
};
};
notify_latest_poo_poo_latest_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
};
};
run_public_ip_check_public_ip_check_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PublicIPCheckResponse"];
};
};
};
};
start_ticktick_auth_ticktick_auth_start_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
};
};
handle_ticktick_auth_code_ticktick_auth_code_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
};
};
}