cloudpss 4.1.1b7__py3-none-any.whl → 4.1.1b9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. cloudpss/asyncio/__init__.py +8 -0
  2. cloudpss/asyncio/job/__init__.py +5 -0
  3. cloudpss/asyncio/job/job.py +116 -0
  4. cloudpss/asyncio/job/messageStreamReceiver.py +121 -0
  5. cloudpss/asyncio/job/messageStreamSender.py +45 -0
  6. cloudpss/asyncio/model/__init__.py +5 -0
  7. cloudpss/asyncio/model/model.py +257 -0
  8. cloudpss/asyncio/model/revision.py +41 -0
  9. cloudpss/asyncio/model/topology.py +34 -0
  10. cloudpss/asyncio/utils/__init__.py +6 -0
  11. cloudpss/{utils → asyncio/utils}/httpAsyncRequest.py +2 -2
  12. cloudpss/dslab/dataManageModel.py +24 -14
  13. cloudpss/dslab/dslab.py +115 -21
  14. cloudpss/dslab/files/curveData.py +35066 -35042
  15. cloudpss/dslab/files/files.py +21 -13
  16. cloudpss/function/functionExecution.py +10 -0
  17. cloudpss/ieslab/DataManageModel.py +65 -16
  18. cloudpss/ieslab/IESLabPlan.py +78 -0
  19. cloudpss/ieslab/IESLabSimulation.py +59 -32
  20. cloudpss/ieslab/PlanModel.py +11 -7
  21. cloudpss/job/job.py +119 -132
  22. cloudpss/job/jobReceiver.py +7 -1
  23. cloudpss/job/messageStreamReceiver.py +42 -99
  24. cloudpss/job/messageStreamSender.py +5 -42
  25. cloudpss/job/view/EMTView.py +9 -11
  26. cloudpss/job/view/IESLabTypicalDayView.py +114 -5
  27. cloudpss/job/view/view.py +36 -7
  28. cloudpss/model/implements/diagram.py +113 -0
  29. cloudpss/model/jobDefinitions.py +6 -6
  30. cloudpss/model/model.py +181 -193
  31. cloudpss/model/revision.py +29 -34
  32. cloudpss/model/topology.py +12 -14
  33. cloudpss/runner/MessageStreamReceiver.py +2 -0
  34. cloudpss/utils/httprequests.py +6 -5
  35. cloudpss/version.py +1 -1
  36. {cloudpss-4.1.1b7.dist-info → cloudpss-4.1.1b9.dist-info}/METADATA +1 -1
  37. cloudpss-4.1.1b9.dist-info/RECORD +77 -0
  38. cloudpss/dslab/DSLabFinancialResult.py +0 -96
  39. cloudpss/job/jobMachine.py +0 -11
  40. cloudpss/job/jobPolicy.py +0 -129
  41. cloudpss/job/jobQueue.py +0 -14
  42. cloudpss/job/jobTres.py +0 -6
  43. cloudpss-4.1.1b7.dist-info/RECORD +0 -72
  44. /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
  45. {cloudpss-4.1.1b7.dist-info → cloudpss-4.1.1b9.dist-info}/WHEEL +0 -0
  46. {cloudpss-4.1.1b7.dist-info → cloudpss-4.1.1b9.dist-info}/top_level.txt +0 -0
@@ -1,18 +1,26 @@
1
- from .curveData import 基准出力曲线, 基准出力曲线2, 基准出力曲线3, 负荷曲线, 策略曲线
1
+ from .curveData import 基准出力曲线, 基准出力曲线2, 基准出力曲线3, 负荷曲线, 策略曲线, 运行策略曲线
2
+
3
+ extra_paths = {
4
+ '光伏': 基准出力曲线,
5
+ '光伏曲线': 基准出力曲线,
6
+ '风机': 基准出力曲线,
7
+ '风机曲线': 基准出力曲线,
8
+ '燃气': 基准出力曲线2,
9
+ '燃气曲线': 基准出力曲线,
10
+ '水电': 基准出力曲线2,
11
+ '水电曲线': 基准出力曲线,
12
+ '火电': 基准出力曲线2,
13
+ '火电曲线': 基准出力曲线,
14
+ '生物质发电': 基准出力曲线2,
15
+ '生物质发电曲线': 基准出力曲线,
16
+ '垃圾电厂': 基准出力曲线2,
17
+ '垃圾电厂曲线': 基准出力曲线,
18
+ '负荷分类': 负荷曲线,
19
+ '负荷用户': 负荷曲线,
20
+ '储能运行策略': 运行策略曲线,
21
+ }
2
22
 
3
23
  def getCurveData(kind):
