energy-app-middle Integration Guide
Overview
energy-app-middle is a BFF + API aggregation layer for the distributed energy management platform. It exposes REST APIs to three client types (Owner / Provider / Platform) and orchestrates calls to IoT Core, IoT PaaS, IAM, algorithm services, and time-series databases.
Quick Reference
| Client Type | Base Path | Audience |
|---|
| Owner API | /api/owner/* | Energy asset owners |
| Provider API | /api/provider/* | Service providers |
| Platform API | /platform-api/* | Platform admins |
| gRPC Server | port 9090 | Internal services |
| Management | port 38081 | Actuator / metrics |
1. Key REST Endpoints
Owner API (/api/owner/)
| Method | Path | Description |
|---|
| GET | /api/owner/der/control_record/{resourceId} | DER control records (paginated) |
| GET/POST | /api/owner/der/control_automation/{resourceId} | DER automation settings |
| POST | /api/owner/der/control_automation/{resourceId}/switch | Toggle automation on/off |
| POST | /api/owner/der/control_automation/{resourceId}/device | Device automation properties |
| GET/POST | /api/owner/project/price/{projectId} | Electricity pricing |
| GET | /api/owner/project/statistics/* | Project electricity statistics |
| GET | /api/owner/project/trend/* | Project trend charts |
| GET/POST | /api/owner/der/plan_prompt/* | DER plan prompts |
Provider API (/api/provider/)
| Method | Path | Description |
|---|
| GET | /api/provider/der/{resourceId}/billing_type | Billing type (TOU/Market) |
| GET/POST | /api/provider/der/{resourceId}/market_price_config | Market price configs |
Platform API (/platform-api/)
| Method | Path | Description |
|---|
| GET | /platform-api/market/config?marketCode={code} | Market metric configurations |
| POST | /platform-api/data | Query market metric data |
2. Authentication & Headers
Token validation is delegated to IAM via gRPC. All requests must carry:
| Header | Description |
|---|
X-ACCESS-TOKEN | JWT token (validated by IAM) |
X-App | App code |
X-Tenant | Tenant code |
X-UID | User UID (set by gateway) |
X-PUID | Parent UID (for sub-accounts) |
All data is tenant-scoped — tenantCode is extracted from request context and applied to every query.
3. gRPC Integration (Internal Services)
Dependency
<dependency>
<groupId>com.feilun</groupId>
<artifactId>energy-app-middle-grpc-interface</artifactId>
</dependency>
Client Configuration
grpc:
client:
energy-app-middle:
address: dns:///energy-app-middle.${K8S_POD_NS}.svc.cluster.local:9090
negotiationType: PLAINTEXT
enableKeepAlive: true
4. Downstream Dependencies
| Service | Protocol | Purpose |
|---|
iam | gRPC | Token validation, authorization |
iot-core | gRPC | Device management & queries |
iot-paas | gRPC | Device grouping, batch tasks |
basic | gRPC | Infrastructure services |
algorithm-der-power-forecast | HTTP | PV power forecasting |
algorithm-dispatch | HTTP | DR dispatch planning |
algorithm-bess-opt | HTTP | Battery storage optimization |
algorithm-bid | HTTP | VPP spot bidding |
| MySQL | JDBC | Transactional data |
| TDEngine | JDBC | Time-series device metrics |
| RisingWave | JDBC | Real-time metric aggregation |
| Apache Pulsar | Messaging | Device events, market data |
| PowerJob | HTTP | Distributed job scheduling |
5. Key DTOs
DerAutomationSettingsReq:
dailyMaxImport/Export, dailyMinimalImport/Export (Double)
maximumExportPower/ImportPower (Double)
opportunityImportPrice/ExportPrice (Double)
DerControlRecordRes:
resourceId, controlCode, status
startTime, endTime, controlDate
controlCurve (JSON array of power points)
MarketMetricDataReq:
marketCode (AEMO_REGIONS: NSW1/QLD1/VIC1/SA1/TAS1)
metrics (List<String>), targetId, startTime, endTime
6. Environment Variables
| Variable | Purpose |
|---|
K8S_POD_NS | Kubernetes namespace (used in gRPC addresses) |
BIZ_NAME | Business code (energy-app-middle) |
SPRING_PROFILES_ACTIVE | Profile (localdev / prod) |
k8s.all.mysql.host/port | MySQL connection |
k8s.eam.mysql.database | MySQL database name |
k8s.all.tdengine.host | TDEngine host |
k8s.all.risingwave.host/port | RisingWave connection |
k8s.all.pulsar.service-url | Pulsar broker URL |
k8s.all.powerjob.worker.server-address | PowerJob server |
7. Common Mistakes
| Mistake | Fix |
|---|
Missing X-Tenant header | Required for all requests — tenant isolation is enforced |
Calling gRPC without X-UID/X-PUID | IoT PaaS interceptor requires both headers |
| Querying metrics without time range | TDEngine/RisingWave queries require startTime + endTime |
Wrong marketCode | AEMO regions: NSW1, QLD1, VIC1, SA1, TAS1 only |