Skip to main content

Metering API

Usage​

import { epilot } from '@epilot/sdk'

epilot.authorize(() => '<token>')
const { data } = await epilot.metering.getCustomerMeters(...)

Tree-shakeable import​

import { getClient, authorize } from '@epilot/sdk/metering'

const meteringClient = getClient()
authorize(meteringClient, () => '<token>')
const { data } = await meteringClient.getCustomerMeters(...)

Operations​

ECP

ECP Admin

Schemas

getCustomerMeters​

Get Customer Meters

GET /v1/metering/meter

const { data } = await client.getCustomerMeters()
Response
{
"data": [
{
"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_title": "Example Entity",
"_org": "123",
"_tags": ["example", "mock"],
"_created_at": "2021-02-09T12:41:43.662Z",
"_updated_at": "2021-02-09T12:41:43.662Z",
"_schema": "meter",
"ma_lo_id": "A09-123",
"status": "active",
"meter_type": "three-phase-meter",
"tariff_type": "Peak load tariff",
"meter_number": "J-1093-1AK",
"sector": "power",
"location": [
{
"country": "Germany",
"city": "Koln",
"postal_code": 81475,
"street": "MelatengΓΌrtel",
"street_number": 71,
"additional_info": "5. Etage",
"_tags": ["billing", "delivery"]
}
],
"used_for": "Domestic Usage",
"manufacturer": "Energy One",
"calibration_date": "2022-10-10T00:00:00.000Z",
"contract": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
},
"customer": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
},
"journey_actions": {
"journey_id": "string",
"action_label": {
"en": "string",
"de": "string"
},
"slug": "string",
"rules": [
{
"entity": "string",
"attribute": "string",
"attribute_value": "string"
}
]
},
"last_reading": "2022-10-10T00:00:00.000Z",
"current_consumption": 100.5
}
]
}

getMetersByContractId​

Retrieves all meters related to a contract.

GET /v1/metering/contract/meters/{contract_id}

const { data } = await client.getMetersByContractId({
contract_id: 'example',
})
Response
{
"data": [
{
"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_title": "Example Entity",
"_org": "123",
"_tags": ["example", "mock"],
"_created_at": "2021-02-09T12:41:43.662Z",
"_updated_at": "2021-02-09T12:41:43.662Z",
"_schema": "meter",
"ma_lo_id": "A09-123",
"status": "active",
"meter_type": "three-phase-meter",
"tariff_type": "Peak load tariff",
"meter_number": "J-1093-1AK",
"sector": "power",
"location": [
{
"country": "Germany",
"city": "Koln",
"postal_code": 81475,
"street": "MelatengΓΌrtel",
"street_number": 71,
"additional_info": "5. Etage",
"_tags": ["billing", "delivery"]
}
],
"used_for": "Domestic Usage",
"manufacturer": "Energy One",
"calibration_date": "2022-10-10T00:00:00.000Z",
"contract": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
},
"customer": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
}
}
]
}

updateMeter​

Update Meter

PATCH /v1/metering/meter/{id}

const { data } = await client.updateMeter(
{
id: '123e4567-e89b-12d3-a456-426614174000',
},
{},
)
Response
{
"data": {
"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_title": "Example Entity",
"_org": "123",
"_tags": ["example", "mock"],
"_created_at": "2021-02-09T12:41:43.662Z",
"_updated_at": "2021-02-09T12:41:43.662Z",
"_schema": "meter",
"ma_lo_id": "A09-123",
"status": "active",
"meter_type": "three-phase-meter",
"tariff_type": "Peak load tariff",
"meter_number": "J-1093-1AK",
"sector": "power",
"location": [
{
"country": "Germany",
"city": "Koln",
"postal_code": 81475,
"street": "MelatengΓΌrtel",
"street_number": 71,
"additional_info": "5. Etage",
"_tags": ["billing", "delivery"]
}
],
"used_for": "Domestic Usage",
"manufacturer": "Energy One",
"calibration_date": "2022-10-10T00:00:00.000Z",
"contract": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
},
"customer": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
}
}
}

getMeter​

Get Meter

GET /v1/metering/meter/{id}