4
- extra_paths = {
5
- '光伏': 基准出力曲线,
6
- '风机': 基准出力曲线,
7
- '燃气': 基准出力曲线2,
8
- '水电': 基准出力曲线2,
9
- '常规小火电': 基准出力曲线2,
10
- '生物质发电': 基准出力曲线2,
11
- '垃圾电厂': 基准出力曲线2,
12
- '负荷分类': 负荷曲线,
13
- '负荷用户': 负荷曲线,
14
- '储能配置': 策略曲线,
15
- }
16
24
  if kind in extra_paths:
17
25
  return extra_paths[kind]
18
26
  else :
@@ -396,4 +396,14 @@ class FunctionExecution(object):
396
396
  'yAxis': layout.get('yaxis', {}),
397
397
  }
398
398
  }
399
+ self.print(result)
400
+
401
+ def custom(self, data, key=None,verb='replace'):
402
+ result = {
403
+ 'key': key,
404
+ 'version': 1,
405
+ 'verb': verb,
406
+ 'type': 'custom',
407
+ 'data': data
408
+ }
399
409
  self.print(result)
@@ -83,26 +83,50 @@ class DataManageModel(object):
83
83
 
84
84
  :return: 无
85
85
  '''
86
- list = ['thermalLoads', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold']
87
- for kind,value in self._kindUrlMap.items():
88
- try:
86
+ try:
87
+ r = request('GET',
88
+ self._dataManageUrl,
89
+ params={
90
+ "simulationId": self.simulationId
91
+ ,
92
+ })
93
+ data = json.loads(r.text)
94
+ info = data['info']
95
+ for kind,value in info.items():
96
+ if kind =='Weather':
97
+ continue
98
+
99
+ for k,data in value.items():
100
+ self._kindItemDataMap[k]=value
101
+ for val in data:
102
+ self._itemDataMap[str(val['timeid'])]=val
103
+ self._itemDataMap[str(val['id'])]=val
104
+ self._kindIdMap[str(val['timeid'])]=k
105
+ self._kindIdMap[str(val['id'])]=k
106
+ except Exception as e:
107
+ print('获取数据失败',e)
108
+ pass
109
+
110
+ # list = ['thermalLoads', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold']
111
+ # for kind,value in self._kindUrlMap.items():
112
+ # try:
89
113
 
90
- if kind in list:
91
- dataList = self._fetchItemData(self._kindUrlMap[kind], None)
92
- else:
93
- dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
94
- except Exception as e:
95
- pass
96
- self._kindItemDataMap[kind]=dataList
97
- for val in dataList:
98
- self._itemDataMap[str(val['timeid'])]=val
99
- self._itemDataMap[str(val['id'])]=val
100
- self._kindIdMap[str(val['timeid'])]=kind
101
- self._kindIdMap[str(val['id'])]=kind
114
+ # if kind in list:
115
+ # dataList = self._fetchItemData(self._kindUrlMap[kind], None)
116
+ # else:
117
+ # dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
118
+ # except Exception as e:
119
+ # pass
120
+ # self._kindItemDataMap[kind]=dataList
121
+ # for val in dataList:
122
+ # self._itemDataMap[str(val['timeid'])]=val
123
+ # self._itemDataMap[str(val['id'])]=val
124
+ # self._kindIdMap[str(val['timeid'])]=kind
125
+ # self._kindIdMap[str(val['id'])]=kind
102
126
 
103
127
  def GetDataItem(self, ID: str):
104
128
  '''
105
- 获取ID对应的元素信息
129
+ 获取ID对应的数据信息
106
130
 
107
131
  :params: ID string类型,代表数据项的标识符,可以在所有类型的数据项中实现唯一标识
108
132
 
@@ -281,11 +305,35 @@ class DataManageModel(object):
281
305
  })
282
306
  weatherData = json.loads(r.text)
283
307
  return weatherData['results']
308
+
309
+ def UpdateAtmosData(self, data):
310
+ '''
311
+ 更新气象数据
312
+ :data: list类型,表示数据内容,其数据结构应满足对应数据项的满足如下结构要求:
313
+ "lat": string类型 坐标纬度
314
+ "lng": string类型 坐标经度
315
+ "time": string类型 表示时间 需满足格式YYYY-MM-DD hh:mm:ss 如"2016-01-01 00:00:00"
316
+ "t10m": string类型 表示环境温度(℃)
317
+ "lwgab_swgdn": string类型 表示太阳辐射强度(W/m2)
318
+ "u10m": string类型 距地面10m处东向风速(m/s)
319
+ "u50m": string类型 距地面50m处东向风速(m/s)
320
+ "v10m": string类型 距地面10m处北向风速(m/s)
321
+ "v50m": string类型 距地面50m处北向风速(m/s)
322
+ "adj_sfc_sw_direct_all_1h": string类型 短波直射强度(W/m²)
323
+ "adj_sfc_sw_diff_all_1h": string类型 短波散射强度(W/m²)
324
+ "solar_zen_angle_1h": string类型 太阳天顶角°
325
+ :return: bool 类型,返回True 更新成功
326
+ '''
327
+ r = request('POST',
328
+ self._weatherUrl,
329
+ data=json.dumps({"sid":self.simulationId, "data":data}))
330
+ return r.ok
284
331
 
