cloudpss 4.5.0__tar.gz → 4.5.1a1__tar.gz

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 (112) hide show
  1. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/PKG-INFO +1 -1
  2. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/__init__.py +2 -1
  3. cloudpss-4.5.1a1/cloudpss/dslab/__init__.py +2 -0
  4. cloudpss-4.5.1a1/cloudpss/dslab/dataManageModel.py +275 -0
  5. cloudpss-4.5.1a1/cloudpss/dslab/dslab.py +213 -0
  6. cloudpss-4.5.1a1/cloudpss/dslab/files/__init__.py +2 -0
  7. cloudpss-4.5.1a1/cloudpss/dslab/files/curveData.py +140229 -0
  8. cloudpss-4.5.1a1/cloudpss/dslab/files/files.py +27 -0
  9. cloudpss-4.5.1a1/cloudpss/dslab/financialAnalysisModel.py +137 -0
  10. cloudpss-4.5.1a1/cloudpss/job/TemplateCompiler.py +273 -0
  11. cloudpss-4.5.1a1/cloudpss/job/TemplateManager.py +36 -0
  12. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/job.py +2 -2
  13. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/messageStreamReceiver.py +24 -10
  14. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/messageStreamSender.py +5 -5
  15. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/result/result.py +0 -1
  16. cloudpss-4.5.1a1/cloudpss/runner/DSLabResult.py +92 -0
  17. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/result.py +0 -1
  18. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/runner.py +15 -1
  19. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/utils/httprequests.py +2 -2
  20. cloudpss-4.5.1a1/cloudpss/version.py +1 -0
  21. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss.egg-info/PKG-INFO +1 -1
  22. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss.egg-info/SOURCES.txt +10 -0
  23. cloudpss-4.5.0/cloudpss/version.py +0 -1
  24. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/README.md +0 -0
  25. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/__init__.py +0 -0
  26. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/job/__init__.py +0 -0
  27. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/job/job.py +0 -0
  28. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/job/messageStreamReceiver.py +0 -0
  29. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/job/messageStreamSender.py +0 -0
  30. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/model/__init__.py +0 -0
  31. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/model/model.py +0 -0
  32. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/model/revision.py +0 -0
  33. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/model/topology.py +0 -0
  34. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/utils/AsyncIterable.py +0 -0
  35. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/utils/__init__.py +0 -0
  36. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/asyncio/utils/httpAsyncRequest.py +0 -0
  37. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/function/__init__.py +0 -0
  38. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/function/function.py +0 -0
  39. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/function/functionExecution.py +0 -0
  40. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/function/job.py +0 -0
  41. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/ieslab/DataManageModel.py +0 -0
  42. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/ieslab/EvaluationModel.py +0 -0
  43. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/ieslab/IESLabOpt.py +0 -0
  44. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/ieslab/IESLabPlan.py +0 -0
  45. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/ieslab/IESLabSimulation.py +0 -0
  46. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/ieslab/PlanModel.py +0 -0
  47. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/ieslab/__init__.py +0 -0
  48. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/__init__.py +0 -0
  49. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/jobReceiver.py +0 -0
  50. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/result/EMTResult.py +0 -0
  51. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/result/IESLabSimulationResult.py +0 -0
  52. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/result/IESLabTypicalDayResult.py +0 -0
  53. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/result/IESResult.py +0 -0
  54. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/result/PowerFlowResult.py +0 -0
  55. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/job/result/__init__.py +0 -0
  56. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/__init__.py +0 -0
  57. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/implements/__init__.py +0 -0
  58. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/implements/component.py +0 -0
  59. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/implements/diagram.py +0 -0
  60. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/implements/implement.py +0 -0
  61. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/jobDefinitions.py +0 -0
  62. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/model.py +0 -0
  63. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/revision.py +0 -0
  64. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/model/topology.py +0 -0
  65. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/project/__init__.py +0 -0
  66. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/project/project.py +0 -0
  67. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/IESLabEvaluationResult.py +0 -0
  68. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/IESLabPlanResult.py +0 -0
  69. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/IESLabTypicalDayResult.py +0 -0
  70. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/MessageStreamReceiver.py +0 -0
  71. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/__init__.py +0 -0
  72. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/receiver.py +0 -0
  73. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/storage.py +0 -0
  74. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/runner/transform.py +0 -0
  75. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/utils/IO.py +0 -0
  76. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/utils/__init__.py +0 -0
  77. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/utils/dataEncoder.py +0 -0
  78. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/utils/graphqlUtil.py +0 -0
  79. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/utils/matlab.py +0 -0
  80. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/utils/yamlLoader.py +0 -0
  81. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss/verify.py +0 -0
  82. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss.egg-info/dependency_links.txt +0 -0
  83. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss.egg-info/requires.txt +0 -0
  84. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/cloudpss.egg-info/top_level.txt +0 -0
  85. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/setup.cfg +0 -0
  86. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/setup.py +0 -0
  87. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-async.py +0 -0
  88. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-async2.py +0 -0
  89. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-async3.py +0 -0
  90. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-plot.py +0 -0
  91. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-plot1.py +0 -0
  92. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-sdk.py +0 -0
  93. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-sdk1.py +0 -0
  94. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-snapshot.py +0 -0
  95. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-topology.py +0 -0
  96. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-topology1.py +0 -0
  97. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test-yield.py +0 -0
  98. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test.py +0 -0
  99. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test11.py +0 -0
  100. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test12.py +0 -0
  101. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test7950.py +0 -0
  102. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/testAsync.py +0 -0
  103. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/testEvent.py +0 -0
  104. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/testRt-test.py +0 -0
  105. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/testRt.py +0 -0
  106. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/testRt2.py +0 -0
  107. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/testSend.py +0 -0
  108. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test_in_new_web_1.py +0 -0
  109. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test_modepower_ampratio(3).py +0 -0
  110. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test_ws.py +0 -0
  111. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/test_ws2.py +0 -0
  112. {cloudpss-4.5.0 → cloudpss-4.5.1a1}/test/testb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudpss
3
- Version: 4.5.0
3
+ Version: 4.5.1a1
4
4
  Summary: cloudpss sdk
5
5
  Home-page: https://www.cloudpss.net
6
6
  Author: cloudpss
@@ -9,10 +9,11 @@ from . import function
9
9
  from .job import Job
10
10
  from .function import FunctionExecution
11
11
  from .version import __version__
12
+ from .dslab import DSLab
12
13
  __all__ = [
13
14
  'setToken', 'Model', 'ModelRevision', 'ModelTopology', 'Runner', 'Result',
14
15
  'PowerFlowResult', 'EMTResult', 'MatlabDataEncoder', 'DateTimeEncode',
15
- 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','IESLabOpt','__version__','Job'
16
+ 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','IESLabOpt','__version__','Job','DSLab'
16
17
  ]
17
18
 
18
19
 
@@ -0,0 +1,2 @@
1
+ from .dslab import DSLab
2
+ __all__ = ['DSLab']
@@ -0,0 +1,275 @@
1
+ from ..utils import request, fileLoad, graphql_request
2
+ import json
3
+ import time, datetime
4
+ import copy
5
+ import os
6
+ from cloudpss.dslab.files import getCurveData
7
+
8
+ class DataManageModel(object):
9
+ _weatherUrl = ''
10
+ _baseUri = ''
11
+ _kindUrlMap = {}
12
+ _itemDataMap={}
13
+ _kindItemDataMap={}
14
+ _kindIdMap={}
15
+
16
+ def __init__(self, resourceId):
17
+ self.resourceId = resourceId
18
+ self._fetchTypes()
19
+ def _status(self):
20
+ '''
21
+ 获取运行状态
22
+
23
+ :return: boolean 类型
24
+ '''
25
+ pass
26
+ def _fetchTypes(self):
27
+ '''
28
+ 获取所有数据项的类型
29
+
30
+ :return: list 类型,返回所有数据项的类型
31
+ '''
32
+ url = f"{self._baseUri}rest/types"
33
+ r = request('GET',url)
34
+ types = json.loads(r.text)
35
+ self._kindUrlMap = {kind['name']: f"api/dslab/rest/{kind['name']}" for kind in types}
36
+ def _fetchItemData(self, url):
37
+ '''
38
+ 私有方法,获取simu对应所有数据项的列表
39
+ :params: url string类型,request请求对应的url链接
40
+
41
+ :return: list类型,返回该种类下所有数据项的的列表
42
+ '''
43
+ r = request('GET',
44
+ url,
45
+ params={
46
+ "simu": self.resourceId,
47
+ })
48
+ return json.loads(r.text)
49
+
50
+ def _saveItemData(self, url, data):
51
+ '''
52
+ 私有方法,保存url链接对应的data数据
53
+ :params: url string类型,request请求对应的url链接
54
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
55
+
56
+ :return: 无
57
+ '''
58
+ r = request('POST', url, data=json.dumps(data))
59
+
60
+
61
+ def _updateItemData(self, url, data):
62
+ '''
63
+ 私有方法,更新url链接对应的data数据
64
+ :params: url string类型,request请求对应的url链接
65
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
66
+
67
+ :return: 无
68
+ '''
69
+ r = request('PUT', url, data=json.dumps(data))
70
+
71
+ def _deleteItemData(self, url):
72
+ '''
73
+ 私有方法,删除url链接对应的数据
74
+ :params: url string类型,request请求对应的url链接
75
+
76
+ :return: 无
77
+ '''
78
+ r = request('DELETE',url)
79
+
80
+ def LocationGet(self):
81
+ '''
82
+ 获取气象定位点数据
83
+
84
+ :return: list<dict>类型,为源数据的引用,包含id,经度坐标,纬度坐标,定位点名称
85
+ '''
86
+ url = f"{self._baseUri}rest/location"
87
+ r = request('GET',
88
+ url,
89
+ params={"simu": self.resourceId})
90
+ return json.loads(r.text)
91
+
92
+ def LocationCreate(self, name=None, longitude=None, latitude=None):
93
+ '''
94
+ 创建气象定位点
95
+ :param: name 定位点名称,可选
96
+ :params: longitude float类型,可选,表示经度,范围为气象数据源的经度范围
97
+ :params: latitude float类型,可选,表示纬度,范围为气象数据源的纬度范围
98
+
99
+ :return: 无
100
+ '''
101
+ url = f"{self._baseUri}rest/location"
102
+ r = request('POST',
103
+ url,
104
+ data=json.dumps({
105
+ "lat": latitude if latitude is not None else '34.734492',
106
+ "lng": longitude if longitude is not None else '113.648906',
107
+ "simu": self.resourceId,
108
+ "name": name if name is not None else '定位点'
109
+ }))
110
+ d = json.loads(r.text)
111
+
112
+ def LocationUpdate(self, id, name, longitude, latitude):
113
+ '''
114
+ 修改气象定位点
115
+ :param id: 定位点id
116
+ :param: name 定位点名称,可选
117
+ :params: longitude float类型,可选,表示经度,范围为气象数据源的经度范围
118
+ :params: latitude float类型,可选,表示纬度,范围为气象数据源的纬度范围
119
+
120
+ :return: 无
121
+ '''
122
+ if (float(longitude) > 180 or float(longitude) < -180
123
+ or float(latitude) > 90 or float(latitude) < -90):
124
+ raise Exception('经纬度坐标不存在')
125
+ else:
126
+ url = f"{self._baseUri}rest/location"
127
+ r = request('PUT',
128
+ url,
129
+ data=json.dumps({
130
+ "lat": latitude,
131
+ "lng": longitude,
132
+ "simu": self.resourceId,
133
+ "name": name,
134
+ "id": id
135
+ }))
136
+
137
+ def LocationDelete(self, id):
138
+ '''
139
+ 删除气象定位点
140
+ :param id: 定位点id
141
+
142
+ :return: 无
143
+ '''
144
+ url = f"{self._baseUri}rest/location/{str(id)}"
145
+ r = request('DELETE',
146
+ url)
147
+
148
+ def LoadWeather(self):
149
+ '''
150
+ 加载气象数据
151
+
152
+ :return: 无
153
+ '''
154
+ url = f"{self._baseUri}rest/load_weather"
155
+ r = request('GET',
156
+ url,
157
+ params = {
158
+ "simu": self.resourceId,
159
+ })
160
+
161
+ def GetAtmosData(self, locationId, date):
162
+ '''
163
+ 获取日期在date的气象数据
164
+ :params: locationId str类型,表示定位点id
165
+ :params: date dateTime类型,表示时间
166
+
167
+ :return: list<dict>类型,为源数据的引用,返回当前项目位置对应时间范围内的气象数据序列,每个元素用字典进行表示,字典的key即区分不同的气象数据项(如风速、太阳辐照等)以及标识当前时间点
168
+ '''
169
+ rDate = datetime.date(*map(int, date.split('-')))
170
+ r = request('GET',
171
+ self._weatherUrl,
172
+ params={
173
+ "locationId": str(locationId),
174
+ "date": rDate,
175
+ })
176
+ return json.loads(r.text)
177
+
178
+ def AddDataItem(self, kind, data, extra=None):
179
+ '''
180
+ 向kind类型的数据库中添加内容为data的数据项
181
+ :params: kind str类型,数据的种类标识,包含:光伏、光伏曲线、风机、风机曲线、燃气、燃气曲线、水电、水电曲线、火电、火电曲线、生物质发电、生物质发电曲线、垃圾电厂、垃圾电厂曲线、传输线、变压器、开关、负荷分类、负荷用户、储能设备、储能运行策略、上网电价、输配电价、常数电价、阶梯电价、分时电价、分时阶梯电价
182
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
183
+ :params extra list类型,表示添加的基准出力曲线、负荷曲线、策略曲线数据
184
+
185
+ :return: list<dict>类型,返回该种类下所有数据项的列表
186
+ '''
187
+ if extra is None or not extra:
188
+ curveData = getCurveData(kind)
189
+ if len(curveData) > 0:
190
+ r = {
191
+ 'simu': self.resourceId,
192
+ 'name': data.get('name', ''),
193
+ 'extra': curveData,
194
+ 'data': data.get('data', {}),
195
+ }
196
+ url = f"{self._baseUri}rest/{kind}"
197
+ self._saveItemData(url, r)
198
+ return self._fetchItemData(url)
199
+ else:
200
+ r = {
201
+ 'simu': self.resourceId,
202
+ 'name': data.get('name', ''),
203
+ 'data': data.get('data', {}),
204
+ }
205
+ url = f"{self._baseUri}rest/{kind}"
206
+ self._saveItemData(url, r)
207
+ return self._fetchItemData(url)
208
+ else:
209
+ r = {
210
+ 'simu': self.resourceId,
211
+ 'name': data.get('name', ''),
212
+ 'extra': extra,
213
+ 'data': data.get('data', {}),
214
+ }
215
+ url = f"{self._baseUri}rest/{kind}"
216
+ self._saveItemData(url, r)
217
+ return self._fetchItemData(url)
218
+
219
+ def DeleteDataItem(self, id, kind):
220
+ '''
221
+ 获取kind类型对应所有数据项的列表
222
+ :params: id int类型,数据的id
223
+ :params: kind str类型,数据的种类标识,包含:光伏、光伏曲线、风机、风机曲线、燃气、燃气曲线、水电、水电曲线、火电、火电曲线、生物质发电、生物质发电曲线、垃圾电厂、垃圾电厂曲线、传输线、变压器、开关、负荷分类、负荷用户、储能设备、储能运行策略、上网电价、输配电价、常数电价、阶梯电价、分时电价、分时阶梯电价
224
+
225
+ :return: list<dict>类型,返回该种类下所有数据项的列表
226
+ '''
227
+ url = f"{self._baseUri}rest/id/{str(id)}"
228
+ self._deleteItemData(url)
229
+ return self._fetchItemData(f"{self._baseUri}rest/{kind}")
230
+
231
+
232
+ def UpdateDataItem(self, kind, data):
233
+ '''
234
+ 更新kind类型对应数据项
235
+ :params: kind str类型,数据的种类标识,包含:光伏、光伏曲线、风机、风机曲线、燃气、燃气曲线、水电、水电曲线、火电、火电曲线、生物质发电、生物质发电曲线、垃圾电厂、垃圾电厂曲线、传输线、变压器、开关、负荷分类、负荷用户、储能设备、储能运行策略、上网电价、输配电价、常数电价、阶梯电价、分时电价、分时阶梯电价
236
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
237
+
238
+ :return: list<dict>类型,返回该种类下所有数据项的列表
239
+ '''
240
+ url = f"{self._baseUri}rest/{kind}"
241
+ r = {
242
+ 'id': data.get('id', ''),
243
+ 'name': data.get('name', ''),
244
+ 'data': data.get('data', {}),
245
+ }
246
+ self._updateItemData(url, r)
247
+ return self._fetchItemData(url)
248
+
249
+
250
+ def GetItemList(self, kind):
251
+ '''
252
+ 获取kind类型对应所有数据项的列表
253
+ :params: kind str类型,数据的种类标识,包含:光伏、光伏曲线、风机、风机曲线、燃气、燃气曲线、水电、水电曲线、火电、火电曲线、生物质发电、生物质发电曲线、垃圾电厂、垃圾电厂曲线、传输线、变压器、开关、负荷分类、负荷用户、储能设备、储能运行策略、上网电价、输配电价、常数电价、阶梯电价、分时电价、分时阶梯电价
254
+
255
+ :return: list<dict>类型,返回该种类下所有数据项的列表
256
+ '''
257
+ url = f"{self._baseUri}rest/{kind}"
258
+ return self._fetchItemData(url)
259
+
260
+ def GetItemExtra(self, kind, uuid):
261
+ '''
262
+ 获取kind类型对应数据项的基准出力曲线、负荷曲线、策略曲线数据
263
+ :params: kind str类型,数据的类型
264
+ :params: uuid str类型,数据的unique id
265
+ '''
266
+ url = f"{self._baseUri}rest/id/{uuid}"
267
+ data = self._fetchItemData(url)
268
+ if data.get('extra', None) is None:
269
+ return None
270
+ return data.get('extra', None).get('data', None)
271
+
272
+ class DSLabDataManageModel(DataManageModel):
273
+ _baseUri = 'api/dslab/'
274
+ _weatherUrl = 'api/dslab/rest/weather'
275
+
@@ -0,0 +1,213 @@
1
+ import json
2
+ from ..utils import request
3
+ from ..model.model import Model
4
+ from .dataManageModel import DSLabDataManageModel
5
+ from .financialAnalysisModel import DSLabFinancialAnalysisModel
6
+ from cloudpss.runner.DSLabResult import DSLabResult
7
+ from cloudpss.runner.runner import Runner
8
+ from cloudpss.runner.result import IESResult, EMTResult
9
+
10
+ class DSLab(object):
11
+ def __init__(self, project={}):
12
+ '''
13
+ 初始化
14
+ '''
15
+ self.id = project.get('id', None)
16
+ self.resource = project.get('resource', None)
17
+ self.name = project.get('name', None)
18
+ self.__modelRid = project.get('model', None)
19
+ if self.__modelRid is not None:
20
+ self.model = Model.fetch(self.__modelRid)
21
+ self.dataManageModel = DSLabDataManageModel(self.resource)
22
+ self.financialAnalysisModel = DSLabFinancialAnalysisModel(self.resource)
23
+ self.currentEvaluationResult = DSLabResult(self.resource)
24
+
25
+ @staticmethod
26
+ def fetch(simulationId):
27
+ '''
28
+ 获取算例信息
29
+
30
+ :params: simulationId string类型,代表数据项的算例id
31
+
32
+ :return: DSLab
33
+ '''
34
+ try:
35
+ r = request(
36
+ 'GET', 'api/dslab/rest/simulation/{0}'.format(simulationId))
37
+ project = json.loads(r.text)
38
+ return DSLab(project)
39
+ except Exception as e:
40
+ if 'Unauthorized' in str(e):
41
+ raise Exception('token 无效')
42
+ else:
43
+ raise Exception('未查询到当前算例')
44
+
45
+ def run(self, job=None, name=None):
46
+ '''
47
+ 调用仿真
48
+
49
+ :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
50
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
51
+
52
+ :return: 返回一个运行实例
53
+ '''
54
+ if job is None:
55
+ currentJob = self.model.context['currentJob']
56
+ job = self.model.jobs[currentJob]
57
+
58
+ job['args']['simulationId'] = self.resource
59
+ return self.model.run(job, name=name)
60
+
61
+ def dsLabRun(self):
62
+ '''
63
+ 生成方案优选算例
64
+
65
+ :return: 方案优选运行实例
66
+ '''
67
+ pass
68
+
69
+ def dsLabFinancialRun(self, planID):
70
+ '''
71
+ 运行技术经济分析
72
+ :param planID int 类型,表示优化方案的ID,数值位于0~优化方案数量之间
73
+
74
+ :return: 技术经济分析实例
75
+
76
+ '''
77
+ return self.financialAnalysisModel.run(planID)
78
+
79
+
80
+ def runIESLoadPrediction(self,job=None,name=None, **kwargs)->Runner[IESResult]:
81
+ '''
82
+ 运行 负荷预测方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
83
+
84
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
85
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
86
+
87
+ :return: runner Runner[IESResult]
88
+ '''
89
+ rid = 'function/CloudPSS/ieslab-load-prediction'
90
+ if job is None:
91
+ currentJob = self.model.context['currentJob']
92
+ job = self.model.jobs[currentJob]
93
+ if job['rid'] != rid:
94
+ for j in self.model.jobs:
95
+ if j['rid'] == rid:
96
+ job = j
97
+ if job is None:
98
+ raise Exception("找不到负荷预测方案内核运行的计算方案")
99
+ if job['rid'] != rid:
100
+ raise Exception("不是负荷预测方案内核运行生成算法的计算方案")
101
+ return self.run(job=job, name=name)
102
+
103
+ def runIESPowerFlow(self,job=None,name=None, **kwargs)->Runner[IESResult]:
104
+ '''
105
+ 运行 时序潮流方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
106
+
107
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
108
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
109
+
110
+ :return: runner Runner[IESResult]
111
+ '''
112
+ rid = 'function/CloudPSS/ieslab-power-flow'
113
+ if job is None:
114
+ currentJob = self.model.context['currentJob']
115
+ job = self.model.jobs[currentJob]
116
+ if job['rid'] != rid:
117
+ for j in self.model.jobs:
118
+ if j['rid'] == rid:
119
+ job = j
120
+ if job is None:
121
+ raise Exception("找不到时序潮流方案内核运行的计算方案")
122
+ if job['rid'] != rid:
123
+ raise Exception("不是时序潮流方案内核运行生成算法的计算方案")
124
+ return self.run(job=job, name=name)
125
+
126
+ def runIESEnergyStoragePlan(self,job=None,name=None, **kwargs)->Runner[IESResult]:
127
+ '''
128
+ 运行 储能规划方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
129
+
130
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
131
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
132
+
133
+ :return: runner Runner[IESResult]
134
+ '''
135
+ rid = 'function/CloudPSS/ieslab-energy-storage-plan'
136
+ if job is None:
137
+ currentJob = self.model.context['currentJob']
138
+ job = self.model.jobs[currentJob]
139
+ if job['rid'] != rid:
140
+ for j in self.model.jobs:
141
+ if j['rid'] == rid:
142
+ job = j
143
+ if job is None:
144
+ raise Exception("找不到储能规划方案内核运行的计算方案")
145
+ if job['rid'] != rid:
146
+ raise Exception("不是储能规划方案内核运行生成算法的计算方案")
147
+ return self.run(job=job, name=name)
148
+
149
+ @staticmethod
150
+ def createProjectGroup(name, description=None, createById=None):
151
+ '''
152
+ 创建项目组
153
+
154
+ :params name: String 项目组名称
155
+ :params description: String 项目组描述 可选参数
156
+ :params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
157
+
158
+ :return: Int 返回创建的项目组id
159
+ '''
160
+ try:
161
+ if createById is None:
162
+ isImport = 0
163
+ else:
164
+ isImport = 1
165
+ payload = {
166
+ 'name': name,
167
+ 'description': description,
168
+ 'isImport': isImport,
169
+ 'createById': createById,
170
+ }
171
+ r = request(
172
+ 'POST', 'api/dslab/rest/group', data=json.dumps(payload))
173
+ if r.ok:
174
+ r = request('GET', 'api/dslab/rest/group')
175
+ groupList = json.loads(r.text)
176
+ id = groupList[len(groupList) -1].get('id', None)
177
+ return id
178
+ except Exception as e:
179
+ raise Exception('创建项目组失败')
180
+
181
+ @staticmethod
182
+ def createProject(name, gid, description=None, initialTerm=None, build=None, operate=None, yearsInOperation=None):
183
+ '''
184
+ 创建项目
185
+
186
+ :params name: String 项目名称
187
+ :params gid: Int 父项目组id,
188
+ :params description: String 项目描述, 可选参数
189
+ :params initialTerm: String 项目起始年限,可选参数
190
+ :params build: String 项目建设期(年),可选参数
191
+ :params operate: String 项目生命周期(年),可选参数
192
+ :params yearsInOperation: String 已投运年限,可选参数
193
+
194
+ :return: Int 返回创建的项目id
195
+ '''
196
+ try:
197
+ payload = {
198
+ 'name': name,
199
+ 'gid': gid,
200
+ 'description': description,
201
+ 'config': {
202
+ 'initialTerm': initialTerm,
203
+ 'build': build,
204
+ 'operate': operate,
205
+ 'yearsInOperation': yearsInOperation,
206
+ }
207
+ }
208
+ r = request(
209
+ 'POST', 'api/dslab/rest/simulation', data=json.dumps(payload))
210
+ project = json.loads(r.text)
211
+ return project.get('resource', None)
212
+ except Exception as e:
213
+ raise Exception('创建项目失败')
@@ -0,0 +1,2 @@
1
+ from .files import getCurveData
2
+ __all__ = ['getCurveData']