const { data } = await client.getMeter({
id: '123e4567-e89b-12d3-a456-426614174000',
})
Response
{
"data": {
"entity": {
"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_title": "Example Entity",
"_org": "123",
"_tags": ["example", "mock"],
"_created_at": "2021-02-09T12:41:43.662Z",
"_updated_at": "2021-02-09T12:41:43.662Z",
"_schema": "meter",
"ma_lo_id": "A09-123",
"status": "active",
"meter_type": "three-phase-meter",
"tariff_type": "Peak load tariff",
"meter_number": "J-1093-1AK",
"sector": "power",
"location": [
{
"country": "Germany",
"city": "Koln",
"postal_code": 81475,
"street": "MelatengΓΌrtel",
"street_number": 71,
"additional_info": "5. Etage",
"_tags": ["billing", "delivery"]
}
],
"used_for": "Domestic Usage",
"manufacturer": "Energy One",
"calibration_date": "2022-10-10T00:00:00.000Z",
"contract": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
},
"customer": {
"$relation": [
{
"entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_slug": "contact"
}
]
}
},
"journey_actions": {
"journey_id": "string",
"action_label": {
"en": "string",
"de": "string"
},
"slug": "string",
"rules": [
{
"entity": "string",
"attribute": "string",
"attribute_value": "string"
}
]
},
"relations": [
{
"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_title": "Example Entity",
"_org": "123",
"_tags": ["example", "mock"],
"_created_at": "2021-02-09T12:41:43.662Z",
"_updated_at": "2021-02-09T12:41:43.662Z"
}
]
}
}

getMeterCounters​

Get Meter Counters

GET /v1/metering/counter

const { data } = await client.getMeterCounters({
meter_id: 'example',
})
Response
{
"data": [
{
"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_title": "Example Entity",
"_org": "123",
"_tags": ["example", "mock"],
"_created_at": "2021-02-09T12:41:43.662Z",
"_updated_at": "2021-02-09T12:41:43.662Z",
"_schema": "meter_counter",
"obis_number": "A-34",
"direction": "feed-in",
"transformer_ratio": 70,
"unit": "string",
"forecast_reading_value": 270,
"forecast_as_of": "2022-12-10T00:00:00.000Z",
"current_consumption": 240,
"last_reading": "2022-10-10T00:00:00.000Z",
"conversion_factor": 3,
"tariff_type": "ht"
}
]
}

getCounterDetails​

Get Counter Details

GET /v1/metering/counter/{counter_id}

const { data } = await client.getCounterDetails({
counter_id: 'example',
})
Response
{
"data": {
"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"_title": "Example Entity",
"_org": "123",
"_tags": ["example", "mock"],
"_created_at": "2021-02-09T12:41:43.662Z",
"_updated_at": "2021-02-09T12:41:43.662Z",
"_schema": "meter_counter",
"obis_number": "A-34",
"direction": "feed-in",
"transformer_ratio": 70,
"unit": "string",
"forecast_reading_value": 270,
"forecast_as_of": "2022-12-10T00:00:00.000Z",
"current_consumption": 240,
"last_reading": "2022-10-10T00:00:00.000Z",
"conversion_factor": 3,
"tariff_type": "ht"
}
}

createMeterReading​

Create Meter Reading

POST /v1/metering/reading

const { data } = await client.createMeterReading(
null,
{
value: 240,
read_by: 'John Doe',
reason: '',
meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
direction: 'feed-in',
timestamp: '2022-10-10T00:00:00.000Z',
source: 'ECP',
status: 'valid',
external_id: 'string',
remark: 'Customer reported unusual consumption',
metadata: {
registration_id: '1234567890',
business_unit: 'ABC'
},
note: 'string',
unit: 'string'
},
)
Response
{
"data": {
"value": 240,
"read_by": "John Doe",
"reason": "",
"meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"direction": "feed-in",
"timestamp": "2022-10-10T00:00:00.000Z",
"source": "ECP",
"status": "valid",
"external_id": "string",
"remark": "Customer reported unusual consumption",
"metadata": {
"registration_id": "1234567890",
"business_unit": "ABC"
},
"note": "string",
"unit": "string"
}
}

createMeterReadings​

Create Meter Readings

POST /v1/metering/readings

const { data } = await client.createMeterReadings(
{
async: true,
activity_id: 'example',
skip_validation: true,
},
{
readings: [
{
value: 240,
read_by: 'John Doe',
reason: '',
meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
direction: 'feed-in',
timestamp: '2022-10-10T00:00:00.000Z',
source: 'ECP',
status: 'valid',
external_id: 'string',
remark: 'Customer reported unusual consumption',
metadata: {
registration_id: '1234567890',
business_unit: 'ABC'
},
note: 'string',
unit: 'string'
}
]
},
)
Response
{
"data": [
{
"value": 240,
"read_by": "John Doe",
"reason": "",
"meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"direction": "feed-in",
"timestamp": "2022-10-10T00:00:00.000Z",
"source": "ECP",
"status": "valid",
"external_id": "string",
"remark": "Customer reported unusual consumption",
"metadata": {
"registration_id": "1234567890",
"business_unit": "ABC"
},
"note": "string",
"unit": "string"
}
]
}

