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.
@@ -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._location = 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
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)