M8-T06: add meter source management API

This commit is contained in:
2026-08-23 21:22:05 +02:00
parent 1ea2f659e0
commit 5855fff451
10 changed files with 3857 additions and 8 deletions
+811
View File
@@ -638,6 +638,166 @@ export interface paths {
patch: operations["patch_energy_meter_api_energy_meters__meter_id__patch"];
trace?: never;
};
"/api/energy/source-profiles": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Source Profiles
* @description Return profile metadata; default secrets are never populated with stored values.
*/
get: operations["source_profiles_api_energy_source_profiles_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/commodities": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Commodities */
get: operations["commodities_api_energy_commodities_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/sources": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get Sources */
get: operations["get_sources_api_energy_sources_get"];
put?: never;
/** Post Source */
post: operations["post_source_api_energy_sources_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/sources/{source_uuid}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get Source Detail */
get: operations["get_source_detail_api_energy_sources__source_uuid__get"];
put?: never;
post?: never;
/** Remove Source */
delete: operations["remove_source_api_energy_sources__source_uuid__delete"];
options?: never;
head?: never;
/** Patch Source */
patch: operations["patch_source_api_energy_sources__source_uuid__patch"];
trace?: never;
};
"/api/energy/sources/{source_uuid}/discover": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Discover Source */
post: operations["discover_source_api_energy_sources__source_uuid__discover_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/sources/{source_uuid}/channels": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Source Channels */
get: operations["source_channels_api_energy_sources__source_uuid__channels_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/sources/{source_uuid}/channels/{channel_uuid}/readings": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Channel Readings */
get: operations["channel_readings_api_energy_sources__source_uuid__channels__channel_uuid__readings_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/meters/{meter_id}/bindings": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Meter Bindings */
get: operations["meter_bindings_api_energy_meters__meter_id__bindings_get"];
put?: never;
/** Post Meter Binding */
post: operations["post_meter_binding_api_energy_meters__meter_id__bindings_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/energy/bindings/{binding_uuid}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Patch Binding */
patch: operations["patch_binding_api_energy_bindings__binding_uuid__patch"];
trace?: never;
};
"/api/expose": {
parameters: {
query?: never;
@@ -1230,6 +1390,60 @@ export interface paths {
export type webhooks = Record<string, never>;
export interface components {
schemas: {
/** BindingCreate */
BindingCreate: {
/** Source Channel Uuid */
source_channel_uuid: string;
/**
* Started At
* Format: date-time
*/
started_at: string;
/** Ended At */
ended_at?: string | null;
};
/** BindingListResponse */
BindingListResponse: {
/** Items */
items: components["schemas"]["BindingResponse"][];
/** Total */
total: number;
};
/** BindingPatch */
BindingPatch: {
/** Started At */
started_at?: string | null;
/** Ended At */
ended_at?: string | null;
};
/** BindingResponse */
BindingResponse: {
/** Uuid */
uuid: string;
/** Meter Id */
meter_id: number;
/** Source Channel Uuid */
source_channel_uuid: string;
/** Source Uuid */
source_uuid: string;
/**
* Started At
* Format: date-time
*/
started_at: string;
/** Ended At */
ended_at: string | null;
/**
* Created At
* Format: date-time
*/
created_at: string;
/**
* Updated At
* Format: date-time
*/
updated_at: string;
};
/**
* CatalogEntrySchema
* @description An entity from the catalog with its current toggle state.
@@ -1239,6 +1453,39 @@ export interface components {
/** Enabled */
enabled: boolean;
};
/** ChannelReadingResponse */
ChannelReadingResponse: {
/**
* Recorded At
* Format: date-time
*/
recorded_at: string;
/** Value */
value?: string | null;
/** Quality */
quality?: string | null;
};
/** ChannelReadingsResponse */
ChannelReadingsResponse: {
/** Items */
items: components["schemas"]["ChannelReadingResponse"][];
/** Total */
total: number;
};
/** CommoditiesResponse */
CommoditiesResponse: {
/** Items */
items: components["schemas"]["CommodityResponse"][];
};
/** CommodityResponse */
CommodityResponse: {
/** Key */
key: string;
/** Unit */
unit: string;
/** Capabilities */
capabilities: string[];
};
/** ConfigField */
ConfigField: {
/** Env Name */
@@ -1506,6 +1753,17 @@ export interface components {
/** Name */
name: string;
};
/** DiscoverResponse */
DiscoverResponse: {
/** Requested */
requested: boolean;
/** Supported */
supported: boolean;
/** Status */
status: string;
/** Detail */
detail?: string | null;
};
/**
* DsmrLatestResponse
* @description Response for GET /api/energy/dsmr/latest.
@@ -1653,6 +1911,25 @@ export interface components {
*/
sell_normal: number;
};
/**
* MeterBindingSummary
* @description Stable, non-sensitive binding identity embedded in meter responses.
*/
MeterBindingSummary: {
/** Uuid */
uuid: string;
/** Source Channel Uuid */
source_channel_uuid: string;
/** Source Uuid */
source_uuid: string;
/**
* Started At
* Format: date-time
*/
started_at: string;
/** Ended At */
ended_at: string | null;
};
/**
* MeterDeclareRequest
* @description Request body for POST /api/energy/meters.
@@ -1689,6 +1966,11 @@ export interface components {
* @default electricity
*/
commodity: string;
/**
* Source Channel Uuid
* @description Optional compatible source channel to bind atomically to this meter.
*/
source_channel_uuid?: string | null;
};
/**
* MeterListResponse
@@ -1760,6 +2042,103 @@ export interface components {
* Format: date-time
*/
created_at: string;
/** Bindings */
bindings?: components["schemas"]["MeterBindingSummary"][];
};
/** MeterSourceChannelListResponse */
MeterSourceChannelListResponse: {
/** Items */
items: components["schemas"]["MeterSourceChannelResponse"][];
/** Total */
total: number;
};
/** MeterSourceChannelResponse */
MeterSourceChannelResponse: {
/** Uuid */
uuid: string;
/** Label */
label: string;
/** Suggested Commodity */
suggested_commodity: string | null;
/** Unit */
unit: string;
/** Device Type */
device_type: string | null;
/** Latest Value */
latest_value: string | null;
/** Latest At */
latest_at: string | null;
/** Latest Quality */
latest_quality: string | null;
/** Binding Count */
binding_count: number;
/** Bound Meter Ids */
bound_meter_ids: number[];
};
/** MeterSourceCreate */
MeterSourceCreate: {
/** Name */
name: string;
/** Kind */
kind: string;
/** Config */
config?: {
[key: string]: unknown;
};
/**
* Enabled
* @default true
*/
enabled: boolean;
};
/** MeterSourceListResponse */
MeterSourceListResponse: {
/** Items */
items: components["schemas"]["MeterSourceResponse"][];
/** Total */
total: number;
};
/** MeterSourcePatch */
MeterSourcePatch: {
/** Name */
name?: string | null;
/** Config */
config?: {
[key: string]: unknown;
} | null;
/** Enabled */
enabled?: boolean | null;
};
/** MeterSourceResponse */
MeterSourceResponse: {
/** Uuid */
uuid: string;
/** Name */
name: string;
/** Kind */
kind: string;
/** Enabled */
enabled: boolean;
/** Config */
config: {
[key: string]: unknown;
};
/** Status */
status: string;
/** Last Seen At */
last_seen_at: string | null;
/** Last Error */
last_error: string | null;
/**
* Created At
* Format: date-time
*/
created_at: string;
/**
* Updated At
* Format: date-time
*/
updated_at: string;
};
/**
* MetricInfo
@@ -2216,6 +2595,39 @@ export interface components {
/** Message */
message: string;
};
/** SourceConfigFieldResponse */
SourceConfigFieldResponse: {
/** Name */
name: string;
/** Value Type */
value_type: string;
/** Default */
default?: unknown;
/** Required */
required: boolean;
/** Secret */
secret: boolean;
};
/** SourceProfileResponse */
SourceProfileResponse: {
/** Kind */
kind: string;
/** Fields */
fields: components["schemas"]["SourceConfigFieldResponse"][];
/** Defaults */
defaults: {
[key: string]: unknown;
};
/** Capabilities */
capabilities: string[];
/** Allowed Units */
allowed_units: string[];
};
/** SourceProfilesResponse */
SourceProfilesResponse: {
/** Items */
items: components["schemas"]["SourceProfileResponse"][];
};
/** StatusResponse */
StatusResponse: {
/** Status */
@@ -3303,6 +3715,405 @@ export interface operations {
};
};
};
source_profiles_api_energy_source_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"]["SourceProfilesResponse"];
};
};
};
};
commodities_api_energy_commodities_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"]["CommoditiesResponse"];
};
};
};
};
get_sources_api_energy_sources_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"]["MeterSourceListResponse"];
};
};
};
};
post_source_api_energy_sources_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["MeterSourceCreate"];
};
};
responses: {
/** @description Successful Response */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MeterSourceResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_source_detail_api_energy_sources__source_uuid__get: {
parameters: {
query?: never;
header?: never;
path: {
source_uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MeterSourceResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
remove_source_api_energy_sources__source_uuid__delete: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
source_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_source_api_energy_sources__source_uuid__patch: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
source_uuid: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["MeterSourcePatch"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MeterSourceResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
discover_source_api_energy_sources__source_uuid__discover_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
source_uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["DiscoverResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
source_channels_api_energy_sources__source_uuid__channels_get: {
parameters: {
query?: never;
header?: never;
path: {
source_uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MeterSourceChannelListResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
channel_readings_api_energy_sources__source_uuid__channels__channel_uuid__readings_get: {
parameters: {
query?: {
limit?: number;
start?: string | null;
end?: string | null;
};
header?: never;
path: {
source_uuid: string;
channel_uuid: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChannelReadingsResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
meter_bindings_api_energy_meters__meter_id__bindings_get: {
parameters: {
query?: never;
header?: never;
path: {
meter_id: number;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["BindingListResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
post_meter_binding_api_energy_meters__meter_id__bindings_post: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
meter_id: number;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["BindingCreate"];
};
};
responses: {
/** @description Successful Response */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["BindingResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
patch_binding_api_energy_bindings__binding_uuid__patch: {
parameters: {
query?: never;
header?: {
"X-CSRF-Token"?: string | null;
};
path: {
binding_uuid: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["BindingPatch"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["BindingResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_expose_api_expose_get: {
parameters: {
query?: never;