createPortalMeterReadings​

Inserts multiple meter readings at once for a given meter. Limited to 2 readings per request.

POST /v1/metering/readings/{meter_id}

const { data } = await client.createPortalMeterReadings(
{
meter_id: 'example',
},
{
readings: [
{
value: 240,
read_by: 'John Doe',
reason: '',
meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
direction: 'feed-in',
timestamp: '2022-10-10T00:00:00.000Z',
source: 'ECP',
status: 'valid',
external_id: 'string',
remark: 'Customer reported unusual consumption',
metadata: {
registration_id: '1234567890',
business_unit: 'ABC'
},
note: 'string',
unit: 'string'
}
]
},
)
Response
{
"data": [
{
"value": 240,
"read_by": "John Doe",
"reason": "",
"meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"direction": "feed-in",
"timestamp": "2022-10-10T00:00:00.000Z",
"source": "ECP",
"status": "valid",
"external_id": "string",
"remark": "Customer reported unusual consumption",
"metadata": {
"registration_id": "1234567890",
"business_unit": "ABC"
},
"note": "string",
"unit": "string"
}
]
}

batchWriteMeterReadings​

Batch Write Readings

POST /v2/metering/readings

const { data } = await client.batchWriteMeterReadings(
{
async: true,
skip_validation: true,
activity_id: 'example',
},
{
identifiers: ['string'],
readings: [
{
value: 240,
read_by: 'John Doe',
reason: '',
meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
direction: 'feed-in',
timestamp: '2022-10-10T00:00:00.000Z',
source: 'ECP',
status: 'valid',
external_id: 'string',
remark: 'Customer reported unusual consumption',
metadata: {
registration_id: '1234567890',
business_unit: 'ABC'
},
note: 'string',
unit: 'string',
operation: 'create'
}
]
},
)
Response
{
"data": [
{
"value": 240,
"read_by": "John Doe",
"reason": "",
"meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"direction": "feed-in",
"timestamp": "2022-10-10T00:00:00.000Z",
"source": "ECP",
"status": "valid",
"external_id": "string",
"remark": "Customer reported unusual consumption",
"metadata": {
"registration_id": "1234567890",
"business_unit": "ABC"
},
"note": "string",
"unit": "string"
}
]
}

createMeterReadingFromSubmission​

Create Meter Reading from Submission

POST /v1/metering/reading/submission

const { data } = await client.createMeterReadingFromSubmission(
null,
{
org_id: '123',
entity: {
_org: '123',
meterReadings: [
{
meterId: 'string',
readings: [
{
counterId: 'string',
direction: 'feed-in',
unit: 'string',
value: 240
}
],
readingValue: 240,
readingDate: '2022-10-10T10:10:00.000Z',
readBy: 'John Doe',
reason: '',
maloId: 'A09-123',
obisNumber: 'A-34',
readingUnit: 'string',
meterType: 'one_tariff',
feedInValue: 240,
feedOutValue: 240,
htValue: 240,
ntValue: 240
}
]
}
},
)
Response
{
"message": "Successfully Processed"
}

getAllowedReadingForMeter​

Get allowed reading for the given meter

GET /v1/metering/allowed/reading/{meter_id}

const { data } = await client.getAllowedReadingForMeter({
meter_id: 'example',
timestamp: 'example',
})
Response
{
"data": [
{
"counter_id": "string",
"min_value": 0,
"max_value": 0
}
]
}

createReadingWithMeter​

Create Reading with Meter

POST /v1/metering/reading/with-meter

const { data } = await client.createReadingWithMeter(
null,
{
ma_lo_id: 'A09-123',
meter_id: 'string',
obis_number: 'A-34',
unit: 'string',
direction: 'feed-in',
tariff_type: 'ht',
value: 240,
read_by: 'John Doe',
reason: '',
timestamp: '2022-10-10T10:10:00.000Z',
source: 'ECP'
},
)
Response
{
"data": {
"value": 240,
"read_by": "John Doe",
"reason": "",
"meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"direction": "feed-in",
"timestamp": "2022-10-10T00:00:00.000Z",
"source": "ECP",
"status": "valid",
"external_id": "string",
"remark": "Customer reported unusual consumption",
"metadata": {
"registration_id": "1234567890",
"business_unit": "ABC"
},
"note": "string",
"unit": "string"
}
}

