frost-sta-client 1.1.49__py2.py3-none-any.whl → 1.1.51__py2.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.
- frost_sta_client/__version__.py +1 -1
- frost_sta_client/model/actuator.py +1 -1
- frost_sta_client/model/datastream.py +338 -338
- frost_sta_client/model/ext/data_array_document.py +67 -68
- frost_sta_client/model/ext/entity_list.py +169 -162
- frost_sta_client/model/feature_of_interest.py +1 -1
- frost_sta_client/model/historical_location.py +1 -1
- frost_sta_client/model/location.py +2 -2
- frost_sta_client/model/multi_datastream.py +345 -345
- frost_sta_client/model/observedproperty.py +210 -210
- frost_sta_client/model/task.py +3 -3
- frost_sta_client/model/tasking_capability.py +2 -2
- {frost_sta_client-1.1.49.dist-info → frost_sta_client-1.1.51.dist-info}/METADATA +1 -1
- {frost_sta_client-1.1.49.dist-info → frost_sta_client-1.1.51.dist-info}/RECORD +17 -17
- {frost_sta_client-1.1.49.dist-info → frost_sta_client-1.1.51.dist-info}/WHEEL +0 -0
- {frost_sta_client-1.1.49.dist-info → frost_sta_client-1.1.51.dist-info}/licenses/LICENSE +0 -0
- {frost_sta_client-1.1.49.dist-info → frost_sta_client-1.1.51.dist-info}/top_level.txt +0 -0
@@ -1,345 +1,345 @@
|
|
1
|
-
# Copyright (C) 2021 Fraunhofer Institut IOSB, Fraunhoferstr. 1, D 76131
|
2
|
-
# Karlsruhe, Germany.
|
3
|
-
#
|
4
|
-
# This program is free software: you can redistribute it and/or modify
|
5
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
6
|
-
# the Free Software Foundation, either version 3 of the License, or
|
7
|
-
# (at your option) any later version.
|
8
|
-
#
|
9
|
-
# This program is distributed in the hope that it will be useful,
|
10
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
-
# GNU Lesser General Public License for more details.
|
13
|
-
#
|
14
|
-
# You should have received a copy of the GNU Lesser General Public License
|
15
|
-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
-
|
17
|
-
import frost_sta_client.model
|
18
|
-
from frost_sta_client.dao.multi_datastream import MultiDatastreamDao
|
19
|
-
|
20
|
-
from . import entity
|
21
|
-
from . import thing
|
22
|
-
from . import sensor
|
23
|
-
from . import observation
|
24
|
-
from . import observedproperty
|
25
|
-
from .ext import unitofmeasurement
|
26
|
-
|
27
|
-
from frost_sta_client import utils
|
28
|
-
from .ext import entity_list
|
29
|
-
from .ext import entity_type
|
30
|
-
|
31
|
-
import geojson.geometry
|
32
|
-
|
33
|
-
|
34
|
-
class MultiDatastream(entity.Entity):
|
35
|
-
def __init__(self,
|
36
|
-
name='',
|
37
|
-
description='',
|
38
|
-
properties=None,
|
39
|
-
unit_of_measurements=None,
|
40
|
-
observation_type='',
|
41
|
-
multi_observation_data_types=None,
|
42
|
-
observed_area=None,
|
43
|
-
phenomenon_time=None,
|
44
|
-
result_time=None,
|
45
|
-
thing=None,
|
46
|
-
sensor=None,
|
47
|
-
observed_properties=None,
|
48
|
-
observations=None,
|
49
|
-
**kwargs):
|
50
|
-
super().__init__(**kwargs)
|
51
|
-
if properties is None:
|
52
|
-
properties = {}
|
53
|
-
if multi_observation_data_types is None:
|
54
|
-
multi_observation_data_types = []
|
55
|
-
self.name = name
|
56
|
-
self.description = description
|
57
|
-
self.properties = properties
|
58
|
-
self.unit_of_measurements = unit_of_measurements
|
59
|
-
self.observation_type = observation_type
|
60
|
-
self.multi_observation_data_types = multi_observation_data_types
|
61
|
-
self.observed_area = observed_area
|
62
|
-
self.phenomenon_time = phenomenon_time
|
63
|
-
self.result_time = result_time
|
64
|
-
self.thing = thing
|
65
|
-
self.sensor = sensor
|
66
|
-
self.observed_properties = observed_properties
|
67
|
-
self.observations = observations
|
68
|
-
|
69
|
-
def __new__(cls, *args, **kwargs):
|
70
|
-
new_mds = super().__new__(cls)
|
71
|
-
attributes = dict(_id=None, _name='', _description='', _properties={}, _observation_type='', _multi_observation_data_types=[],
|
72
|
-
_unit_of_measurements=[], _observed_area=None, _phenomenon_time=None, _result_time=None,
|
73
|
-
_thing=None, _sensor=None, _observed_properties=None, _observations=None, _self_link='',
|
74
|
-
_service=None)
|
75
|
-
for key, value in attributes.items():
|
76
|
-
new_mds.__dict__[key] = value
|
77
|
-
return new_mds
|
78
|
-
|
79
|
-
@property
|
80
|
-
def name(self):
|
81
|
-
return self._name
|
82
|
-
|
83
|
-
@name.setter
|
84
|
-
def name(self, value):
|
85
|
-
if value is None:
|
86
|
-
self._name = None
|
87
|
-
return
|
88
|
-
if not isinstance(value, str):
|
89
|
-
raise ValueError('name should be of type str!')
|
90
|
-
self._name = value
|
91
|
-
|
92
|
-
@property
|
93
|
-
def description(self):
|
94
|
-
return self._description
|
95
|
-
|
96
|
-
@description.setter
|
97
|
-
def description(self, value):
|
98
|
-
if value is None:
|
99
|
-
self._description = None
|
100
|
-
return
|
101
|
-
if not isinstance(value, str):
|
102
|
-
raise ValueError('description should be of type str!')
|
103
|
-
self._description = value
|
104
|
-
|
105
|
-
@property
|
106
|
-
def properties(self):
|
107
|
-
return self._properties
|
108
|
-
|
109
|
-
@properties.setter
|
110
|
-
def properties(self, values):
|
111
|
-
if values is None:
|
112
|
-
self._properties = {}
|
113
|
-
return
|
114
|
-
if not isinstance(values, dict):
|
115
|
-
raise ValueError('properties should be of type dict!')
|
116
|
-
self._properties = values
|
117
|
-
|
118
|
-
@property
|
119
|
-
def unit_of_measurements(self):
|
120
|
-
return self._unit_of_measurements
|
121
|
-
|
122
|
-
@unit_of_measurements.setter
|
123
|
-
def unit_of_measurements(self, values):
|
124
|
-
if values is not None and (not isinstance(values, list) or \
|
125
|
-
any((not isinstance(uom, unitofmeasurement.UnitOfMeasurement)) for uom in values)):
|
126
|
-
raise ValueError('unit_of_measurements should be a list of type UnitOfMeasurement')
|
127
|
-
self._unit_of_measurements = values
|
128
|
-
|
129
|
-
@property
|
130
|
-
def observation_type(self):
|
131
|
-
return self._observation_type
|
132
|
-
|
133
|
-
@observation_type.setter
|
134
|
-
def observation_type(self, value):
|
135
|
-
if not isinstance(value, str):
|
136
|
-
raise ValueError('observation_type should be of type str!')
|
137
|
-
self._observation_type = value
|
138
|
-
|
139
|
-
@property
|
140
|
-
def multi_observation_data_types(self):
|
141
|
-
return self._multi_observation_data_types
|
142
|
-
|
143
|
-
@multi_observation_data_types.setter
|
144
|
-
def multi_observation_data_types(self, values):
|
145
|
-
if values is not None and (not isinstance(values, list) or any((not isinstance(dtype, str)) for dtype in values)):
|
146
|
-
raise ValueError('multi_observations_data_types should be list of type str!')
|
147
|
-
self._multi_observation_data_types = values
|
148
|
-
|
149
|
-
@property
|
150
|
-
def observed_area(self):
|
151
|
-
return self._observed_area
|
152
|
-
|
153
|
-
@observed_area.setter
|
154
|
-
def observed_area(self, value):
|
155
|
-
if value is None:
|
156
|
-
self._observed_area = None
|
157
|
-
return
|
158
|
-
if not isinstance(value, geojson.geometry.Polygon):
|
159
|
-
raise ValueError('observedArea should be geojson object')
|
160
|
-
self._observed_area = value
|
161
|
-
|
162
|
-
@property
|
163
|
-
def phenomenon_time(self):
|
164
|
-
return self._phenomenon_time
|
165
|
-
|
166
|
-
@phenomenon_time.setter
|
167
|
-
def phenomenon_time(self, value):
|
168
|
-
self._phenomenon_time = utils.check_datetime(value, 'phenomenon_time')
|
169
|
-
|
170
|
-
@property
|
171
|
-
def result_time(self):
|
172
|
-
return self._result_time
|
173
|
-
|
174
|
-
@result_time.setter
|
175
|
-
def result_time(self, value):
|
176
|
-
self._result_time = utils.check_datetime(value, 'result_time')
|
177
|
-
|
178
|
-
@property
|
179
|
-
def thing(self):
|
180
|
-
return self._thing
|
181
|
-
|
182
|
-
@thing.setter
|
183
|
-
def thing(self, value):
|
184
|
-
if value is not None and not isinstance(value, thing.Thing):
|
185
|
-
raise ValueError('thing should be of type Thing!')
|
186
|
-
self._thing = value
|
187
|
-
|
188
|
-
@property
|
189
|
-
def sensor(self):
|
190
|
-
return self._sensor
|
191
|
-
|
192
|
-
@sensor.setter
|
193
|
-
def sensor(self, value):
|
194
|
-
if value is not None and not isinstance(value, sensor.Sensor):
|
195
|
-
raise ValueError('sensor should be of type Sensor!')
|
196
|
-
self._sensor = value
|
197
|
-
|
198
|
-
@property
|
199
|
-
def observed_properties(self):
|
200
|
-
return self._observed_properties
|
201
|
-
|
202
|
-
@observed_properties.setter
|
203
|
-
def observed_properties(self, values):
|
204
|
-
if values is None:
|
205
|
-
self._observed_properties = None
|
206
|
-
return
|
207
|
-
if isinstance(values, list) and all(isinstance(op, observedproperty.ObservedProperty) for op in values):
|
208
|
-
entity_class = entity_type.EntityTypes['ObservedProperty']['class']
|
209
|
-
self._observed_properties = entity_list.EntityList(entity_class=entity_class, entities=values)
|
210
|
-
return
|
211
|
-
if not isinstance(values, entity_list.EntityList) or \
|
212
|
-
any(not isinstance(op, observedproperty.ObservedProperty) for op in values.entities):
|
213
|
-
raise ValueError('observed_properties should be an entity list of ObservedProperty!')
|
214
|
-
self._observed_properties = values
|
215
|
-
|
216
|
-
@property
|
217
|
-
def observations(self):
|
218
|
-
return self._observations
|
219
|
-
|
220
|
-
@observations.setter
|
221
|
-
def observations(self, values):
|
222
|
-
if values is None:
|
223
|
-
self._observations = None
|
224
|
-
return
|
225
|
-
if isinstance(values, list) and all(isinstance(ob, observation.Observation) for ob in values):
|
226
|
-
entity_class = entity_type.EntityTypes['Observation']['class']
|
227
|
-
self._observations = entity_list.EntityList(entity_class=entity_class, entities=values)
|
228
|
-
return
|
229
|
-
if not isinstance(values, entity_list.EntityList) or \
|
230
|
-
any(not isinstance(ob, observation.Observation) for ob in values.entities):
|
231
|
-
raise ValueError('Observations should be an entity list of Observations')
|
232
|
-
self._observations = values
|
233
|
-
|
234
|
-
def get_observations(self):
|
235
|
-
result = self.service.observations()
|
236
|
-
result.parent = self
|
237
|
-
return result
|
238
|
-
|
239
|
-
def get_observed_properties(self):
|
240
|
-
result = self.service.observed_properties()
|
241
|
-
result.parent = self
|
242
|
-
return result
|
243
|
-
|
244
|
-
def ensure_service_on_children(self, service):
|
245
|
-
if self.thing is not None:
|
246
|
-
self.thing.set_service(service)
|
247
|
-
if self.sensor is not None:
|
248
|
-
self.sensor.set_service(service)
|
249
|
-
if self.observations is not None:
|
250
|
-
self.observations.set_service(service)
|
251
|
-
if self.observed_properties is not None:
|
252
|
-
self.observed_properties.set_service(service)
|
253
|
-
|
254
|
-
def __eq__(self, other):
|
255
|
-
if not super().__eq__(other):
|
256
|
-
return False
|
257
|
-
if self.name != other.name:
|
258
|
-
return False
|
259
|
-
if self.description != other.description:
|
260
|
-
return False
|
261
|
-
if self.observation_type != other.observation_type:
|
262
|
-
return False
|
263
|
-
if self.observed_area != other.
|
264
|
-
return False
|
265
|
-
if self.properties != other.properties:
|
266
|
-
return False
|
267
|
-
if self.result_time != other.result_time:
|
268
|
-
return False
|
269
|
-
if self.unit_of_measurements != other.unit_of_measurements:
|
270
|
-
return False
|
271
|
-
if self.multi_observation_data_types != other.multi_observation_data_types:
|
272
|
-
return False
|
273
|
-
return True
|
274
|
-
|
275
|
-
def __ne__(self, other):
|
276
|
-
return not self == other
|
277
|
-
|
278
|
-
def __getstate__(self):
|
279
|
-
data = super().__getstate__()
|
280
|
-
if self.name is not None and self.name != '':
|
281
|
-
data['name'] = self.name
|
282
|
-
if self.description is not None and self.description != '':
|
283
|
-
data['description'] = self.description
|
284
|
-
if self.observation_type is not None and self.observation_type != '':
|
285
|
-
data['observationType'] = self.observation_type
|
286
|
-
if self.observed_area is not None:
|
287
|
-
data['observedArea'] = self.observed_area
|
288
|
-
if self.phenomenon_time is not None:
|
289
|
-
data['phenomenonTime'] = utils.parse_datetime(self.phenomenon_time)
|
290
|
-
if self.result_time is not None:
|
291
|
-
data['resultTime'] = utils.parse_datetime(self.result_time)
|
292
|
-
if self.thing is not None:
|
293
|
-
data['Thing'] = self.thing
|
294
|
-
if self.sensor is not None:
|
295
|
-
data['Sensor'] = self.sensor
|
296
|
-
if self.properties is not None and self.properties != {}:
|
297
|
-
data['properties'] = self.properties
|
298
|
-
if self.unit_of_measurements is not None and len(self.unit_of_measurements) > 0:
|
299
|
-
data['unitOfMeasurements'] = self.unit_of_measurements
|
300
|
-
if self.multi_observation_data_types is not None and len(self.multi_observation_data_types) > 0:
|
301
|
-
data['multiObservationDataTypes'] = self.multi_observation_data_types
|
302
|
-
if self.observed_properties is not None and len(self.observed_properties.entities) > 0:
|
303
|
-
data['ObservedProperties'] = self.observed_properties.__getstate__()
|
304
|
-
if self.observations is not None and len(self.observations.entities) > 0:
|
305
|
-
data['Observations'] = self.observations.__getstate__()
|
306
|
-
return data
|
307
|
-
|
308
|
-
def __setstate__(self, state):
|
309
|
-
super().__setstate__(state)
|
310
|
-
self.name = state.get('name', None)
|
311
|
-
self.description = state.get('description', None)
|
312
|
-
self.observation_type = state.get('observationType', None)
|
313
|
-
self.observation_area = state.get('observedArea', None)
|
314
|
-
self.phenomenon_time = state.get('phenomenonTime', None)
|
315
|
-
self.result_time = state.get('resultTime', None)
|
316
|
-
self.properties = state.get('properties', None)
|
317
|
-
if state.get('Thing', None) is not None:
|
318
|
-
self.thing = frost_sta_client.model.thing.Thing()
|
319
|
-
self.thing.__setstate__(state['Thing'])
|
320
|
-
if state.get('Sensor', None) is not None:
|
321
|
-
self.sensor = frost_sta_client.model.sensor.Sensor()
|
322
|
-
self.sensor.__setstate__(state['Sensor'])
|
323
|
-
if state.get('unitOfMeasurements', None) is not None \
|
324
|
-
and isinstance(state['unitOfMeasurements'], list):
|
325
|
-
self.unit_of_measurements = []
|
326
|
-
for value in state['unitOfMeasurements']:
|
327
|
-
self.unit_of_measurements.append(value)
|
328
|
-
if state.get('multiObservationDataTypes', None) is not None \
|
329
|
-
and isinstance(state['multiObservationDataTypes'], list):
|
330
|
-
self.multi_observation_data_types = []
|
331
|
-
for value in state['multiObservationDataTypes']:
|
332
|
-
self.multi_observation_data_types.append(value)
|
333
|
-
if state.get('ObservedProperties', None) is not None and isinstance(state['ObservedProperties'], list):
|
334
|
-
entity_class = entity_type.EntityTypes['ObservedProperty']['class']
|
335
|
-
self.observed_properties = utils.transform_json_to_entity_list(state['ObservedProperties'], entity_class)
|
336
|
-
self.observed_properties.next_link = state.get('ObservedProperties@iot.nextLink')
|
337
|
-
self.observed_properties.count = state.get('ObservedProperties@iot.count')
|
338
|
-
if state.get('Observations', None) is not None and isinstance(state['Observations'], list):
|
339
|
-
entity_class = entity_type.EntityTypes['Observation']['class']
|
340
|
-
self.observations = utils.transform_json_to_entity_list(state['Observations'], entity_class)
|
341
|
-
self.
|
342
|
-
self.
|
343
|
-
|
344
|
-
def get_dao(self, service):
|
345
|
-
return MultiDatastreamDao(service)
|
1
|
+
# Copyright (C) 2021 Fraunhofer Institut IOSB, Fraunhoferstr. 1, D 76131
|
2
|
+
# Karlsruhe, Germany.
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
import frost_sta_client.model
|
18
|
+
from frost_sta_client.dao.multi_datastream import MultiDatastreamDao
|
19
|
+
|
20
|
+
from . import entity
|
21
|
+
from . import thing
|
22
|
+
from . import sensor
|
23
|
+
from . import observation
|
24
|
+
from . import observedproperty
|
25
|
+
from .ext import unitofmeasurement
|
26
|
+
|
27
|
+
from frost_sta_client import utils
|
28
|
+
from .ext import entity_list
|
29
|
+
from .ext import entity_type
|
30
|
+
|
31
|
+
import geojson.geometry
|
32
|
+
|
33
|
+
|
34
|
+
class MultiDatastream(entity.Entity):
|
35
|
+
def __init__(self,
|
36
|
+
name='',
|
37
|
+
description='',
|
38
|
+
properties=None,
|
39
|
+
unit_of_measurements=None,
|
40
|
+
observation_type='',
|
41
|
+
multi_observation_data_types=None,
|
42
|
+
observed_area=None,
|
43
|
+
phenomenon_time=None,
|
44
|
+
result_time=None,
|
45
|
+
thing=None,
|
46
|
+
sensor=None,
|
47
|
+
observed_properties=None,
|
48
|
+
observations=None,
|
49
|
+
**kwargs):
|
50
|
+
super().__init__(**kwargs)
|
51
|
+
if properties is None:
|
52
|
+
properties = {}
|
53
|
+
if multi_observation_data_types is None:
|
54
|
+
multi_observation_data_types = []
|
55
|
+
self.name = name
|
56
|
+
self.description = description
|
57
|
+
self.properties = properties
|
58
|
+
self.unit_of_measurements = unit_of_measurements
|
59
|
+
self.observation_type = observation_type
|
60
|
+
self.multi_observation_data_types = multi_observation_data_types
|
61
|
+
self.observed_area = observed_area
|
62
|
+
self.phenomenon_time = phenomenon_time
|
63
|
+
self.result_time = result_time
|
64
|
+
self.thing = thing
|
65
|
+
self.sensor = sensor
|
66
|
+
self.observed_properties = observed_properties
|
67
|
+
self.observations = observations
|
68
|
+
|
69
|
+
def __new__(cls, *args, **kwargs):
|
70
|
+
new_mds = super().__new__(cls)
|
71
|
+
attributes = dict(_id=None, _name='', _description='', _properties={}, _observation_type='', _multi_observation_data_types=[],
|
72
|
+
_unit_of_measurements=[], _observed_area=None, _phenomenon_time=None, _result_time=None,
|
73
|
+
_thing=None, _sensor=None, _observed_properties=None, _observations=None, _self_link='',
|
74
|
+
_service=None)
|
75
|
+
for key, value in attributes.items():
|
76
|
+
new_mds.__dict__[key] = value
|
77
|
+
return new_mds
|
78
|
+
|
79
|
+
@property
|
80
|
+
def name(self):
|
81
|
+
return self._name
|
82
|
+
|
83
|
+
@name.setter
|
84
|
+
def name(self, value):
|
85
|
+
if value is None:
|
86
|
+
self._name = None
|
87
|
+
return
|
88
|
+
if not isinstance(value, str):
|
89
|
+
raise ValueError('name should be of type str!')
|
90
|
+
self._name = value
|
91
|
+
|
92
|
+
@property
|
93
|
+
def description(self):
|
94
|
+
return self._description
|
95
|
+
|
96
|
+
@description.setter
|
97
|
+
def description(self, value):
|
98
|
+
if value is None:
|
99
|
+
self._description = None
|
100
|
+
return
|
101
|
+
if not isinstance(value, str):
|
102
|
+
raise ValueError('description should be of type str!')
|
103
|
+
self._description = value
|
104
|
+
|
105
|
+
@property
|
106
|
+
def properties(self):
|
107
|
+
return self._properties
|
108
|
+
|
109
|
+
@properties.setter
|
110
|
+
def properties(self, values):
|
111
|
+
if values is None:
|
112
|
+
self._properties = {}
|
113
|
+
return
|
114
|
+
if not isinstance(values, dict):
|
115
|
+
raise ValueError('properties should be of type dict!')
|
116
|
+
self._properties = values
|
117
|
+
|
118
|
+
@property
|
119
|
+
def unit_of_measurements(self):
|
120
|
+
return self._unit_of_measurements
|
121
|
+
|
122
|
+
@unit_of_measurements.setter
|
123
|
+
def unit_of_measurements(self, values):
|
124
|
+
if values is not None and (not isinstance(values, list) or \
|
125
|
+
any((not isinstance(uom, unitofmeasurement.UnitOfMeasurement)) for uom in values)):
|
126
|
+
raise ValueError('unit_of_measurements should be a list of type UnitOfMeasurement')
|
127
|
+
self._unit_of_measurements = values
|
128
|
+
|
129
|
+
@property
|
130
|
+
def observation_type(self):
|
131
|
+
return self._observation_type
|
132
|
+
|
133
|
+
@observation_type.setter
|
134
|
+
def observation_type(self, value):
|
135
|
+
if not isinstance(value, str):
|
136
|
+
raise ValueError('observation_type should be of type str!')
|
137
|
+
self._observation_type = value
|
138
|
+
|
139
|
+
@property
|
140
|
+
def multi_observation_data_types(self):
|
141
|
+
return self._multi_observation_data_types
|
142
|
+
|
143
|
+
@multi_observation_data_types.setter
|
144
|
+
def multi_observation_data_types(self, values):
|
145
|
+
if values is not None and (not isinstance(values, list) or any((not isinstance(dtype, str)) for dtype in values)):
|
146
|
+
raise ValueError('multi_observations_data_types should be list of type str!')
|
147
|
+
self._multi_observation_data_types = values
|
148
|
+
|
149
|
+
@property
|
150
|
+
def observed_area(self):
|
151
|
+
return self._observed_area
|
152
|
+
|
153
|
+
@observed_area.setter
|
154
|
+
def observed_area(self, value):
|
155
|
+
if value is None:
|
156
|
+
self._observed_area = None
|
157
|
+
return
|
158
|
+
if not isinstance(value, geojson.geometry.Polygon):
|
159
|
+
raise ValueError('observedArea should be geojson object')
|
160
|
+
self._observed_area = value
|
161
|
+
|
162
|
+
@property
|
163
|
+
def phenomenon_time(self):
|
164
|
+
return self._phenomenon_time
|
165
|
+
|
166
|
+
@phenomenon_time.setter
|
167
|
+
def phenomenon_time(self, value):
|
168
|
+
self._phenomenon_time = utils.check_datetime(value, 'phenomenon_time')
|
169
|
+
|
170
|
+
@property
|
171
|
+
def result_time(self):
|
172
|
+
return self._result_time
|
173
|
+
|
174
|
+
@result_time.setter
|
175
|
+
def result_time(self, value):
|
176
|
+
self._result_time = utils.check_datetime(value, 'result_time')
|
177
|
+
|
178
|
+
@property
|
179
|
+
def thing(self):
|
180
|
+
return self._thing
|
181
|
+
|
182
|
+
@thing.setter
|
183
|
+
def thing(self, value):
|
184
|
+
if value is not None and not isinstance(value, thing.Thing):
|
185
|
+
raise ValueError('thing should be of type Thing!')
|
186
|
+
self._thing = value
|
187
|
+
|
188
|
+
@property
|
189
|
+
def sensor(self):
|
190
|
+
return self._sensor
|
191
|
+
|
192
|
+
@sensor.setter
|
193
|
+
def sensor(self, value):
|
194
|
+
if value is not None and not isinstance(value, sensor.Sensor):
|
195
|
+
raise ValueError('sensor should be of type Sensor!')
|
196
|
+
self._sensor = value
|
197
|
+
|
198
|
+
@property
|
199
|
+
def observed_properties(self):
|
200
|
+
return self._observed_properties
|
201
|
+
|
202
|
+
@observed_properties.setter
|
203
|
+
def observed_properties(self, values):
|
204
|
+
if values is None:
|
205
|
+
self._observed_properties = None
|
206
|
+
return
|
207
|
+
if isinstance(values, list) and all(isinstance(op, observedproperty.ObservedProperty) for op in values):
|
208
|
+
entity_class = entity_type.EntityTypes['ObservedProperty']['class']
|
209
|
+
self._observed_properties = entity_list.EntityList(entity_class=entity_class, entities=values)
|
210
|
+
return
|
211
|
+
if not isinstance(values, entity_list.EntityList) or \
|
212
|
+
any(not isinstance(op, observedproperty.ObservedProperty) for op in values.entities):
|
213
|
+
raise ValueError('observed_properties should be an entity list of ObservedProperty!')
|
214
|
+
self._observed_properties = values
|
215
|
+
|
216
|
+
@property
|
217
|
+
def observations(self):
|
218
|
+
return self._observations
|
219
|
+
|
220
|
+
@observations.setter
|
221
|
+
def observations(self, values):
|
222
|
+
if values is None:
|
223
|
+
self._observations = None
|
224
|
+
return
|
225
|
+
if isinstance(values, list) and all(isinstance(ob, observation.Observation) for ob in values):
|
226
|
+
entity_class = entity_type.EntityTypes['Observation']['class']
|
227
|
+
self._observations = entity_list.EntityList(entity_class=entity_class, entities=values)
|
228
|
+
return
|
229
|
+
if not isinstance(values, entity_list.EntityList) or \
|
230
|
+
any(not isinstance(ob, observation.Observation) for ob in values.entities):
|
231
|
+
raise ValueError('Observations should be an entity list of Observations')
|
232
|
+
self._observations = values
|
233
|
+
|
234
|
+
def get_observations(self):
|
235
|
+
result = self.service.observations()
|
236
|
+
result.parent = self
|
237
|
+
return result
|
238
|
+
|
239
|
+
def get_observed_properties(self):
|
240
|
+
result = self.service.observed_properties()
|
241
|
+
result.parent = self
|
242
|
+
return result
|
243
|
+
|
244
|
+
def ensure_service_on_children(self, service):
|
245
|
+
if self.thing is not None:
|
246
|
+
self.thing.set_service(service)
|
247
|
+
if self.sensor is not None:
|
248
|
+
self.sensor.set_service(service)
|
249
|
+
if self.observations is not None:
|
250
|
+
self.observations.set_service(service)
|
251
|
+
if self.observed_properties is not None:
|
252
|
+
self.observed_properties.set_service(service)
|
253
|
+
|
254
|
+
def __eq__(self, other):
|
255
|
+
if not super().__eq__(other):
|
256
|
+
return False
|
257
|
+
if self.name != other.name:
|
258
|
+
return False
|
259
|
+
if self.description != other.description:
|
260
|
+
return False
|
261
|
+
if self.observation_type != other.observation_type:
|
262
|
+
return False
|
263
|
+
if self.observed_area != other.observed_area:
|
264
|
+
return False
|
265
|
+
if self.properties != other.properties:
|
266
|
+
return False
|
267
|
+
if self.result_time != other.result_time:
|
268
|
+
return False
|
269
|
+
if self.unit_of_measurements != other.unit_of_measurements:
|
270
|
+
return False
|
271
|
+
if self.multi_observation_data_types != other.multi_observation_data_types:
|
272
|
+
return False
|
273
|
+
return True
|
274
|
+
|
275
|
+
def __ne__(self, other):
|
276
|
+
return not self == other
|
277
|
+
|
278
|
+
def __getstate__(self):
|
279
|
+
data = super().__getstate__()
|
280
|
+
if self.name is not None and self.name != '':
|
281
|
+
data['name'] = self.name
|
282
|
+
if self.description is not None and self.description != '':
|
283
|
+
data['description'] = self.description
|
284
|
+
if self.observation_type is not None and self.observation_type != '':
|
285
|
+
data['observationType'] = self.observation_type
|
286
|
+
if self.observed_area is not None:
|
287
|
+
data['observedArea'] = self.observed_area
|
288
|
+
if self.phenomenon_time is not None:
|
289
|
+
data['phenomenonTime'] = utils.parse_datetime(self.phenomenon_time)
|
290
|
+
if self.result_time is not None:
|
291
|
+
data['resultTime'] = utils.parse_datetime(self.result_time)
|
292
|
+
if self.thing is not None:
|
293
|
+
data['Thing'] = self.thing.__getstate__()
|
294
|
+
if self.sensor is not None:
|
295
|
+
data['Sensor'] = self.sensor.__getstate__()
|
296
|
+
if self.properties is not None and self.properties != {}:
|
297
|
+
data['properties'] = self.properties
|
298
|
+
if self.unit_of_measurements is not None and len(self.unit_of_measurements) > 0:
|
299
|
+
data['unitOfMeasurements'] = self.unit_of_measurements.__getstate__()
|
300
|
+
if self.multi_observation_data_types is not None and len(self.multi_observation_data_types) > 0:
|
301
|
+
data['multiObservationDataTypes'] = self.multi_observation_data_types
|
302
|
+
if self.observed_properties is not None and len(self.observed_properties.entities) > 0:
|
303
|
+
data['ObservedProperties'] = self.observed_properties.__getstate__()
|
304
|
+
if self.observations is not None and len(self.observations.entities) > 0:
|
305
|
+
data['Observations'] = self.observations.__getstate__()
|
306
|
+
return data
|
307
|
+
|
308
|
+
def __setstate__(self, state):
|
309
|
+
super().__setstate__(state)
|
310
|
+
self.name = state.get('name', None)
|
311
|
+
self.description = state.get('description', None)
|
312
|
+
self.observation_type = state.get('observationType', None)
|
313
|
+
self.observation_area = state.get('observedArea', None)
|
314
|
+
self.phenomenon_time = state.get('phenomenonTime', None)
|
315
|
+
self.result_time = state.get('resultTime', None)
|
316
|
+
self.properties = state.get('properties', None)
|
317
|
+
if state.get('Thing', None) is not None:
|
318
|
+
self.thing = frost_sta_client.model.thing.Thing()
|
319
|
+
self.thing.__setstate__(state['Thing'])
|
320
|
+
if state.get('Sensor', None) is not None:
|
321
|
+
self.sensor = frost_sta_client.model.sensor.Sensor()
|
322
|
+
self.sensor.__setstate__(state['Sensor'])
|
323
|
+
if state.get('unitOfMeasurements', None) is not None \
|
324
|
+
and isinstance(state['unitOfMeasurements'], list):
|
325
|
+
self.unit_of_measurements = []
|
326
|
+
for value in state['unitOfMeasurements']:
|
327
|
+
self.unit_of_measurements.append(value)
|
328
|
+
if state.get('multiObservationDataTypes', None) is not None \
|
329
|
+
and isinstance(state['multiObservationDataTypes'], list):
|
330
|
+
self.multi_observation_data_types = []
|
331
|
+
for value in state['multiObservationDataTypes']:
|
332
|
+
self.multi_observation_data_types.append(value)
|
333
|
+
if state.get('ObservedProperties', None) is not None and isinstance(state['ObservedProperties'], list):
|
334
|
+
entity_class = entity_type.EntityTypes['ObservedProperty']['class']
|
335
|
+
self.observed_properties = utils.transform_json_to_entity_list(state['ObservedProperties'], entity_class)
|
336
|
+
self.observed_properties.next_link = state.get('ObservedProperties@iot.nextLink')
|
337
|
+
self.observed_properties.count = state.get('ObservedProperties@iot.count')
|
338
|
+
if state.get('Observations', None) is not None and isinstance(state['Observations'], list):
|
339
|
+
entity_class = entity_type.EntityTypes['Observation']['class']
|
340
|
+
self.observations = utils.transform_json_to_entity_list(state['Observations'], entity_class)
|
341
|
+
self.observations.next_link = state.get('Observations@iot.nextLink')
|
342
|
+
self.observations.count = state.get('Observations@iot.count')
|
343
|
+
|
344
|
+
def get_dao(self, service):
|
345
|
+
return MultiDatastreamDao(service)
|