cloudpss 3.2.0a2__tar.gz → 4.0.0__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 (83) hide show
  1. cloudpss-4.0.0/PKG-INFO +44 -0
  2. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/__init__.py +5 -4
  3. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/function/functionExecution.py +1 -3
  4. cloudpss-4.0.0/cloudpss/ieslab/DataManageModel.py +415 -0
  5. cloudpss-4.0.0/cloudpss/ieslab/EvaluationModel.py +189 -0
  6. cloudpss-4.0.0/cloudpss/ieslab/IESLabPlan.py +132 -0
  7. cloudpss-4.0.0/cloudpss/ieslab/IESLabSimulation.py +54 -0
  8. cloudpss-4.0.0/cloudpss/ieslab/PlanModel.py +143 -0
  9. cloudpss-4.0.0/cloudpss/ieslab/__init__.py +4 -0
  10. cloudpss-4.0.0/cloudpss/job/__init__.py +5 -0
  11. cloudpss-4.0.0/cloudpss/job/job.py +277 -0
  12. cloudpss-4.0.0/cloudpss/job/jobMachine.py +11 -0
  13. cloudpss-4.0.0/cloudpss/job/jobPolicy.py +129 -0
  14. cloudpss-4.0.0/cloudpss/job/jobQueue.py +14 -0
  15. cloudpss-4.0.0/cloudpss/job/jobReceiver.py +33 -0
  16. cloudpss-4.0.0/cloudpss/job/jobTres.py +6 -0
  17. cloudpss-4.0.0/cloudpss/job/messageStreamReceiver.py +120 -0
  18. cloudpss-4.0.0/cloudpss/job/messageStreamSender.py +74 -0
  19. cloudpss-4.0.0/cloudpss/job/view/EMTView.py +216 -0
  20. cloudpss-4.0.0/cloudpss/job/view/IESLabSimulationView.py +5 -0
  21. cloudpss-4.0.0/cloudpss/job/view/IESLabTypicalDayView.py +27 -0
  22. cloudpss-4.0.0/cloudpss/job/view/IESView.py +103 -0
  23. cloudpss-4.0.0/cloudpss/job/view/PowerFlowView.py +80 -0
  24. cloudpss-4.0.0/cloudpss/job/view/__init__.py +42 -0
  25. cloudpss-4.0.0/cloudpss/job/view/view.py +122 -0
  26. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/jobDefinitions.py +34 -0
  27. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/model.py +226 -23
  28. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/revision.py +6 -7
  29. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/project/project.py +4 -3
  30. cloudpss-4.0.0/cloudpss/runner/IESLabEvaluationResult.py +143 -0
  31. cloudpss-4.0.0/cloudpss/runner/IESLabPlanResult.py +195 -0
  32. cloudpss-4.0.0/cloudpss/runner/IESLabTypicalDayResult.py +142 -0
  33. cloudpss-4.0.0/cloudpss/runner/MessageStreamReceiver.py +193 -0
  34. cloudpss-4.0.0/cloudpss/runner/__init__.py +10 -0
  35. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/runner/receiver.py +5 -3
  36. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/runner/result.py +38 -4
  37. cloudpss-4.0.0/cloudpss/runner/runner.py +220 -0
  38. cloudpss-4.0.0/cloudpss/utils/IO.py +164 -0
  39. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/utils/__init__.py +5 -1
  40. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/utils/graphqlUtil.py +1 -0
  41. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/utils/httprequests.py +17 -9
  42. cloudpss-4.0.0/cloudpss/utils/yamlLoader.py +80 -0
  43. cloudpss-4.0.0/cloudpss/verify.py +57 -0
  44. cloudpss-4.0.0/cloudpss/version.py +1 -0
  45. cloudpss-4.0.0/cloudpss.egg-info/PKG-INFO +44 -0
  46. cloudpss-4.0.0/cloudpss.egg-info/SOURCES.txt +74 -0
  47. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss.egg-info/requires.txt +1 -0
  48. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/setup.py +5 -2
  49. cloudpss-4.0.0/test/test-sdk.py +29 -0
  50. cloudpss-4.0.0/test/test-snapshot.py +77 -0
  51. cloudpss-4.0.0/test/test.py +29 -0
  52. cloudpss-4.0.0/test/testAsync.py +33 -0
  53. cloudpss-4.0.0/test/testEvent.py +46 -0
  54. cloudpss-4.0.0/test/testRt copy.py +107 -0
  55. cloudpss-4.0.0/test/testRt.py +150 -0
  56. cloudpss-4.0.0/test/testSend.py +39 -0
  57. cloudpss-4.0.0/test/test_in_new_web_1.py +118 -0
  58. cloudpss-4.0.0/test/testb.py +18 -0
  59. cloudpss-3.2.0a2/PKG-INFO +0 -44
  60. cloudpss-3.2.0a2/cloudpss/runner/__init__.py +0 -8
  61. cloudpss-3.2.0a2/cloudpss/runner/runner.py +0 -104
  62. cloudpss-3.2.0a2/cloudpss/utils/yamlLoader.py +0 -81
  63. cloudpss-3.2.0a2/cloudpss/verify.py +0 -30
  64. cloudpss-3.2.0a2/cloudpss.egg-info/PKG-INFO +0 -44
  65. cloudpss-3.2.0a2/cloudpss.egg-info/SOURCES.txt +0 -36
  66. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/README.md +0 -0
  67. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/function/__init__.py +0 -0
  68. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/function/function.py +0 -0
  69. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/function/job.py +0 -0
  70. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/__init__.py +0 -0
  71. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/implements/__init__.py +0 -0
  72. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/implements/component.py +0 -0
  73. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/implements/diagram.py +0 -0
  74. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/implements/implement.py +0 -0
  75. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/model/topology.py +0 -0
  76. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/project/__init__.py +0 -0
  77. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/runner/storage.py +0 -0
  78. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/runner/transform.py +0 -0
  79. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/utils/dataEncoder.py +0 -0
  80. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss/utils/matlab.py +0 -0
  81. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss.egg-info/dependency_links.txt +0 -0
  82. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/cloudpss.egg-info/top_level.txt +0 -0
  83. {cloudpss-3.2.0a2 → cloudpss-4.0.0}/setup.cfg +0 -0