285
332
 
286
333
  class IESSimulationDataManageModel(DataManageModel):
287
334
  _baseUri = 'api/ieslab-simulation/'
288
335
  _weatherUrl = 'api/ieslab-simulation/rest/weather_data/'
336
+ _dataManageUrl = 'api/ieslab-simulation/editor/data_manage/'
289
337
  _kindNameMap = {
290
338
  "光伏": "PhotovoltaicSys",
291
339
  "风机": "WindPowerGenerator",
@@ -352,6 +400,7 @@ class IESSimulationDataManageModel(DataManageModel):
352
400
  class IESPlanDataManageModel(DataManageModel):
353
401
  _baseUri = 'api/ieslab-plan/'
354
402
  _weatherUrl = 'api/ieslab-plan/rest/weather_data/'
403
+ _dataManageUrl = 'api/ieslab-plan/editor/data_manage/'
355
404
  _kindNameMap = {
356
405
  "光伏": "PhotovoltaicSys",
357
406
  "风机": "WindPowerGenerator",
@@ -130,3 +130,81 @@ class IESLabPlan(object):
130
130
  :return: Boolean
131
131
  '''
132
132
  return self.planModel.kill()
133
+
134
+ @staticmethod
135
+ def createProjectGroup(group_name, desc=None, createById=None):
136
+ '''
137
+ 创建项目组
138
+
139
+ :params group_name: String 项目组名称
140
+ :params desc: String 项目组描述 可选参数
141
+ :params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
142
+
143
+ :return: Int 返回创建的项目组id
144
+ '''
145
+ try:
146
+ if createById is None:
147
+ isImport = 0
148
+ else:
149
+ isImport = 1
150
+ payload = {
151
+ 'group_name': group_name,
152
+ 'desc': desc,
153
+ 'isImport': isImport,
154
+ 'createById': createById,
155
+ }
156
+ r = request(
157
+ 'POST', 'api/ieslab-plan/rest/projectgroup/', data=json.dumps(payload))
158
+ project = json.loads(r.text)
159
+ return project.get('id', None)
160
+ except Exception as e:
161
+ raise Exception('创建项目组失败')
162
+
163
+ @staticmethod
164
+ def createProject(name, project_group, start_date, end_date, construction_cycle, desc=None, createById=None):
165
+ '''
166
+ 创建项目
167
+
168
+ :params name: String 项目名称
169
+ :params project_group: Int 父项目组id
170
+ :param start_date: Int 项目开始年限,范围在[1500,3000]之间
171
+ :param end_date: Int 项目结束年限,范围在项目开始时间之后且不超过五十年
172
+ :param construction_cycle: Int 项目建设周期(年), 必须小于等于 项目结束年限 - 项目开始年限
173
+ :params desc: String 项目描述, 可选参数
174
+ :params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
175
+
176
+ :return: Int 返回创建的项目id
177
+ '''
178
+ try:
179
+ if start_date < 1500 or start_date > 3000:
180
+ raise Exception('项目开始年限错误,范围在[1500,3000]之间')
181
+ if end_date < start_date or end_date > start_date + 50:
182
+ raise Exception('项目结束年限错误,范围在项目开始时间之后且不超过五十年')
183
+ if construction_cycle > end_date - start_date:
184
+ raise Exception('项目建设周期错误,必须小于等于 项目结束年限 - 项目开始年限')
185
+ if createById is None:
186
+ payload = {
187
+ 'name': name,
188
+ 'project_group': project_group,
189
+ 'start_date': start_date,
190
+ 'end_date': end_date,
191
+ 'construction_cycle': construction_cycle,
192
+ 'desc': desc
193
+ }
194
+ else:
195
+ payload = {
196
+ 'name': name,
197
+ 'project_group': project_group,
198
+ 'start_date': start_date,
199
+ 'end_date': end_date,
200
+ 'construction_cycle': construction_cycle,
201
+ 'desc': desc,
202
+ 'createById': createById
203
+ }
204
+ r = request(
205
+ 'POST', 'api/ieslab-plan/rest/simu/', data=json.dumps(payload))
206
+ project = json.loads(r.text)
207
+ return project.get('id', None)
208
+ except Exception as e:
209
+ raise Exception('创建项目失败')
210
+
@@ -5,7 +5,7 @@ from .DataManageModel import IESSimulationDataManageModel
5
5
 
6
6
 
7
7
  class IESLabSimulation(object):
8
- def __init__(self, project={},model=None):
8
+ def __init__(self, project={},model:Model=None):
9
9
  '''
10
10
  初始化
11
11
  '''
@@ -36,26 +36,7 @@ class IESLabSimulation(object):
36
36
  return IESLabSimulation(project,model)
37
37
  except:
38
38
  raise Exception('未查询到当前算例')
39
- @staticmethod
40
- async def fetchAsync(simulationId):
41
- '''
42
- 获取算例信息
43
-
44
- :params: simulationId string类型,代表数据项的算例id
45
-
46
- :return: IESLabSimulation
47
- '''
48
- try:
49
- r = request(
50
- 'GET', 'api/ieslab-simulation/rest/simu/{0}/'.format(simulationId))
51
- project = json.loads(r.text)
52
- modelRid = project.get('model', None)
53
- model=None
54
- if modelRid is not None:
55
- model =await Model.fetchAsync(modelRid)
56
- return IESLabSimulation(project,model)
57
- except:
58
- raise Exception('未查询到当前算例')
39
+
59
40
  def run(self, job=None, name=None):
60
41
  '''
61
42
  调用仿真
@@ -71,19 +52,65 @@ class IESLabSimulation(object):
71
52
 
72
53
  job['args']['simulationId'] = self.id
73
54
  return self.model.run(job, name=name)
74
-
75
- async def runAsync(self, job=None, name=None):
55
+
56
+ @staticmethod
57
+ def createProjectGroup(group_name, desc=None, createById=None):
76
58
  '''
77
- 调用仿真
59
+ 创建项目组
78
60
 
79
- :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
80
- :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
61
+ :params group_name: String 项目组名称
62
+ :params desc: String 项目组描述 可选参数
63
+ :params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
81
64
 
82
- :return: 返回一个运行实例
65
+ :return: Int 返回创建的项目组id
83
66
  '''
84
- if job is None:
85
- currentJob = self.model.context['currentJob']
86
- job = self.model.jobs[currentJob]
67
+ try:
68
+ if createById is None:
69
+ isImport = 0
70
+ else:
71
+ isImport = 1
72
+ payload = {
73
+ 'group_name': group_name,
74
+ 'desc': desc,
75
+ 'isImport': isImport,
76
+ 'createById': createById,
77
+ }
78
+ r = request(
79
+ 'POST', 'api/ieslab-simulation/rest/projectgroup/', data=json.dumps(payload))
80
+ project = json.loads(r.text)
81
+ return project.get('id', None)
82
+ except Exception as e:
83
+ raise Exception('创建项目组失败')
87
84
 
88
- job['args']['simulationId'] = self.id
89
- return await self.model.runAsync(job, name=name)
85
+ @staticmethod
86
+ def createProject(name, project_group, desc=None, createById=None):
87
+ '''
88
+ 创建项目
89
+
90
+ :params name: String 项目名称
91
+ :params project_group: Int 父项目组id,
92
+ :params desc: String 项目描述, 可选参数
93
+ :params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
94
+
95
+ :return: Int 返回创建的项目id
96
+ '''
97
+ try:
98
+ if createById is None:
99
+ payload = {
100
+ 'name': name,
101
+ 'project_group': project_group,
102
+ 'desc': desc
103
+ }
104
+ else:
105
+ payload = {
106
+ 'name': name,
107
+ 'project_group': project_group,
108
+ 'desc': desc,
109
+ 'createById': createById
110
+ }
111
+ r = request(
112
+ 'POST', 'api/ieslab-simulation/rest/simu/', data=json.dumps(payload))
113
+ project = json.loads(r.text)
114
+ return project.get('id', None)
115
+ except Exception as e:
116
+ raise Exception('创建项目失败')
@@ -41,7 +41,7 @@ class IESLabPlanModel(object):
41
41
  except:
42
42
  return OptimizationMode['经济性']
43
43
 
44
- def SetOptimizationInfo(self, optType):
44
+ def SetOptimizationInfo(self, optType):
45
45
  '''
46
46
  无对应接口
47
47
  设置当前算例的优化目标
@@ -128,12 +128,16 @@ class IESLabPlanModel(object):
128
128
  status = data.get('status', '')
129
129
  if status == 'stop':
130
130
  isRunning = False
131
- logs = IESLabPlanResult(self.simulationId).GetLogs()
132
- if logs is not None:
133
- for log in logs:
134
- if(log.get('data', '') == 'run ends'):
135
- isRunning = False
136
- break
131
+ try:
132
+
133
+ logs = IESLabPlanResult(self.simulationId).GetLogs()
134
+ if logs is not None:
135
+ for log in logs:
136
+ if(log.get('data', '') == 'run ends'):
137
+ isRunning = False
138
+ break
139
+ except:
140
+ return False
137
141
  return isRunning
138
142
 
139
143