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,338 +1,338 @@
|
|
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
|
-
import inspect
|
17
|
-
import json
|
18
|
-
|
19
|
-
import frost_sta_client.model.ext.unitofmeasurement
|
20
|
-
from frost_sta_client.dao.datastream import DatastreamDao
|
21
|
-
|
22
|
-
from . import thing
|
23
|
-
from . import sensor
|
24
|
-
from . import observedproperty
|
25
|
-
from . import observation
|
26
|
-
from . import entity
|
27
|
-
from .ext import unitofmeasurement
|
28
|
-
from .ext import entity_list
|
29
|
-
from .ext import entity_type
|
30
|
-
|
31
|
-
from frost_sta_client import utils
|
32
|
-
|
33
|
-
import geojson.geometry
|
34
|
-
|
35
|
-
|
36
|
-
class Datastream(entity.Entity):
|
37
|
-
|
38
|
-
def __init__(self,
|
39
|
-
name='',
|
40
|
-
description='',
|
41
|
-
observation_type='',
|
42
|
-
unit_of_measurement=None,
|
43
|
-
observed_area=None,
|
44
|
-
properties=None,
|
45
|
-
phenomenon_time=None,
|
46
|
-
result_time=None,
|
47
|
-
thing=None,
|
48
|
-
sensor=None,
|
49
|
-
observed_property=None,
|
50
|
-
observations=None,
|
51
|
-
**kwargs):
|
52
|
-
"""
|
53
|
-
This class handles Datastreams assigned to a Thing. Before you create a Datastreams, you firstly have to
|
54
|
-
create a Thing, a Sensor and an observedProperty to which you have to refer by specifying its ids.
|
55
|
-
|
56
|
-
Parameters
|
57
|
-
----------
|
58
|
-
name: str
|
59
|
-
description: str
|
60
|
-
observation_type: str
|
61
|
-
unit_of_measurement: dict
|
62
|
-
Should be a dict of keys 'name', 'symbol', 'definition' with values of str.
|
63
|
-
|
64
|
-
"""
|
65
|
-
super().__init__(**kwargs)
|
66
|
-
if properties is None:
|
67
|
-
properties = {}
|
68
|
-
self.name = name
|
69
|
-
self.description = description
|
70
|
-
self.observation_type = observation_type
|
71
|
-
self.unit_of_measurement = unit_of_measurement
|
72
|
-
self.observed_area = observed_area
|
73
|
-
self.properties = properties
|
74
|
-
self.phenomenon_time = phenomenon_time
|
75
|
-
self.result_time = result_time
|
76
|
-
self.thing = thing
|
77
|
-
self.sensor = sensor
|
78
|
-
self.observations = observations
|
79
|
-
self.observed_property = observed_property
|
80
|
-
|
81
|
-
|
82
|
-
def __new__(cls, *args, **kwargs):
|
83
|
-
new_datastream = super().__new__(cls)
|
84
|
-
attributes = dict(_id=None, _name='', _description='', _properties={}, _observation_type='',
|
85
|
-
_unit_of_measurement=None, _observed_area=None, _phenomenon_time=None, _result_time=None,
|
86
|
-
_thing=None, _sensor=None, _observed_property=None, _observations=None, _self_link='',
|
87
|
-
_service=None)
|
88
|
-
for key, value in attributes.items():
|
89
|
-
new_datastream.__dict__[key] = value
|
90
|
-
return new_datastream
|
91
|
-
|
92
|
-
@property
|
93
|
-
def name(self):
|
94
|
-
return self._name
|
95
|
-
|
96
|
-
@name.setter
|
97
|
-
def name(self, value):
|
98
|
-
if value is None:
|
99
|
-
self._name = None
|
100
|
-
return
|
101
|
-
if not isinstance(value, str):
|
102
|
-
raise ValueError('name should be of type str!')
|
103
|
-
self._name = value
|
104
|
-
|
105
|
-
@property
|
106
|
-
def description(self):
|
107
|
-
return self._description
|
108
|
-
|
109
|
-
@description.setter
|
110
|
-
def description(self, value):
|
111
|
-
if value is None:
|
112
|
-
self._description = None
|
113
|
-
return
|
114
|
-
if not isinstance(value, str):
|
115
|
-
raise ValueError('description should be of type str!')
|
116
|
-
self._description = value
|
117
|
-
|
118
|
-
@property
|
119
|
-
def observation_type(self):
|
120
|
-
return self._observation_type
|
121
|
-
|
122
|
-
@observation_type.setter
|
123
|
-
def observation_type(self, value):
|
124
|
-
if value is None:
|
125
|
-
self._observation_type = None
|
126
|
-
return
|
127
|
-
if not isinstance(value, str):
|
128
|
-
raise ValueError('observation_type should be of type str!')
|
129
|
-
self._observation_type = value
|
130
|
-
|
131
|
-
@property
|
132
|
-
def unit_of_measurement(self):
|
133
|
-
return self._unit_of_measurement
|
134
|
-
|
135
|
-
@unit_of_measurement.setter
|
136
|
-
def unit_of_measurement(self, value):
|
137
|
-
if value is None or isinstance(value, unitofmeasurement.UnitOfMeasurement):
|
138
|
-
self._unit_of_measurement = value
|
139
|
-
return
|
140
|
-
raise ValueError('unitOfMeasurement should be of type UnitOfMeasurement!')
|
141
|
-
|
142
|
-
@property
|
143
|
-
def observed_area(self):
|
144
|
-
return self._observed_area
|
145
|
-
|
146
|
-
@observed_area.setter
|
147
|
-
def observed_area(self, value):
|
148
|
-
if value is None:
|
149
|
-
self.
|
150
|
-
return
|
151
|
-
geo_classes = [obj for _, obj in inspect.getmembers(geojson) if inspect.isclass(obj) and
|
152
|
-
obj.__module__ == 'geojson.geometry']
|
153
|
-
if type(value) in geo_classes:
|
154
|
-
self._observed_area = value
|
155
|
-
return
|
156
|
-
else:
|
157
|
-
try:
|
158
|
-
json.dumps(value)
|
159
|
-
except TypeError:
|
160
|
-
raise ValueError('observedArea should be of json_serializable!')
|
161
|
-
self._observed_area = value
|
162
|
-
|
163
|
-
@property
|
164
|
-
def properties(self):
|
165
|
-
return self._properties
|
166
|
-
|
167
|
-
@properties.setter
|
168
|
-
def properties(self, value):
|
169
|
-
if value is None:
|
170
|
-
self._properties = None
|
171
|
-
return
|
172
|
-
if not isinstance(value, dict):
|
173
|
-
raise ValueError('properties should be of type dict')
|
174
|
-
self._properties = value
|
175
|
-
|
176
|
-
@property
|
177
|
-
def phenomenon_time(self):
|
178
|
-
return self._phenomenon_time
|
179
|
-
|
180
|
-
@phenomenon_time.setter
|
181
|
-
def phenomenon_time(self, value):
|
182
|
-
self._phenomenon_time = utils.check_datetime(value, 'phenomenon_time')
|
183
|
-
|
184
|
-
@property
|
185
|
-
def result_time(self):
|
186
|
-
return self._result_time
|
187
|
-
|
188
|
-
@result_time.setter
|
189
|
-
def result_time(self, value):
|
190
|
-
self._result_time = utils.check_datetime(value, 'result_time')
|
191
|
-
|
192
|
-
@property
|
193
|
-
def thing(self):
|
194
|
-
return self._thing
|
195
|
-
|
196
|
-
@thing.setter
|
197
|
-
def thing(self, value):
|
198
|
-
if value is None or isinstance(value, thing.Thing):
|
199
|
-
self._thing = value
|
200
|
-
return
|
201
|
-
raise ValueError('thing should be of type Thing!')
|
202
|
-
|
203
|
-
@property
|
204
|
-
def sensor(self):
|
205
|
-
return self._sensor
|
206
|
-
|
207
|
-
@sensor.setter
|
208
|
-
def sensor(self, value):
|
209
|
-
if value is None or isinstance(value, sensor.Sensor):
|
210
|
-
self._sensor = value
|
211
|
-
return
|
212
|
-
raise ValueError('sensor should be of type Sensor!')
|
213
|
-
|
214
|
-
@property
|
215
|
-
def observed_property(self):
|
216
|
-
return self._observed_property
|
217
|
-
|
218
|
-
@observed_property.setter
|
219
|
-
def observed_property(self, value):
|
220
|
-
if isinstance(value, observedproperty.ObservedProperty) or value is None:
|
221
|
-
self._observed_property = value
|
222
|
-
return
|
223
|
-
raise ValueError('observed property should by of type ObservedProperty!')
|
224
|
-
|
225
|
-
@property
|
226
|
-
def observations(self):
|
227
|
-
return self._observations
|
228
|
-
|
229
|
-
@observations.setter
|
230
|
-
def observations(self, values):
|
231
|
-
if values is None:
|
232
|
-
self._observations = None
|
233
|
-
return
|
234
|
-
if isinstance(values, list) and all(isinstance(ob, observation.Observation) for ob in values):
|
235
|
-
entity_class = entity_type.EntityTypes['Observation']['class']
|
236
|
-
self._observations = entity_list.EntityList(entity_class=entity_class, entities=values)
|
237
|
-
return
|
238
|
-
if isinstance(values, entity_list.EntityList) and \
|
239
|
-
all(isinstance(ob, observation.Observation) for ob in values.entities):
|
240
|
-
self._observations = values
|
241
|
-
return
|
242
|
-
raise ValueError('Observations should be a list of Observations')
|
243
|
-
|
244
|
-
def get_observations(self):
|
245
|
-
result = self.service.observations()
|
246
|
-
result.parent = self
|
247
|
-
return result
|
248
|
-
|
249
|
-
def ensure_service_on_children(self, service):
|
250
|
-
if self.thing is not None:
|
251
|
-
self.thing.set_service(service)
|
252
|
-
if self.sensor is not None:
|
253
|
-
self.sensor.set_service(service)
|
254
|
-
if self.observed_property is not None:
|
255
|
-
self.observed_property.set_service(service)
|
256
|
-
if self.observations is not None:
|
257
|
-
self.observations.set_service(service)
|
258
|
-
|
259
|
-
def __eq__(self, other):
|
260
|
-
if not super().__eq__(other):
|
261
|
-
return False
|
262
|
-
if self.name != other.name:
|
263
|
-
return False
|
264
|
-
if self.description != other.description:
|
265
|
-
return False
|
266
|
-
if self.observation_type != other.observation_type:
|
267
|
-
return False
|
268
|
-
if self.unit_of_measurement != other.unit_of_measurement:
|
269
|
-
return False
|
270
|
-
if self.properties != other.properties:
|
271
|
-
return False
|
272
|
-
if self.result_time != other.result_time:
|
273
|
-
return False
|
274
|
-
return True
|
275
|
-
|
276
|
-
def __ne__(self, other):
|
277
|
-
return not self == other
|
278
|
-
|
279
|
-
def __getstate__(self):
|
280
|
-
data = super().__getstate__()
|
281
|
-
if self.name is not None and self.name != '':
|
282
|
-
data['name'] = self.name
|
283
|
-
if self.description is not None and self.description != '':
|
284
|
-
data['description'] = self.description
|
285
|
-
if self.observation_type is not None and self.observation_type != '':
|
286
|
-
data['observationType'] = self.observation_type
|
287
|
-
if self.properties is not None and self.properties != {}:
|
288
|
-
data['properties'] = self.properties
|
289
|
-
if self.unit_of_measurement is not None:
|
290
|
-
data['unitOfMeasurement'] = self.unit_of_measurement
|
291
|
-
if self.observed_area is not None:
|
292
|
-
data['observedArea'] = self.observed_area
|
293
|
-
if self.phenomenon_time is not None:
|
294
|
-
data['phenomenonTime'] = utils.parse_datetime(self.phenomenon_time)
|
295
|
-
if self.result_time is not None:
|
296
|
-
data['resultTime'] = utils.parse_datetime(self.result_time)
|
297
|
-
if self.thing is not None:
|
298
|
-
data['Thing'] = self.thing
|
299
|
-
if self.sensor is not None:
|
300
|
-
data['Sensor'] = self.sensor
|
301
|
-
if self.observed_property is not None:
|
302
|
-
data['ObservedProperty'] = self.observed_property
|
303
|
-
if self.observations is not None and len(self.observations.entities) > 0:
|
304
|
-
data['Observations'] = self.observations.__getstate__()
|
305
|
-
return data
|
306
|
-
|
307
|
-
def __setstate__(self, state):
|
308
|
-
super().__setstate__(state)
|
309
|
-
self.name = state.get("name", None)
|
310
|
-
self.description = state.get("description", None)
|
311
|
-
self.observation_type = state.get("observationType", None)
|
312
|
-
self.properties = state.get("properties", {})
|
313
|
-
if state.get("unitOfMeasurement", None) is not None:
|
314
|
-
self.unit_of_measurement = frost_sta_client.model.ext.unitofmeasurement.UnitOfMeasurement()
|
315
|
-
self.unit_of_measurement.__setstate__(state["unitOfMeasurement"])
|
316
|
-
if state.get("observedArea", None) is not None:
|
317
|
-
self.observed_area = frost_sta_client.utils.process_area(state["observedArea"])
|
318
|
-
if state.get("phenomenonTime", None) is not None:
|
319
|
-
self.phenomenon_time = state["phenomenonTime"]
|
320
|
-
if state.get("resultTime", None) is not None:
|
321
|
-
self.result_time = state["resultTime"]
|
322
|
-
if state.get("Thing", None) is not None:
|
323
|
-
self.thing = frost_sta_client.model.thing.Thing()
|
324
|
-
self.thing.__setstate__(state["Thing"])
|
325
|
-
if state.get("ObservedProperty", None) is not None:
|
326
|
-
self.observed_property = frost_sta_client.model.observedproperty.ObservedProperty()
|
327
|
-
self.observed_property.__setstate__(state["ObservedProperty"])
|
328
|
-
if state.get("Sensor", None) is not None:
|
329
|
-
self.sensor = frost_sta_client.model.sensor.Sensor()
|
330
|
-
self.sensor.__setstate__(state["Sensor"])
|
331
|
-
if state.get("Observations", None) is not None and isinstance(state["Observations"], list):
|
332
|
-
entity_class = entity_type.EntityTypes['Observation']['class']
|
333
|
-
self.observations = utils.transform_json_to_entity_list(state['Observations'], entity_class)
|
334
|
-
self.observations.next_link = state.get("Observations@iot.nextLink", None)
|
335
|
-
self.observations.count = state.get("Observations@iot.count", None)
|
336
|
-
|
337
|
-
def get_dao(self, service):
|
338
|
-
return DatastreamDao(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
|
+
import inspect
|
17
|
+
import json
|
18
|
+
|
19
|
+
import frost_sta_client.model.ext.unitofmeasurement
|
20
|
+
from frost_sta_client.dao.datastream import DatastreamDao
|
21
|
+
|
22
|
+
from . import thing
|
23
|
+
from . import sensor
|
24
|
+
from . import observedproperty
|
25
|
+
from . import observation
|
26
|
+
from . import entity
|
27
|
+
from .ext import unitofmeasurement
|
28
|
+
from .ext import entity_list
|
29
|
+
from .ext import entity_type
|
30
|
+
|
31
|
+
from frost_sta_client import utils
|
32
|
+
|
33
|
+
import geojson.geometry
|
34
|
+
|
35
|
+
|
36
|
+
class Datastream(entity.Entity):
|
37
|
+
|
38
|
+
def __init__(self,
|
39
|
+
name='',
|
40
|
+
description='',
|
41
|
+
observation_type='',
|
42
|
+
unit_of_measurement=None,
|
43
|
+
observed_area=None,
|
44
|
+
properties=None,
|
45
|
+
phenomenon_time=None,
|
46
|
+
result_time=None,
|
47
|
+
thing=None,
|
48
|
+
sensor=None,
|
49
|
+
observed_property=None,
|
50
|
+
observations=None,
|
51
|
+
**kwargs):
|
52
|
+
"""
|
53
|
+
This class handles Datastreams assigned to a Thing. Before you create a Datastreams, you firstly have to
|
54
|
+
create a Thing, a Sensor and an observedProperty to which you have to refer by specifying its ids.
|
55
|
+
|
56
|
+
Parameters
|
57
|
+
----------
|
58
|
+
name: str
|
59
|
+
description: str
|
60
|
+
observation_type: str
|
61
|
+
unit_of_measurement: dict
|
62
|
+
Should be a dict of keys 'name', 'symbol', 'definition' with values of str.
|
63
|
+
|
64
|
+
"""
|
65
|
+
super().__init__(**kwargs)
|
66
|
+
if properties is None:
|
67
|
+
properties = {}
|
68
|
+
self.name = name
|
69
|
+
self.description = description
|
70
|
+
self.observation_type = observation_type
|
71
|
+
self.unit_of_measurement = unit_of_measurement
|
72
|
+
self.observed_area = observed_area
|
73
|
+
self.properties = properties
|
74
|
+
self.phenomenon_time = phenomenon_time
|
75
|
+
self.result_time = result_time
|
76
|
+
self.thing = thing
|
77
|
+
self.sensor = sensor
|
78
|
+
self.observations = observations
|
79
|
+
self.observed_property = observed_property
|
80
|
+
|
81
|
+
|
82
|
+
def __new__(cls, *args, **kwargs):
|
83
|
+
new_datastream = super().__new__(cls)
|
84
|
+
attributes = dict(_id=None, _name='', _description='', _properties={}, _observation_type='',
|
85
|
+
_unit_of_measurement=None, _observed_area=None, _phenomenon_time=None, _result_time=None,
|
86
|
+
_thing=None, _sensor=None, _observed_property=None, _observations=None, _self_link='',
|
87
|
+
_service=None)
|
88
|
+
for key, value in attributes.items():
|
89
|
+
new_datastream.__dict__[key] = value
|
90
|
+
return new_datastream
|
91
|
+
|
92
|
+
@property
|
93
|
+
def name(self):
|
94
|
+
return self._name
|
95
|
+
|
96
|
+
@name.setter
|
97
|
+
def name(self, value):
|
98
|
+
if value is None:
|
99
|
+
self._name = None
|
100
|
+
return
|
101
|
+
if not isinstance(value, str):
|
102
|
+
raise ValueError('name should be of type str!')
|
103
|
+
self._name = value
|
104
|
+
|
105
|
+
@property
|
106
|
+
def description(self):
|
107
|
+
return self._description
|
108
|
+
|
109
|
+
@description.setter
|
110
|
+
def description(self, value):
|
111
|
+
if value is None:
|
112
|
+
self._description = None
|
113
|
+
return
|
114
|
+
if not isinstance(value, str):
|
115
|
+
raise ValueError('description should be of type str!')
|
116
|
+
self._description = value
|
117
|
+
|
118
|
+
@property
|
119
|
+
def observation_type(self):
|
120
|
+
return self._observation_type
|
121
|
+
|
122
|
+
@observation_type.setter
|
123
|
+
def observation_type(self, value):
|
124
|
+
if value is None:
|
125
|
+
self._observation_type = None
|
126
|
+
return
|
127
|
+
if not isinstance(value, str):
|
128
|
+
raise ValueError('observation_type should be of type str!')
|
129
|
+
self._observation_type = value
|
130
|
+
|
131
|
+
@property
|
132
|
+
def unit_of_measurement(self):
|
133
|
+
return self._unit_of_measurement
|
134
|
+
|
135
|
+
@unit_of_measurement.setter
|
136
|
+
def unit_of_measurement(self, value):
|
137
|
+
if value is None or isinstance(value, unitofmeasurement.UnitOfMeasurement):
|
138
|
+
self._unit_of_measurement = value
|
139
|
+
return
|
140
|
+
raise ValueError('unitOfMeasurement should be of type UnitOfMeasurement!')
|
141
|
+
|
142
|
+
@property
|
143
|
+
def observed_area(self):
|
144
|
+
return self._observed_area
|
145
|
+
|
146
|
+
@observed_area.setter
|
147
|
+
def observed_area(self, value):
|
148
|
+
if value is None:
|
149
|
+
self._observed_area = None
|
150
|
+
return
|
151
|
+
geo_classes = [obj for _, obj in inspect.getmembers(geojson) if inspect.isclass(obj) and
|
152
|
+
obj.__module__ == 'geojson.geometry']
|
153
|
+
if type(value) in geo_classes:
|
154
|
+
self._observed_area = value
|
155
|
+
return
|
156
|
+
else:
|
157
|
+
try:
|
158
|
+
json.dumps(value)
|
159
|
+
except TypeError:
|
160
|
+
raise ValueError('observedArea should be of json_serializable!')
|
161
|
+
self._observed_area = value
|
162
|
+
|
163
|
+
@property
|
164
|
+
def properties(self):
|
165
|
+
return self._properties
|
166
|
+
|
167
|
+
@properties.setter
|
168
|
+
def properties(self, value):
|
169
|
+
if value is None:
|
170
|
+
self._properties = None
|
171
|
+
return
|
172
|
+
if not isinstance(value, dict):
|
173
|
+
raise ValueError('properties should be of type dict')
|
174
|
+
self._properties = value
|
175
|
+
|
176
|
+
@property
|
177
|
+
def phenomenon_time(self):
|
178
|
+
return self._phenomenon_time
|
179
|
+
|
180
|
+
@phenomenon_time.setter
|
181
|
+
def phenomenon_time(self, value):
|
182
|
+
self._phenomenon_time = utils.check_datetime(value, 'phenomenon_time')
|
183
|
+
|
184
|
+
@property
|
185
|
+
def result_time(self):
|
186
|
+
return self._result_time
|
187
|
+
|
188
|
+
@result_time.setter
|
189
|
+
def result_time(self, value):
|
190
|
+
self._result_time = utils.check_datetime(value, 'result_time')
|
191
|
+
|
192
|
+
@property
|
193
|
+
def thing(self):
|
194
|
+
return self._thing
|
195
|
+
|
196
|
+
@thing.setter
|
197
|
+
def thing(self, value):
|
198
|
+
if value is None or isinstance(value, thing.Thing):
|
199
|
+
self._thing = value
|
200
|
+
return
|
201
|
+
raise ValueError('thing should be of type Thing!')
|
202
|
+
|
203
|
+
@property
|
204
|
+
def sensor(self):
|
205
|
+
return self._sensor
|
206
|
+
|
207
|
+
@sensor.setter
|
208
|
+
def sensor(self, value):
|
209
|
+
if value is None or isinstance(value, sensor.Sensor):
|
210
|
+
self._sensor = value
|
211
|
+
return
|
212
|
+
raise ValueError('sensor should be of type Sensor!')
|
213
|
+
|
214
|
+
@property
|
215
|
+
def observed_property(self):
|
216
|
+
return self._observed_property
|
217
|
+
|
218
|
+
@observed_property.setter
|
219
|
+
def observed_property(self, value):
|
220
|
+
if isinstance(value, observedproperty.ObservedProperty) or value is None:
|
221
|
+
self._observed_property = value
|
222
|
+
return
|
223
|
+
raise ValueError('observed property should by of type ObservedProperty!')
|
224
|
+
|
225
|
+
@property
|
226
|
+
def observations(self):
|
227
|
+
return self._observations
|
228
|
+
|
229
|
+
@observations.setter
|
230
|
+
def observations(self, values):
|
231
|
+
if values is None:
|
232
|
+
self._observations = None
|
233
|
+
return
|
234
|
+
if isinstance(values, list) and all(isinstance(ob, observation.Observation) for ob in values):
|
235
|
+
entity_class = entity_type.EntityTypes['Observation']['class']
|
236
|
+
self._observations = entity_list.EntityList(entity_class=entity_class, entities=values)
|
237
|
+
return
|
238
|
+
if isinstance(values, entity_list.EntityList) and \
|
239
|
+
all(isinstance(ob, observation.Observation) for ob in values.entities):
|
240
|
+
self._observations = values
|
241
|
+
return
|
242
|
+
raise ValueError('Observations should be a list of Observations')
|
243
|
+
|
244
|
+
def get_observations(self):
|
245
|
+
result = self.service.observations()
|
246
|
+
result.parent = self
|
247
|
+
return result
|
248
|
+
|
249
|
+
def ensure_service_on_children(self, service):
|
250
|
+
if self.thing is not None:
|
251
|
+
self.thing.set_service(service)
|
252
|
+
if self.sensor is not None:
|
253
|
+
self.sensor.set_service(service)
|
254
|
+
if self.observed_property is not None:
|
255
|
+
self.observed_property.set_service(service)
|
256
|
+
if self.observations is not None:
|
257
|
+
self.observations.set_service(service)
|
258
|
+
|
259
|
+
def __eq__(self, other):
|
260
|
+
if not super().__eq__(other):
|
261
|
+
return False
|
262
|
+
if self.name != other.name:
|
263
|
+
return False
|
264
|
+
if self.description != other.description:
|
265
|
+
return False
|
266
|
+
if self.observation_type != other.observation_type:
|
267
|
+
return False
|
268
|
+
if self.unit_of_measurement != other.unit_of_measurement:
|
269
|
+
return False
|
270
|
+
if self.properties != other.properties:
|
271
|
+
return False
|
272
|
+
if self.result_time != other.result_time:
|
273
|
+
return False
|
274
|
+
return True
|
275
|
+
|
276
|
+
def __ne__(self, other):
|
277
|
+
return not self == other
|
278
|
+
|
279
|
+
def __getstate__(self):
|
280
|
+
data = super().__getstate__()
|
281
|
+
if self.name is not None and self.name != '':
|
282
|
+
data['name'] = self.name
|
283
|
+
if self.description is not None and self.description != '':
|
284
|
+
data['description'] = self.description
|
285
|
+
if self.observation_type is not None and self.observation_type != '':
|
286
|
+
data['observationType'] = self.observation_type
|
287
|
+
if self.properties is not None and self.properties != {}:
|
288
|
+
data['properties'] = self.properties
|
289
|
+
if self.unit_of_measurement is not None:
|
290
|
+
data['unitOfMeasurement'] = self.unit_of_measurement.__getstate__()
|
291
|
+
if self.observed_area is not None:
|
292
|
+
data['observedArea'] = self.observed_area
|
293
|
+
if self.phenomenon_time is not None:
|
294
|
+
data['phenomenonTime'] = utils.parse_datetime(self.phenomenon_time)
|
295
|
+
if self.result_time is not None:
|
296
|
+
data['resultTime'] = utils.parse_datetime(self.result_time)
|
297
|
+
if self.thing is not None:
|
298
|
+
data['Thing'] = self.thing.__getstate__()
|
299
|
+
if self.sensor is not None:
|
300
|
+
data['Sensor'] = self.sensor.__getstate__()
|
301
|
+
if self.observed_property is not None:
|
302
|
+
data['ObservedProperty'] = self.observed_property.__getstate__()
|
303
|
+
if self.observations is not None and len(self.observations.entities) > 0:
|
304
|
+
data['Observations'] = self.observations.__getstate__()
|
305
|
+
return data
|
306
|
+
|
307
|
+
def __setstate__(self, state):
|
308
|
+
super().__setstate__(state)
|
309
|
+
self.name = state.get("name", None)
|
310
|
+
self.description = state.get("description", None)
|
311
|
+
self.observation_type = state.get("observationType", None)
|
312
|
+
self.properties = state.get("properties", {})
|
313
|
+
if state.get("unitOfMeasurement", None) is not None:
|
314
|
+
self.unit_of_measurement = frost_sta_client.model.ext.unitofmeasurement.UnitOfMeasurement()
|
315
|
+
self.unit_of_measurement.__setstate__(state["unitOfMeasurement"])
|
316
|
+
if state.get("observedArea", None) is not None:
|
317
|
+
self.observed_area = frost_sta_client.utils.process_area(state["observedArea"])
|
318
|
+
if state.get("phenomenonTime", None) is not None:
|
319
|
+
self.phenomenon_time = state["phenomenonTime"]
|
320
|
+
if state.get("resultTime", None) is not None:
|
321
|
+
self.result_time = state["resultTime"]
|
322
|
+
if state.get("Thing", None) is not None:
|
323
|
+
self.thing = frost_sta_client.model.thing.Thing()
|
324
|
+
self.thing.__setstate__(state["Thing"])
|
325
|
+
if state.get("ObservedProperty", None) is not None:
|
326
|
+
self.observed_property = frost_sta_client.model.observedproperty.ObservedProperty()
|
327
|
+
self.observed_property.__setstate__(state["ObservedProperty"])
|
328
|
+
if state.get("Sensor", None) is not None:
|
329
|
+
self.sensor = frost_sta_client.model.sensor.Sensor()
|
330
|
+
self.sensor.__setstate__(state["Sensor"])
|
331
|
+
if state.get("Observations", None) is not None and isinstance(state["Observations"], list):
|
332
|
+
entity_class = entity_type.EntityTypes['Observation']['class']
|
333
|
+
self.observations = utils.transform_json_to_entity_list(state['Observations'], entity_class)
|
334
|
+
self.observations.next_link = state.get("Observations@iot.nextLink", None)
|
335
|
+
self.observations.count = state.get("Observations@iot.count", None)
|
336
|
+
|
337
|
+
def get_dao(self, service):
|
338
|
+
return DatastreamDao(service)
|