@@ -0,0 +1,44 @@
1
+ Metadata-Version: 2.1
2
+ Name: cloudpss
3
+ Version: 4.0.0
4
+ Summary: cloudpss sdk
5
+ Home-page: https://www.cloudpss.net
6
+ Author: cloudpss
7
+ Author-email: zhangdaming@cloudpss.net
8
+ License: MIT Licence
9
+ Keywords: cloudpss,cloudpss-sdk
10
+ Platform: any
11
+ Requires-Python: >=3.7
12
+ Description-Content-Type: text/markdown
13
+
14
+
15
+ CloudPSS SDK
16
+ ----------------------------------------------------------------
17
+ CloudPSS SDK是基于CloudPSS-API封装的模型及软件开发套件。用户可通过编写Python、Matlab等脚本构建自定义模型,或是调用CloudPSS平台中的模型修改、仿真计算功能,实现诸如自动修改模型、批量仿真计算、自动化生成报告等复杂且繁琐的功能。用户也可在其自己的应用程序中调用CloudPSS仿真引擎,实现仿真驱动的高级分析应用。
18
+
19
+ CloudPSS SDK包含模型层、算法层和应用层三种开发套件,其中:
20
+
21
+ 1. `模型层开发套件`帮助用户在CloudPSS SimStudio官方潮流计算、电磁暂态仿真、移频电磁暂态仿真、综合能源能量流计算等内核中开发第三方模型或用户自定义模型。目前,模型层SDK已开放基于Matlab函数的自定义控制元件接入,后续将进一步开放Python、C/C++的标准元件开发套件。
22
+ 2. `算法层开发套件`帮助用户在CloudPSS FuncStudio中集成自己的算法内核,从而借助CloudPSS XStudio平台快速开发并部署自己的计算应用。该部分内容将在年内发布,敬请期待。
23
+ 3. `应用层开发套件`帮助用户在利用脚本的形式快速调用CloudPSS官方计算内核和第三方接入的计算内核,从而方便用户开发高级计算分析应用。其中,SimStudio-SDK现已支持SimStudio中的模型修改和`潮流计算`和`电磁暂态仿真`两种计算内核。
24
+
25
+
26
+ ---
27
+ ### 下载与安装
28
+
29
+ ```[pyhton]
30
+ pip install cloudpss
31
+ ```
32
+ 需要`升级`的话,执行下面的命令:
33
+ ```[pyhton]
34
+ pip install --upgrade cloudpss
35
+ ```
36
+ ### 完全卸载
37
+
38
+ 执行下面的命令进行`完全卸载`:
39
+ ```[pyhton]
40
+ pip uninstall cloudpss
41
+ ```
42
+
43
+
44
+
@@ -1,22 +1,23 @@
1
1
  # coding=UTF-8
