本文为您介绍如何通过SDK调用如下算法API:CreatePowerForecastJob- 创建功率预测任务。
前提条件
已安装SDK,并已获取云账号AK信息。
接口参数
请求参数
字段名称 | 字段详情 |
DeviceType string | 设备类型,每个systemType支持的设备类型有: 系统类型:设备类型
示例值: solarInverter |
- HistoryData array<object> | 历史功率数据,需要 90 天的历史数据 子级条数 <= 100000子级条数 >= 1 |
--- object | |
----RunTime string | 每{freq}分钟,"yyyy-MM-dd HH:mm:ss", 数据频率需与 freq 字段对齐 示例值:2025-02-12 00:00:00 |
----Value number<double> | 功率数据 示例值:1.0 |
Freq string | 默认 15min;需要与 historyData 的数据频率一致;枚举值:
示例值:FIFTEEN_MIN枚举值:FIFTEEN_MINFIVE_MINONE_HOURONE_DAY |
Duration integer<int32> | 从运行日(含)开始, 预测时长(单位:天) 非必填,默认 1 天 示例值:1 |
SystemType string | 系统类型,支持的系统类型有: solar: 光伏 示例值:solar |
RunDate string | 运行日,精确到天,“yyyy-MM-dd”格式 示例值:2025-02-12 |
TimeZone string | 时区,默认上海时区:Asia/Shanghai 示例值:Asia/Shanghai |
ModelVersion string | 模型对应的版本号,默认为 latest 示例值:latest |
- Location object | 地址位置信息,经纬度 |
--Altitude number<double> | 海拔高度,精度到小数点后 3 位,默认值为 10 示例值:10.123 |
--Latitude number<double> | 纬度,精度到小数点后 3 位 示例值:40.027 |
--Longitude number<double> | 经度,精度到小数点后 3 位 示例值:120.042 |
BusinessKey string | 业务键,如场站名称编号。 示例值:stationA |
请求示例
以JSON格式为例:
{
"historyData":[
{"runTime": "2023-05-06 20:00:00","value": 1.8},
{"runTime": "2023-05-06 20:15:00","value": 1.9},
...
{"runTime": "2023-08-05 19:45:00","value": 1.7}
],
"systemType": "solar",
"deviceType": "solarInverter",
"location": {
"longitude": 23.233,
"latitude": 113.666,
"altitude": 10
}
"runDate": "2023-08-06",
"duration": 1,
"freq": "FIFTEEN_MIN",
"timeZone": "Asia/Shanghai",
"modelVersion": "latest",
"businessKey": "stationA"
}
duration需要大于等于1(单位:天)。
返回参数
字段名称 | 字段详情 |
RequestId string | Id of the request 示例值:68738E75-43C1-5AE5-9F3A-AFEF576D7B5F |
Success string | 是否调用成功。
示例值:True |
Code string | 状态码。 说明 200 表示成功。 示例值:200 |
Message string | 返回信息。 示例值:successful |
- Data object | 返回 JOB 详细信息 |
--Completed boolean | 操作是否完成,取值范围: True:当前 Job 已经执行完成。 False:当前 Job 还在执行中。 示例值:True |
--CreateTime string | 任务创建时间 示例值:2024-12-22 00:00:21 |
--Error string | 当前操作异常或者失败时的错误信息 示例值:"" |
--JobId string | 算法计算任务 ID 示例值:8c0ca18a-246a-4acd-80ca-e16d8ff5ef33 |
--Progress integer<int32> | 进度 示例值:25 |
--- Response object | 计算任务的结果 |
----DebugInfo any | 调试信息 示例值:{} |
----JobType string | 计算任务类型,枚举值:LoadForecast PowerForecast 示例值:LoadForecast |
----Result any | 计算任务的结果 示例值:{} |
--Status string | 任务状态,枚举值: RUNNING, SUCCESS, FAIL 示例值:RUNNING |
计算任务是一个异步任务,最终计算任务的结果,需要使用Jobld通过结果查询结果获得。
返回示例
{
"RequestId": "68738E75-43C1-5AE5-9F3A-AFEF576D7B5F",
"Success": "True",
"Code": "200",
"Message": "successful",
"Data": {
"Completed": true,
"CreateTime": "2024-12-22 00:00:21",
"Error": "\"\"",
"JobId": "8c0ca18a-246a-4acd-80ca-e16d8ff5ef33",
"Progress": 25,
"Response": {
"DebugInfo": "{}",
"JobType": "LoadForecast",
"Result": "{}"
},
"Status": "RUNNING"
}
}
SDK调用示例
Java SDK使用示例
当不需要并发调用时,可以使用Java同步的方式调用SDK;当需要并发调用时,使用Java异步的方式调用SDK。
Java同步(pom.xml):
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>brain_industrial20200920</artifactId>
<version>2.1.0</version>
</dependency>
Java同步(sample.java):
package org.example;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.aliyun.brain_industrial20200920.Client;
import com.aliyun.brain_industrial20200920.models.CreatePowerForecastJobRequest;
import com.aliyun.brain_industrial20200920.models.CreatePowerForecastJobResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) throws Exception {
testPowerForecast();
}
public static void testPowerForecast() throws Exception{
List<CreatePowerForecastJobRequest.CreatePowerForecastJobRequestHistoryData> history = new ArrayList<>();
// mock一个月的历史数据
LocalDate startDateLocal = LocalDate.parse("2025-03-01");
for (int i = 0; i < 31; i++) {
LocalDate newDateLocal = startDateLocal.plusDays(i);
String newDate = newDateLocal.toString();
CreatePowerForecastJobRequest.CreatePowerForecastJobRequestHistoryData e1 = new CreatePowerForecastJobRequest.CreatePowerForecastJobRequestHistoryData()
.setRunTime(newDate + " 00:00:00")
.setValue(100.0);
history.add(e1);
}
CreatePowerForecastJobRequest.CreatePowerForecastJobRequestLocation location = new CreatePowerForecastJobRequest.CreatePowerForecastJobRequestLocation()
.setLatitude(40.0)
.setLongitude(100.0);
CreatePowerForecastJobRequest req = new CreatePowerForecastJobRequest()
.setDeviceType("solarInverter")
.setSystemType("solar")
.setDuration(2)
.setRunDate("2025-04-01")
.setLocation(location)
.setHistoryData(history);
Client client = createClient();
// Client client = createClientAkSk();
try {
// 复制代码运行请自行打印 API 的返回值
CreatePowerForecastJobResponse response = client.createPowerForecastJob(req);
System.out.println(new Gson().toJson(response.getBody()));
// System.out.println("job id = " + response.getBody().getData().getJobId());
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
// sts方式 初始化账号Client
public static Client createClient() throws Exception {
// 初始化credential
Map<String, Object> buildInfo = new HashMap<>();
buildInfo.put("type", "ram_role_arn");
buildInfo.put("accessKeyId", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
buildInfo.put("accessKeySecret", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
buildInfo.put("roleArn", System.getenv("ROLE_ARN"));
buildInfo.put("roleSessionExpiration", 3600);
com.aliyun.credentials.models.Config credentialConfig = com.aliyun.credentials.models.Config.build(buildInfo);
com.aliyun.credentials.Client credientClient = new com.aliyun.credentials.Client(credentialConfig);
// 使用Credential client初始化brain industrial客户端
Config brainConfig = new Config();
brainConfig.setCredential(credientClient);
brainConfig.setEndpoint("brain-industrial.cn-hangzhou.aliyuncs.com");
return new Client(brainConfig);
}
// 使用AK&SK初始化账号Client
public static Client createClientAkSk() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint 请参考 https://api.aliyun.com/product/brain-industrial
config.endpoint = "brain-industrial.cn-hangzhou.aliyuncs.com";
config.regionId = "cn-hangzhou";
config.type = "access_key";
return new com.aliyun.brain_industrial20200920.Client(config);
}
}
Java异步(pom.xml):
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-brain_industrial20200920</artifactId>
<version>2.0.2</version>
</dependency>
Java异步(sample.java):
package org.example;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import com.aliyun.sdk.service.brain_industrial20200920.AsyncClient;
import com.aliyun.sdk.service.brain_industrial20200920.models.CreatePowerForecastJobRequest;
import com.aliyun.sdk.service.brain_industrial20200920.models.CreatePowerForecastJobResponse;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.google.gson.Gson;
public class Async {
public static void main(String[] args) throws Exception {
// testPowerForecastAsync();
concurrentPowerForecast();
}
public static void concurrentPowerForecast() throws Exception {
// 并发调用testPowerForecast函数
ArrayList<CreatePowerForecastJobRequest.HistoryData> history = new ArrayList<>();
LocalDate startDateLocal = LocalDate.parse("2025-03-01");
for (int i = 0; i < 31; i++) {
LocalDate newDateLocal = startDateLocal.plusDays(i);
String newDate = newDateLocal.toString();
CreatePowerForecastJobRequest.HistoryData e = CreatePowerForecastJobRequest.HistoryData.builder()
.runTime(newDate + " 00:00:00")
.value(4.0)
.build();
history.add(e);
}
CreatePowerForecastJobRequest createPowerForecastJobRequest = CreatePowerForecastJobRequest.builder()
.historyData(history)
.systemType("solar")
.deviceType("solarInverter")
.duration(2)
.location(CreatePowerForecastJobRequest.Location.builder().longitude(100.0).latitude(40.0).build())
.runDate("2025-04-01")
.build();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
try {
testPowerForecastAsync(createPowerForecastJobRequest);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
public static void testPowerForecastAsync(CreatePowerForecastJobRequest createPowerForecastJobRequest) throws Exception{
AsyncClient client = createClientAsync();
try {
CompletableFuture<CreatePowerForecastJobResponse> response = client.createPowerForecastJob(createPowerForecastJobRequest);
// Synchronously get the return value of the API request
CreatePowerForecastJobResponse resp = response.get();
// 打印当前时间格式为 '%Y-%m-%d %H:%m:%s
LocalDateTime now = LocalDateTime.now();
String formattedTime = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("[" + formattedTime + "]" + new Gson().toJson(resp.getBody()));
// 复制代码运行请自行打印 API 的返回值
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
}
}
public static AsyncClient createClientAsync() throws Exception {
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
.build());
// Configure the Client
AsyncClient client = AsyncClient.builder()
.region("cn-hangzhou") // Region ID
//.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
.credentialsProvider(provider)
//.serviceConfiguration(Configuration.create()) // Service-level configuration
// Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 请参考 https://api.aliyun.com/product/brain-industrial
.setEndpointOverride("brain-industrial.cn-hangzhou.aliyuncs.com")
.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
return client;
}
}
Python SDK使用示例
Python依赖:
pip install alibabacloud_brain_industrial20200920==2.1.0
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys
from typing import List
from alibabacloud_brain_industrial20200920.client import Client as brain_industrial20200920Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_brain_industrial20200920 import models as brain_industrial_20200920_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> brain_industrial20200920Client:
"""
使用AK&SK初始化账号Client
@return: Client
@throws Exception
"""
# 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
# 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html。
config = open_api_models.Config(
# 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# Endpoint 请参考 https://api.aliyun.com/product/brain-industrial
config.endpoint = f'brain-industrial.cn-hangzhou.aliyuncs.com'
return brain_industrial20200920Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
create_power_forecast_job_request = brain_industrial_20200920_models.CreatePowerForecastJobRequest()
runtime = util_models.RuntimeOptions()
try:
# 复制代码运行请自行打印 API 的返回值
client.create_power_forecast_job_with_options(create_power_forecast_job_request, runtime)
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error.message)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
@staticmethod
async def main_async(
args: List[str],
) -> None:
client = Sample.create_client()
create_power_forecast_job_request = brain_industrial_20200920_models.CreatePowerForecastJobRequest()
runtime = util_models.RuntimeOptions()
try:
# 复制代码运行请自行打印 API 的返回值
await client.create_power_forecast_job_with_options_async(create_power_forecast_job_request, runtime)
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error.message)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])