getReadingsByInterval​

Get Readings by Interval

GET /v1/metering/reading/{meter_id}/{counter_id}

const { data } = await client.getReadingsByInterval({
meter_id: 'example',
counter_id: 'example',
start_date: 'example',
end_date: 'example',
direction: 'example',
size: 1,
from: 1,
type: 'example',
sort: 'example',
})
Response
{
"results": [
{
"value": 240,
"read_by": "John Doe",
"reason": "",
"meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"direction": "feed-in",
"timestamp": "2022-10-10T00:00:00.000Z",
"source": "ECP",
"status": "valid",
"external_id": "string",
"remark": "Customer reported unusual consumption",
"metadata": {
"registration_id": "1234567890",
"business_unit": "ABC"
},
"note": "string",
"unit": "string"
}
],
"hits": 120,
"firstRecordCreatedAt": "2022-10-01T20:00:00.000Z"
}

updateMeterReading​

Update Meter Reading

PUT /v1/metering/reading/{meter_id}/{counter_id}

const { data } = await client.updateMeterReading(
{
meter_id: 'example',
counter_id: 'example',
timestamp: 'example',
},
{
value: 240,
read_by: 'John Doe',
reason: 'string',
meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
direction: 'feed-in',
timestamp: '2022-10-10T00:00:00.000Z',
source: 'ECP',
status: 'valid',
external_id: 'string',
remark: 'Customer reported unusual consumption',
metadata: {
registration_id: '1234567890',
business_unit: 'ABC'
}
},
)
Response
{
"data": {
"value": 240,
"read_by": "John Doe",
"reason": "",
"meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"direction": "feed-in",
"timestamp": "2022-10-10T00:00:00.000Z",
"source": "ECP",
"status": "valid",
"external_id": "string",
"remark": "Customer reported unusual consumption",
"metadata": {
"registration_id": "1234567890",
"business_unit": "ABC"
},
"note": "string",
"unit": "string"
}
}

deleteMeterReading​

Delete Meter Reading

DELETE /v1/metering/reading/{meter_id}/{counter_id}

const { data } = await client.deleteMeterReading({
meter_id: 'example',
counter_id: 'example',
timestamp: 'example',
})
Response
{
"data": {
"meterId": "string",
"counterId": "string",
"timestamp": "2022-10-01T20:00:00.000Z"
}
}

Schemas​

ErrorResp​

type ErrorResp = {
message?: string
}

EntityId​

type EntityId = string // uuid

EntitySlug​

URL-friendly identifier for the entity schema

type EntitySlug = string

BaseEntity​

type BaseEntity = {
_id: string // uuid
_title: string
_org: string
_tags?: string[]
_created_at: string // date-time
_updated_at: string // date-time
}

Entity​

type Entity = Record<string, unknown>

EntityItem​

type EntityItem = {
_id: string // uuid
_title: string
_org: string
_tags?: string[]
_created_at: string // date-time
_updated_at: string // date-time
}

Id​

type Id = string

EntityRelation​

type EntityRelation = {
entity_id?: string // uuid
_slug?: "contact" | "contract"
}

Meter​

type Meter = {
_id: string // uuid
_title: string
_org: string
_tags?: string[]
_created_at: string // date-time
_updated_at: string // date-time
_schema: "meter"
ma_lo_id?: string
status?: "active" | "decommissioned"
meter_type?: "three-phase-meter" | "bellow-gas-meter" | "rotary-piston-meter" | "smart-meter" | "performance-meter" | "maximum-meter" | "turbine-gas-meter" | "ultrasonic-gas-meter" | "alternating-current-meter" | "modern-metering-system" | "intelligent-measuring-system" | "electronic-meter"
tariff_type?: string
meter_number?: string
sector?: "power" | "water" | "gas" | "district_heating" | "waste_water"
location?: object
used_for?: string
manufacturer?: string
calibration_date?: string
contract?: {
$relation?: Array<{
entity_id?: { ... }
_slug?: { ... }
}>
}
customer?: {
$relation?: Array<{
entity_id?: { ... }
_slug?: { ... }
}>
}
}

