Install
openclaw skills install @effort02/energy-app-middle-integrationUse when integrating with the energy-app-middle BFF service - covers REST API endpoints, gRPC client setup, authentication headers, multi-tenancy, and downstream service dependencies for the changyuanfeilun energy platform.
openclaw skills install @effort02/energy-app-middle-integrationenergy-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.
| 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 |
/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 |
/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/)| Method | Path | Description |
|---|---|---|
| GET | /platform-api/market/config?marketCode={code} | Market metric configurations |
| POST | /platform-api/data | Query market metric data |
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.
<dependency>
<groupId>com.feilun</groupId>
<artifactId>energy-app-middle-grpc-interface</artifactId>
</dependency>
grpc:
client:
energy-app-middle:
address: dns:///energy-app-middle.${K8S_POD_NS}.svc.cluster.local:9090
negotiationType: PLAINTEXT
enableKeepAlive: true
| 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 |
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
| 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 |
| 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 |