2
+ from cloudpss.ieslab import IESLabSimulation, IESLabPlan
2
3
  from .verify import setToken
3
4
  from .runner import Runner, Result, EMTResult, PowerFlowResult
4
5
  from .model import Model, ModelRevision, ModelTopology
5
6
  from .project import Project
6
7
  from .utils import MatlabDataEncoder, DateTimeEncode
7
8
  from . import function
9
+ from .job import Job
8
10
  from .function import FunctionExecution
9
-
11
+ from .version import __version__
10
12
  __all__ = [
11
13
  'setToken', 'Model', 'ModelRevision', 'ModelTopology', 'Runner', 'Result',
12
14
  'PowerFlowResult', 'EMTResult', 'MatlabDataEncoder', 'DateTimeEncode',
13
- 'function', 'Project', 'currentJob'
15
+ 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','__version__','Job'
14
16
  ]
15
- __version__ = '3.2.0.alpha.2'
16
17
 
17
18
 
18
19
  def currentJob():
19
20
  """
20
21
  获取当前的 currentExecution 实例
21
22
  """
22
- return FunctionExecution.current()
23
+ return FunctionExecution.current()
@@ -50,8 +50,6 @@ class FunctionExecution(object):
50
50
  """
51
51
  获取表示当前执行的 FunctionExecution 单例
52
52
  """
53
- if FunctionExecution._current is not None:
54
- return FunctionExecution._current
55
53
  jobId = os.environ.get('CLOUDPSS_JOB_ID', None)
56
54
  functionId = os.environ.get('CLOUDPSS_FUNCTION_ID', None)
57
55
  executorId = os.environ.get('CLOUDPSS_EXECUTOR_ID', None)
@@ -165,7 +163,7 @@ class FunctionExecution(object):
165
163
  sys.exit(code)
166
164
 
167
165
  def print(self, data):
168
- print(json.dumps(data, cls=MatlabDataEncoder), flush=True)
166
+ print(json.dumps(data, cls=MatlabDataEncoder)+'\n', flush=True)
169
167
 
170
168
  def log(self, content, level='info', html=False, key=None):