Direction​

type Direction = "feed-in" | "feed-out"

TariffType​

type TariffType = "ht" | "nt"

Reason​

The reason for recording the reading If no reason is specified or left empty, the Epilot UI will show 'Regular' as the default display text

type Reason = "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"

ReasonString​

This field is deprecated. Please use the Reason enum instead.

type ReasonString = string

ReadBy​

The person who recorded the reading

type ReadBy = string

ReadingStatus​

type ReadingStatus = "valid" | "in-validation" | "implausible" | null | ""

Reading​

type Reading = {
value: number
read_by?: string
reason?: "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"
meter_id?: string // uuid
counter_id?: string // uuid
direction?: "feed-in" | "feed-out"
timestamp?: string // date-time
source: "ECP" | "ERP" | "360" | "journey-submission"
status?: "valid" | "in-validation" | "implausible" | null | ""
external_id?: string
remark?: string
metadata?: Record<string, string>
note?: string
unit?: string
}

MeterReading​

type MeterReading = {
value: number
read_by?: string
reason?: "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"
meter_id: string // uuid
counter_id?: string // uuid
direction?: "feed-in" | "feed-out"
timestamp?: string // date-time
source: "ECP" | "ERP" | "360" | "journey-submission"
status?: "valid" | "in-validation" | "implausible" | null | ""
external_id?: string
remark?: string
metadata?: Record<string, string>
note?: string
unit?: string
}

PortalMeterReading​

type PortalMeterReading = {
value: number
read_by?: string
reason?: "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"
meter_id?: string // uuid
counter_id: string // uuid
direction?: "feed-in" | "feed-out"
timestamp?: string // date-time
source: "ECP" | "ERP" | "360" | "journey-submission"
status?: "valid" | "in-validation" | "implausible" | null | ""
external_id?: string
remark?: string
metadata?: Record<string, string>
note?: string
unit?: string
}

UpdateMeterReading​

type UpdateMeterReading = {
value: number
read_by?: string
reason?: string
meter_id: string // uuid
counter_id?: string // uuid
direction?: "feed-in" | "feed-out"
timestamp?: string // date-time
source: "ECP" | "ERP" | "360" | "journey-submission"
status?: "valid" | "in-validation" | "implausible" | null | ""
external_id?: string
remark?: string
metadata?: Record<string, string>
}

MeterCounter​

type MeterCounter = {
_id: string // uuid
_title: string
_org: string
_tags?: string[]
_created_at: string // date-time
_updated_at: string // date-time
_schema: "meter_counter"
obis_number?: string
direction?: "feed-in" | "feed-out"
transformer_ratio?: number
unit?: string
forecast_reading_value?: string
forecast_as_of?: string
current_consumption?: number
last_reading?: string
conversion_factor?: number
tariff_type?: "ht" | "nt"
}

CounterReadingOnSubmission​

type CounterReadingOnSubmission = {
counterId: string
direction: "feed-in" | "feed-out"
unit?: string
value: number
}

SubmissionMeterReading​

type SubmissionMeterReading = {
meterId: string
readings?: Array<{
counterId: string
direction: "feed-in" | "feed-out"
unit?: string
value: number
}>
readingValue?: number
readingDate?: string
readBy?: string
reason?: "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"
maloId?: string
obisNumber?: string
readingUnit?: string
meterType?: "one_tariff" | "two_tariff" | "bi_directional"
feedInValue?: number
feedOutValue?: number
htValue?: number
ntValue?: number
}

Unit​

type Unit = string

Source​

type Source = "ECP" | "ERP" | "360" | "journey-submission"

ActionLabel​

type ActionLabel = {
en?: string
de?: string
}

Rule​

type Rule = {
entity?: string
attribute?: string
attribute_value?: string
}

JourneyActions​

type JourneyActions = {
journey_id?: string
action_label?: {
en?: string
de?: string
}
slug?: string
rules?: Array<{
entity?: string
attribute?: string
attribute_value?: string
}>
}

ReadingWithMeter​

type ReadingWithMeter = {
ma_lo_id?: string
meter_id?: string
obis_number?: string
unit?: string
direction?: "feed-in" | "feed-out"
tariff_type?: "ht" | "nt"
value?: number
read_by?: string
reason?: "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"
timestamp?: string
source?: "ECP" | "ERP" | "360" | "journey-submission"
}

ActivityId​

See https://github.com/ulid/spec

type ActivityId = string // ulid