171
169
  '''
@@ -0,0 +1,415 @@
1
+ from ..utils import request, fileLoad, graphql_request
2
+ import json
3
+ import time, datetime
4
+ import copy
5
+
6
+
7
+ class DataManageModel(object):
8
+ _kindUrlMap = {}
9
+ _kindNameMap = {}
10
+ _weatherUrl = ''
11
+ _baseUri = ''
12
+ _itemDataMap={}
13
+ _kindItemDataMap={}
14
+ _kindIdMap={}
15
+ def __init__(self, simulationId):
16
+ self.simulationId = simulationId
17
+ self._getAllData()
18
+ def _fetchItemData(self, url, kind):
19
+ '''
20
+ 私有方法,获取kind类型对应所有数据项的列表
21
+
22
+ :params: url string类型,request请求对应的url链接
23
+
24
+ :params: kind string类型,数据的种类标识,比如PhotovoltaicSys, WindPowerGenerator, GasTurbine等等
25
+
26
+ :return: list类型,返回该种类下所有数据项的的列表
27
+ '''
28
+ r = request('GET',
29
+ url,
30
+ params={
31
+ "simu_id": self.simulationId,
32
+ "kind": kind
33
+ })
34
+ str = url.split('/')[-2]
35
+ if(str in ['typhoon', 'rainfall', 'earthquake', 'extremeCold'] and r.status_code == 404):
36
+ return {}
37
+ else :
38
+ data = json.loads(r.text)
39
+ return data['results']
40
+
41
+ def _deleteItemData(self, url):
42
+ '''
43
+ 私有方法,删除url链接对应的数据
44
+
45
+ :params: url string类型,request请求对应的url链接
46
+
47
+ :return: 无
48
+ '''
49
+ r = request('DELETE',
50
+ url)
51
+ return r.text
52
+ def _saveItemData(self, url, data):
53
+ '''
54
+ 私有方法,保存url链接对应的data数据
55
+
56
+ :params: url string类型,request请求对应的url链接
57
+
58
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
59
+
60
+ :return: dict类型,表示成功添加的数据内容
61
+ '''
62
+ r = request('POST', url, data=json.dumps(data))
63
+ dataList = json.loads(r.text)
64
+ return dataList
65
+
66
+ def _updateItemData(self, url, data):
67
+ '''
68
+ 私有方法,更新url链接对应的data数据
69
+
70
+ :params: url string类型,request请求对应的url链接
71
+
72
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
73
+
74
+ :return: dict类型,表示成功更新的数据内容
75
+ '''
76
+ r = request('PATCH', url, data=json.dumps(data))
77
+ dataList = json.loads(r.text)
78
+ return dataList
79
+
80
+ def _getAllData(self):
81
+ '''
82
+ 私有方法,获取数据管理模块全部数据,函数初始化时调用
83
+
84
+ :return: 无
85
+ '''
86
+ list = ['thermalLoads', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold']
87
+ for kind,value in self._kindUrlMap.items():
88
+ try:
89
+
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
102
+
103
+ def GetDataItem(self, ID: str):
104
+ '''
105
+ 获取ID对应的元素信息
106
+
107
+ :params: ID string类型,代表数据项的标识符,可以在所有类型的数据项中实现唯一标识
108
+
109
+ :return: dict类型,为源数据的引用,返回该数据项的信息
110
+ '''
111
+ data = self._itemDataMap.get(str(ID),None)
112
+
113
+ assert (data is not None), "找不到数据"
114
+
115
+ return copy.deepcopy(data)
116
+
117
+ def GetItemList(self, dataType):
118
+ '''
119
+ 获取dataType类型对应所有数据项的列表
120
+
121
+ :params: dataType enum类型,数据的种类标识,包含:"光伏": "PhotovoltaicSys","风机": "WindPowerGenerator","燃气轮机": "GasTurbine","热泵": "HeatPump","燃气锅炉": "GasBoiler","热管式太阳能集热器": "HPSolarCollector","电压缩制冷机": "CompRefrg","吸收式制冷机": "AbsorptionChiller","蓄电池": "Battery","储水罐": "WaterTank","变压器": "Transformer","传输线": "TransferLine","模块化多电平变流器": "MMC","离心泵": "CentrifugalPump","管道": "Pipe","采暖制冷负荷": "thermalLoads","电负荷": "electricLoads","燃料": "fuels","热": "HVACHeating","冷": "HVACCooling","常数电价": "常数电价","分时电价": "分时电价","阶梯电价": "阶梯电价","分时阶梯电价": "分时阶梯电价"
122
+
123
+ :return: list类型,返回该种类下所有数据项的列表
124
+ '''
125
+ assert (dataType in self._kindNameMap
126
+ or dataType in self._kindUrlMap), "数据类型不存在"
127
+ kind = self._kindNameMap.get(dataType, dataType)
128
+ return copy.deepcopy(self._kindItemDataMap[kind])
129
+
130
+ def AddDataItem(self, dataType, data):
131
+ '''
132
+ 向dataType类型的数据库中添加内容为data的数据项
133
+
134
+ :params: dataType enum类型,数据的种类标识,包含:"光伏"、"风机"、"燃气轮机"、"热泵"、"燃气锅炉"、"热管式太阳能集热器"、"电压缩制冷机"、"吸收式制冷机"、"蓄电池"、"储水罐"、"变压器"、"传输线"、"模块化多电平变流器"、"离心泵"、"管道"、"采暖制冷负荷"、"电负荷"、"燃料"、"热"、"冷"、"常数电价"、"分时电价"、"阶梯电价"、"分时阶梯电价"
135
+
136
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
137
+
138
+ :return: string类型,返回新添加数据项的ID,如果数据结构不满足要求,应当抛出异常
139
+ '''
140
+ assert (dataType in self._kindNameMap
141
+ or dataType in self._kindUrlMap), "数据类型不存在"
142
+ kind = self._kindNameMap.get(dataType, dataType)
143
+ r = copy.deepcopy(data)
144
+ if r['id'] is not None:
145
+ del r['id']
146
+ if r['timeid'] is not None:
147
+ del r['timeid']
148
+ try:
149
+ self._saveItemData(self._kindUrlMap[kind], r)
150
+ self._kindIdMap[str(data['timeid'])]=kind
151
+ self._kindIdMap[str(data['id'])]=kind
152
+ self._itemDataMap[str(data['timeid'])]=data
153
+ self._itemDataMap[str(data['id'])]=data
154
+ if kind in ['thermalLoads', 'electricLoads', 'fuels']:
155
+ dataList = self._fetchItemData(self._kindUrlMap[kind], None)
156
+ self._kindItemDataMap[kind] = dataList
157
+ return dataList[-1]['id']
158
+ else:
159
+ dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
160
+ self._kindItemDataMap[kind] = dataList
161
+ return dataList[-1]['id']
162
+ except Exception as e:
163
+ raise Exception(str(e))
164
+
165
+ def UpdateDataItem(self, ID: str, data):
166
+ '''
167
+ 更新数据库ID对应数据项"光伏"、"风机"、"燃气轮机"、"热泵"、"燃气锅炉"、"热管式太阳能集热器"、"电压缩制冷机"、"吸收式制冷机"、"蓄电池"、"储水罐"、"变压器"、"传输线"、"模块化多电平变流器"、"离心泵"、"管道"、"采暖制冷负荷"、"电负荷"、"燃料"、"热"、"冷"、"常数电价"、"分时电价"、"阶梯电价"、"分时阶梯电价"数据
168
+
169
+ :params: id string类型,代表数据项的标识符,可以在所有类型的数据项中实现唯一标识
170
+ :params: data dict类型,表示添加的数据内容,其数据结构应满足对应数据项的结构要求
171
+
172
+ :return: bool 类型,返回True 更新成功
173
+ '''
174
+ try:
175
+ kind = self._kindNameMap.get(data['kind'], data['kind'])
176
+ if kind is not None:
177
+ url=self._kindUrlMap[kind] + '/' + str(ID) + '/'
178
+ ret = self._updateItemData(url, data)
179
+ for i in range(len(self._kindItemDataMap[kind])):
180
+ if str(self._kindItemDataMap[kind][i]['id']) == str(ID):
181
+ self._kindItemDataMap[kind][i] = data
182
+ break
183
+ else:
184
+ pass
185
+ return True
186
+ else:
187
+ raise Exception('传入的数据缺乏kind类型')
188
+ except Exception as e:
189
+ raise Exception(str(e))
190
+
191
+ def DeleteDataItem(self, ID: str):
192
+ '''
193
+ 向数据库中删除ID对应数据项"光伏"、"风机"、"燃气轮机"、"热泵"、"燃气锅炉"、"热管式太阳能集热器"、"电压缩制冷机"、"吸收式制冷机"、"蓄电池"、"储水罐"、"变压器"、"传输线"、"模块化多电平变流器"、"离心泵"、"管道"、"采暖制冷负荷"、"电负荷"、"燃料"、"热"、"冷"、"常数电价"、"分时电价"、"阶梯电价"、"分时阶梯电价"数据
194
+
195
+ :params: ID string类型,代表数据项的标识符,可以在所有类型的数据项中实现唯一标识
196
+
197
+ :return: bool 类型,删除是否成功,如果ID错误,抛出异常
198
+ '''
199
+ data = self._itemDataMap.get(str(ID),None)
200
+ kind = self._kindIdMap.get(str(ID))
201
+ if data is None or kind is None:
202
+ raise Exception('id错误,未找到该id资源')
203
+ else:
204
+ url=self._kindUrlMap[kind]
205
+ self._deleteItemData(url+str(data['id'])+'/')
206
+ del self._itemDataMap[str(data['timeid'])]
207
+ del self._itemDataMap[str(data['id'])]
208
+ dataList=self._kindItemDataMap[kind]
209
+ for i in range(len(dataList)):
210
+ if dataList[i]['id'] == data['id']:
211
+ del dataList[i]
212
+ break
213
+ return True
214
+
215
+ def SetProjectPosition(self, longitude, latitude):
216
+ '''
217
+ 将项目的经纬度位置坐标设置为(longitude, latitude)
218
+
219
+ :params: longitude float类型,表示经度,范围为气象数据源的经度范围
220
+ :params: latitude float类型,表示纬度,范围为气象数据源的纬度范围
221
+ '''
222
+ if (float(longitude) > 180 or float(longitude) < -180
223
+ or float(latitude) > 90 or float(latitude) < -90):
224
+ raise Exception('经纬度坐标不存在')
225
+ else:
226
+ r = request('GET',
227
+ self._baseUri + 'rest/weather_param/',
228
+ params={"simu": self.simulationId})
229
+ param = json.loads(r.text)
230
+ if (len(param["results"]) == 0):
231
+ r = request('POST',
232
+ self._baseUri + 'rest/weather_param/',
233
+ data=json.dumps({
234
+ "lat": latitude,
235
+ "lng": longitude,
236
+ "simu": self.simulationId,
237
+ "simu_id": self.simulationId,
238
+ }))
239
+ else:
240
+ id = param['results'][0]['id']
241
+ r = request('PUT',
242
+ self._baseUri + 'rest/weather_param/' + str(id) +
243
+ '/',
244
+ data=json.dumps({
245
+ "id": id,
246
+ "lat": latitude,
247
+ "lng": longitude,
248
+ "simu": self.simulationId,
249
+ "simu_id": self.simulationId,
250
+ }))
251
+ r = request('GET',
252
+ self._baseUri + 'load_weather/',
253
+ params={
254
+ "lat": latitude,
255
+ "lng": longitude,
256
+ "simu": self.simulationId,
257
+ "simu_id": self.simulationId,
258
+ })
259
+
260
+ def GetAtmosData(self, startDate, endDate):
261
+ '''
262
+ 获取在startDate到endDate之间的气象数据
263
+
264
+ :params: startDate dateTime类型,表示开始时间
265
+ :params: endDate dateTime类型,表示结束时间
266
+
267
+ :return: list<dict>类型,为源数据的引用,返回当前项目位置对应时间范围内的气象数据序列,每个元素用字典进行表示,字典的key即区分不同的气象数据项(如风速、太阳辐照等)以及标识当前时间点
268
+ '''
269
+ sDate = datetime.date(*map(int, startDate.split('-')))
270
+ eDate = datetime.date(*map(int, endDate.split('-')))
271
+ res = (eDate - sDate).days * 86400 + (eDate - sDate).seconds
272
+ if res < 0:
273
+ raise Exception('超出有效时间范围')
274
+ else:
275
+ r = request('GET',
276
+ self._weatherUrl,
277
+ params={
278
+ "time_after": startDate,
279
+ "time_before": endDate,
280
+ "sid": self.simulationId,
281
+ })
282
+ weatherData = json.loads(r.text)
283
+ return weatherData['results']
284
+
285
+
286
+ class IESSimulationDataManageModel(DataManageModel):
287
+ _baseUri = 'api/ieslab-simulation/'
288
+ _weatherUrl = 'api/ieslab-simulation/rest/weather_data/'
289
+ _kindNameMap = {
290
+ "光伏": "PhotovoltaicSys",
291
+ "风机": "WindPowerGenerator",
292
+ "燃气轮机": "GasTurbine",
293
+ "热泵": "HeatPump",
294
+ "燃气锅炉": "GasBoiler",
295
+ "热管式太阳能集热器": "HPSolarCollector",
296
+ "电压缩制冷机": "CompRefrg",
297
+ "吸收式制冷机": "AbsorptionChiller",
298
+ "蓄电池": "Battery",
299
+ "储水罐": "WaterTank",
300
+ "变压器": "Transformer",
301
+ "传输线": "TransferLine",
302
+ "模块化多电平变流器": "MMC",
303
+ "离心泵": "CentrifugalPump",
304
+ "管道": "Pipe",
305
+ "采暖制冷负荷": "thermalLoads",
306
+ "电负荷": "electricLoads",
307
+ "燃料": "fuels",
308
+ "热": "HVACHeating",
309
+ "冷": "HVACCooling",
310
+ "常数电价": "常数电价",
311
+ "分时电价": "分时电价",
312
+ "阶梯电价": "阶梯电价",
313
+ "分时阶梯电价": "分时阶梯电价",
314
+ "台风灾害": "typhoon",
315
+ "降雨灾害": "rainfall",
316
+ "地震灾害": "earthquake",
317
+ "极寒灾害": "extremeCold"
318
+ }
319
+ _kindUrlMap = {
320
+ "PhotovoltaicSys": "api/ieslab-simulation/rest/dpcs/",
321
+ "WindPowerGenerator": "api/ieslab-simulation/rest/dpcs/",
322
+ "GasTurbine": "api/ieslab-simulation/rest/dpcs/",
323
+ "HeatPump": "api/ieslab-simulation/rest/dhscs/",
324
+ "GasBoiler": "api/ieslab-simulation/rest/dhscs/",
325
+ "HPSolarCollector": "api/ieslab-simulation/rest/dhscs/",
326
+ "CompRefrg": "api/ieslab-simulation/rest/dhscs/",
327
+ "AbsorptionChiller": "api/ieslab-simulation/rest/dhscs/",
328
+ "Battery": "api/ieslab-simulation/rest/escs/",
329
+ "WaterTank": "api/ieslab-simulation/rest/escs/",
330
+ "Transformer": "api/ieslab-simulation/rest/dstcs/",
331
+ "TransferLine": "api/ieslab-simulation/rest/dstcs/",
332
+ "MMC": "api/ieslab-simulation/rest/dstcs/",
333
+ "CentrifugalPump": "api/ieslab-simulation/rest/hstcs/",
334
+ "Pipe": "api/ieslab-simulation/rest/hstcs/",
335
+ "thermalLoads": "api/ieslab-simulation/rest/thermalLoads/",
336
+ "electricLoads": "api/ieslab-simulation/rest/electricLoads/",
337
+ "fuels": "api/ieslab-simulation/rest/fuels/",
338
+ "HVACHeating": "api/ieslab-simulation/rest/hots/",
339
+ "HVACCooling": "api/ieslab-simulation/rest/colds/",
340
+ "常数电价": "api/ieslab-simulation/rest/elects/",
341
+ "分时电价": "api/ieslab-simulation/rest/elects/",
342
+ "阶梯电价": "api/ieslab-simulation/rest/elects/",
343
+ "分时阶梯电价": "api/ieslab-simulation/rest/elects/",
344
+ "typhoon": "api/ieslab-simulation/rest/typhoon/",
345
+ "rainfall": "api/ieslab-simulation/rest/rainfall/",
346
+ "earthquake": "api/ieslab-simulation/rest/earthquake/",
347
+ "extremeCold": "api/ieslab-simulation/rest/extremeCold/"
348
+ }
349
+ pass
350
+
351
+
352
+ class IESPlanDataManageModel(DataManageModel):
353
+ _baseUri = 'api/ieslab-plan/'
354
+ _weatherUrl = 'api/ieslab-plan/rest/weather_data/'
355
+ _kindNameMap = {
356
+ "光伏": "PhotovoltaicSys",
357
+ "风机": "WindPowerGenerator",
358
+ "燃气轮机": "GasTurbine",
359
+ "热泵": "HeatPump",
360
+ "燃气锅炉": "GasBoiler",
361
+ "热管式太阳能集热器": "HPSolarCollector",
362
+ "电压缩制冷机": "CompRefrg",
363
+ "吸收式制冷机": "AbsorptionChiller",
364
+ "蓄电池": "Battery",
365
+ "储水罐": "WaterTank",
366
+ "变压器": "Transformer",
367
+ "传输线": "TransferLine",
368
+ "模块化多电平变流器": "MMC",
369
+ "离心泵": "CentrifugalPump",
370
+ "管道": "Pipe",
371
+ "采暖制冷负荷": "thermalLoads",
372
+ "电负荷": "electricLoads",
373
+ "燃料": "fuels",
374
+ "热": "HVACHeating",
375
+ "冷": "HVACCooling",
376
+ "常数电价": "常数电价",
377
+ "分时电价": "分时电价",
378
+ "阶梯电价": "阶梯电价",
379
+ "分时阶梯电价": "分时阶梯电价",
380
+ "台风灾害": "typhoon",
381
+ "降雨灾害": "rainfall",
382
+ "地震灾害": "earthquake",
383
+ "极寒灾害": "extremeCold"
384
+ }
385
+ _kindUrlMap = {
386
+ "PhotovoltaicSys": "api/ieslab-plan/rest/dpcs/",
387
+ "WindPowerGenerator": "api/ieslab-plan/rest/dpcs/",
388
+ "GasTurbine": "api/ieslab-plan/rest/dpcs/",
389
+ "HeatPump": "api/ieslab-plan/rest/dhscs/",
390
+ "GasBoiler": "api/ieslab-plan/rest/dhscs/",
391
+ "HPSolarCollector": "api/ieslab-plan/rest/dhscs/",
392
+ "CompRefrg": "api/ieslab-plan/rest/dhscs/",
393
+ "AbsorptionChiller": "api/ieslab-plan/rest/dhscs/",
394
+ "Battery": "api/ieslab-plan/rest/escs/",
395
+ "WaterTank": "api/ieslab-plan/rest/escs/",
396
+ "Transformer": "api/ieslab-plan/rest/dstcs/",
397
+ "TransferLine": "api/ieslab-plan/rest/dstcs/",
398
+ "MMC": "api/ieslab-plan/rest/dstcs/",
399
+ "CentrifugalPump": "api/ieslab-plan/rest/hstcs/",
400
+ "Pipe": "api/ieslab-plan/rest/hstcs/",
401
+ "thermalLoads": "api/ieslab-plan/rest/thermalLoads/",
402
+ "electricLoads": "api/ieslab-plan/rest/electricLoads/",
403
+ "fuels": "api/ieslab-plan/rest/fuels/",
404
+ "HVACHeating": "api/ieslab-plan/rest/hots/",
405
+ "HVACCooling": "api/ieslab-plan/rest/colds/",
406
+ "常数电价": "api/ieslab-plan/rest/elects/",
407
+ "分时电价": "api/ieslab-plan/rest/elects/",
408
+ "阶梯电价": "api/ieslab-plan/rest/elects/",
409
+ "分时阶梯电价": "api/ieslab-plan/rest/elects/",
410
+ "typhoon": "api/ieslab-plan/rest/typhoon/",
411
+ "rainfall": "api/ieslab-plan/rest/rainfall/",
412
+ "earthquake": "api/ieslab-plan/rest/earthquake/",
413
+ "extremeCold": "api/ieslab-plan/rest/extremeCold/"
414
+ }
415
+ pass