frost-sta-client 1.1.48__py2.py3-none-any.whl → 1.1.50__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/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 +3 -3
- frost_sta_client/model/observedproperty.py +1 -1
- frost_sta_client/model/task.py +3 -3
- frost_sta_client/model/tasking_capability.py +2 -2
- frost_sta_client/utils.py +122 -119
- {frost_sta_client-1.1.48.dist-info → frost_sta_client-1.1.50.dist-info}/METADATA +1 -1
- {frost_sta_client-1.1.48.dist-info → frost_sta_client-1.1.50.dist-info}/RECORD +16 -16
- {frost_sta_client-1.1.48.dist-info → frost_sta_client-1.1.50.dist-info}/WHEEL +1 -1
- {frost_sta_client-1.1.48.dist-info → frost_sta_client-1.1.50.dist-info}/licenses/LICENSE +0 -0
- {frost_sta_client-1.1.48.dist-info → frost_sta_client-1.1.50.dist-info}/top_level.txt +0 -0
frost_sta_client/__version__.py
CHANGED
@@ -165,7 +165,7 @@ class Actuator(entity.Entity):
|
|
165
165
|
if self.properties is not None and self.properties != {}:
|
166
166
|
data['properties'] = self.properties
|
167
167
|
if self.tasking_capabilities is not None and len(self.tasking_capabilities.entities) > 0:
|
168
|
-
data['
|
168
|
+
data['TaskingCapabilities'] = self.tasking_capabilities.__getstate__()
|
169
169
|
return data
|
170
170
|
|
171
171
|
def __setstate__(self, state):
|
@@ -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._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.__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)
|
@@ -179,7 +179,7 @@ class FeatureOfInterest(entity.Entity):
|
|
179
179
|
if self.feature is not None:
|
180
180
|
data['feature'] = self.feature
|
181
181
|
if self.observations is not None and len(self.observations.entities) > 0:
|
182
|
-
data['Observations'] = self.observations.
|
182
|
+
data['Observations'] = self.observations.__getstate__()
|
183
183
|
return data
|
184
184
|
|
185
185
|
def __setstate__(self, state):
|
@@ -105,7 +105,7 @@ class HistoricalLocation(entity.Entity):
|
|
105
105
|
if self.time is not None:
|
106
106
|
data['time'] = utils.parse_datetime(self.time)
|
107
107
|
if self.thing is not None:
|
108
|
-
data['Thing'] = self.thing
|
108
|
+
data['Thing'] = self.thing.__getstate__()
|
109
109
|
if self.locations is not None and len(self.locations.entities) > 0:
|
110
110
|
data['Locations'] = self.locations.__getstate__()
|
111
111
|
return data
|
@@ -218,9 +218,9 @@ class Location(entity.Entity):
|
|
218
218
|
if self.location is not None:
|
219
219
|
data['location'] = self.location
|
220
220
|
if self.things is not None:
|
221
|
-
data['Things'] = self.things
|
221
|
+
data['Things'] = self.things.__getstate__()
|
222
222
|
if self.historical_locations is not None and len(self.historical_locations.entities) > 0:
|
223
|
-
data['
|
223
|
+
data['HistoricalLocations'] = self.historical_locations.__getstate__()
|
224
224
|
return data
|
225
225
|
|
226
226
|
def __setstate__(self, state):
|
@@ -290,13 +290,13 @@ class MultiDatastream(entity.Entity):
|
|
290
290
|
if self.result_time is not None:
|
291
291
|
data['resultTime'] = utils.parse_datetime(self.result_time)
|
292
292
|
if self.thing is not None:
|
293
|
-
data['Thing'] = self.thing
|
293
|
+
data['Thing'] = self.thing.__getstate__()
|
294
294
|
if self.sensor is not None:
|
295
|
-
data['Sensor'] = self.sensor
|
295
|
+
data['Sensor'] = self.sensor.__getstate__()
|
296
296
|
if self.properties is not None and self.properties != {}:
|
297
297
|
data['properties'] = self.properties
|
298
298
|
if self.unit_of_measurements is not None and len(self.unit_of_measurements) > 0:
|
299
|
-
data['unitOfMeasurements'] = self.unit_of_measurements
|
299
|
+
data['unitOfMeasurements'] = self.unit_of_measurements.__getstate__()
|
300
300
|
if self.multi_observation_data_types is not None and len(self.multi_observation_data_types) > 0:
|
301
301
|
data['multiObservationDataTypes'] = self.multi_observation_data_types
|
302
302
|
if self.observed_properties is not None and len(self.observed_properties.entities) > 0:
|
@@ -184,7 +184,7 @@ class ObservedProperty(entity.Entity):
|
|
184
184
|
if self.properties is not None and self.properties != {}:
|
185
185
|
data['properties'] = self.properties
|
186
186
|
if self.datastreams is not None and len(self.datastreams.entities) > 0:
|
187
|
-
data['
|
187
|
+
data['Datastreams'] = self.datastreams.__getstate__()
|
188
188
|
if self.multi_datastreams is not None and len(self.multi_datastreams.entities) > 0:
|
189
189
|
data['MultiDatastreams'] = self.multi_datastreams.__getstate__()
|
190
190
|
return data
|
frost_sta_client/model/task.py
CHANGED
@@ -98,16 +98,16 @@ class Task(entity.Entity):
|
|
98
98
|
if self.creation_time is not None:
|
99
99
|
data['creationTime'] = utils.parse_datetime(self.creation_time)
|
100
100
|
if self.tasking_capability is not None:
|
101
|
-
data['TaskingCapability'] = self.tasking_capability
|
101
|
+
data['TaskingCapability'] = self.tasking_capability.__getstate__()
|
102
102
|
return data
|
103
103
|
|
104
104
|
def __setstate__(self, state):
|
105
105
|
super().__setstate__(state)
|
106
106
|
self.tasking_parameters = state.get('taskingParameters', {})
|
107
107
|
self.creation_time = state.get('creationTime', None)
|
108
|
-
if state.get('
|
108
|
+
if state.get('TaskingCapability', None) is not None:
|
109
109
|
self.tasking_capability = frost_sta_client.model.tasking_capability.TaskingCapability()
|
110
|
-
self.tasking_capability.__setstate__(state['
|
110
|
+
self.tasking_capability.__setstate__(state['TaskingCapability'])
|
111
111
|
|
112
112
|
def get_dao(self, service):
|
113
113
|
return TaskDao(service)
|
@@ -186,11 +186,11 @@ class TaskingCapability(entity.Entity):
|
|
186
186
|
if self.properties is not None and self.properties != {}:
|
187
187
|
data['properties'] = self.properties
|
188
188
|
if self.thing is not None:
|
189
|
-
data['Thing'] = self.thing
|
189
|
+
data['Thing'] = self.thing.__getstate__()
|
190
190
|
if self.tasks is not None and len(self.tasks.entities) > 0:
|
191
191
|
data['Tasks'] = self.tasks.__getstate__()
|
192
192
|
if self.actuator is not None:
|
193
|
-
data['Actuator'] = self.actuator
|
193
|
+
data['Actuator'] = self.actuator.__getstate__()
|
194
194
|
return data
|
195
195
|
|
196
196
|
def __setstate__(self, state):
|
frost_sta_client/utils.py
CHANGED
@@ -1,119 +1,122 @@
|
|
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 jsonpickle
|
18
|
-
import datetime
|
19
|
-
from dateutil.parser import isoparse
|
20
|
-
import geojson
|
21
|
-
import logging
|
22
|
-
import sys
|
23
|
-
import frost_sta_client.model.ext.entity_list
|
24
|
-
|
25
|
-
|
26
|
-
def extract_value(location):
|
27
|
-
try:
|
28
|
-
value = int(location[location.find('(')+1: location.find(')')])
|
29
|
-
except ValueError:
|
30
|
-
value = str(location[location.find('(')+2: location.find(')')-1])
|
31
|
-
return value
|
32
|
-
|
33
|
-
def transform_entity_to_json_dict(entity):
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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 jsonpickle
|
18
|
+
import datetime
|
19
|
+
from dateutil.parser import isoparse
|
20
|
+
import geojson
|
21
|
+
import logging
|
22
|
+
import sys
|
23
|
+
import frost_sta_client.model.ext.entity_list
|
24
|
+
|
25
|
+
|
26
|
+
def extract_value(location):
|
27
|
+
try:
|
28
|
+
value = int(location[location.find('(')+1: location.find(')')])
|
29
|
+
except ValueError:
|
30
|
+
value = str(location[location.find('(')+2: location.find(')')-1])
|
31
|
+
return value
|
32
|
+
|
33
|
+
def transform_entity_to_json_dict(entity):
|
34
|
+
try:
|
35
|
+
data = entity.__getstate__()
|
36
|
+
except AttributeError:
|
37
|
+
data = entity.__dict__
|
38
|
+
return data
|
39
|
+
|
40
|
+
def class_from_string(string):
|
41
|
+
module_name, class_name = string.rsplit(".", 1)
|
42
|
+
return getattr(sys.modules[module_name], class_name)
|
43
|
+
|
44
|
+
def transform_json_to_entity(json_response, entity_class):
|
45
|
+
cl = class_from_string(entity_class)
|
46
|
+
obj = cl()
|
47
|
+
obj.__setstate__(json_response)
|
48
|
+
return obj
|
49
|
+
|
50
|
+
def transform_json_to_entity_list(json_response, entity_class):
|
51
|
+
entity_list = frost_sta_client.model.ext.entity_list.EntityList(entity_class)
|
52
|
+
result_list = []
|
53
|
+
if isinstance(json_response, dict):
|
54
|
+
try:
|
55
|
+
response_list = json_response['value']
|
56
|
+
entity_list.next_link = json_response.get("@iot.nextLink", None)
|
57
|
+
entity_list.count = json_response.get("@iot.count", None)
|
58
|
+
except AttributeError as e:
|
59
|
+
raise e
|
60
|
+
elif isinstance(json_response, list):
|
61
|
+
response_list = json_response
|
62
|
+
else:
|
63
|
+
raise ValueError("expected json as a dict or list to transform into entity list")
|
64
|
+
entity_list.entities = [transform_json_to_entity(item, entity_list.entity_class) for item in response_list]
|
65
|
+
return entity_list
|
66
|
+
|
67
|
+
|
68
|
+
def check_datetime(value, time_entity):
|
69
|
+
try:
|
70
|
+
parse_datetime(value)
|
71
|
+
except ValueError as e:
|
72
|
+
logging.error(f"error during {time_entity} check")
|
73
|
+
raise e
|
74
|
+
return value
|
75
|
+
|
76
|
+
|
77
|
+
def parse_datetime(value) -> str:
|
78
|
+
if value is None:
|
79
|
+
return value
|
80
|
+
if isinstance(value, str):
|
81
|
+
if '/' in value:
|
82
|
+
try:
|
83
|
+
times = value.split('/')
|
84
|
+
if len(times) != 2:
|
85
|
+
raise ValueError("If the time interval is provided as a string,"
|
86
|
+
" it should be in isoformat")
|
87
|
+
result = [isoparse(times[0]),
|
88
|
+
isoparse(times[1])]
|
89
|
+
except ValueError:
|
90
|
+
raise ValueError("If the time entity interval is provided as a string,"
|
91
|
+
" it should be in isoformat")
|
92
|
+
result = result[0].isoformat() + '/' + result[1].isoformat()
|
93
|
+
return result
|
94
|
+
else:
|
95
|
+
try:
|
96
|
+
result = isoparse(value)
|
97
|
+
except ValueError:
|
98
|
+
raise ValueError("If the phenomenon time is provided as string, it should be in isoformat")
|
99
|
+
result = result.isoformat()
|
100
|
+
return result
|
101
|
+
if isinstance(value, datetime.datetime):
|
102
|
+
return value.isoformat()
|
103
|
+
if isinstance(value, list) and all(isinstance(v, datetime.datetime) for v in value):
|
104
|
+
return value[0].isoformat() + value[1].isoformat()
|
105
|
+
else:
|
106
|
+
raise ValueError('time entities should consist of one or two datetimes')
|
107
|
+
|
108
|
+
|
109
|
+
def process_area(value):
|
110
|
+
if not isinstance(value, dict):
|
111
|
+
raise ValueError("geojsons can only be handled as dictionaries!")
|
112
|
+
if value.get("type", None) is None or value.get("coordinates", None) is None:
|
113
|
+
raise ValueError("Both type and coordinates need to be specified in the dictionary")
|
114
|
+
if value["type"] == "Point":
|
115
|
+
return geojson.geometry.Point(value["coordinates"])
|
116
|
+
if value["type"] == "Polygon":
|
117
|
+
return geojson.geometry.Polygon(value["coordinates"])
|
118
|
+
if value["type"] == "Geometry":
|
119
|
+
return geojson.geometry.Geometry(value["coordinates"])
|
120
|
+
if value["type"] == "LineString":
|
121
|
+
return geojson.geometry.LineString(value["coordinates"])
|
122
|
+
raise ValueError("can only handle geojson of type Point, Polygon, Geometry or LineString")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
frost_sta_client/__init__.py,sha256=N0Rs6kwdPcpyz0p-Tfq2PYIAIIZsMmnSC0QXus_AmP0,1789
|
2
|
-
frost_sta_client/__version__.py,sha256=
|
3
|
-
frost_sta_client/utils.py,sha256=
|
2
|
+
frost_sta_client/__version__.py,sha256=YlJvHmENV_oKBVhv9GKooi1RsV_49ZSoiI5TUbXJCi8,355
|
3
|
+
frost_sta_client/utils.py,sha256=YA8B3SkG0RFFumSPPH65rJ2BHrADzKtcCKXVKAUVG54,4747
|
4
4
|
frost_sta_client/dao/__init__.py,sha256=RKxbQ3WLVygWyz_Kb-SzO7CfUdffq7LqtJHcHSOHmgo,221
|
5
5
|
frost_sta_client/dao/actuator.py,sha256=WxRjeetR50Pb9AbhCdtc1VRSl09pgzfA2DsPBBZy-3E,1099
|
6
6
|
frost_sta_client/dao/base.py,sha256=uAx1qSnXX2jwoZrjXjPW47bp-c-jMUyX8SpmY0eXM84,9209
|
@@ -16,18 +16,18 @@ frost_sta_client/dao/task.py,sha256=wRPoe8F3a8O8aAhgNtxvJm3LxD-oHUA6LilmXOZNJoM,
|
|
16
16
|
frost_sta_client/dao/tasking_capability.py,sha256=cn5iG2aL2Zh74E8WRKpEfTRjupkY-4xK8xaIIIJ9waU,1138
|
17
17
|
frost_sta_client/dao/thing.py,sha256=qPNrQjAmxrJ6dmJKVRr1eP6V9-zKVcIYr3t1DVNHtHo,1102
|
18
18
|
frost_sta_client/model/__init__.py,sha256=LDj9AdnZ5Tjm0iZ2vTe_HyXxJ6x72GLsfKFNf5kww1U,627
|
19
|
-
frost_sta_client/model/actuator.py,sha256=
|
20
|
-
frost_sta_client/model/datastream.py,sha256=
|
19
|
+
frost_sta_client/model/actuator.py,sha256=D6MWkoXDVOHd54DDggcpSki1s8aqdHZHOPnhu-rCnYg,7060
|
20
|
+
frost_sta_client/model/datastream.py,sha256=tIp7egNtaLYzaNVeipVYbpA8KdULxY7704m_e-CDZto,12625
|
21
21
|
frost_sta_client/model/entity.py,sha256=xf3EgxqUAg3Wk4nvZRNKkeFjYDMSS_47YPNVDVuFGO0,3671
|
22
|
-
frost_sta_client/model/feature_of_interest.py,sha256=
|
23
|
-
frost_sta_client/model/historical_location.py,sha256=
|
24
|
-
frost_sta_client/model/location.py,sha256=
|
25
|
-
frost_sta_client/model/multi_datastream.py,sha256=
|
22
|
+
frost_sta_client/model/feature_of_interest.py,sha256=NYFIUZA6tVs6hK2oy7fOM4KCjLccHllIscg0M7Ycr2E,7187
|
23
|
+
frost_sta_client/model/historical_location.py,sha256=vZFv3NtKzTsFv1fMPwMSOeHc1QogiYcCu9lfNLvui68,4630
|
24
|
+
frost_sta_client/model/location.py,sha256=DX27Za-4ookaQlaQ6tsyDPkRW6RkFc6-oD7zvatJgGk,9278
|
25
|
+
frost_sta_client/model/multi_datastream.py,sha256=6rj_8NCSbxJ8afxg8O2eBzqDpe4xcNTKZaTb8AA3zY8,14421
|
26
26
|
frost_sta_client/model/observation.py,sha256=YPNqH_CMfvaimkdAMtWW76-l5UIai32aej22pP3DnZ8,9221
|
27
|
-
frost_sta_client/model/observedproperty.py,sha256=
|
27
|
+
frost_sta_client/model/observedproperty.py,sha256=NeyVBDm7xyZf8nWQvAshoytaKqwNv1Jw20FOMCTyU-Q,8347
|
28
28
|
frost_sta_client/model/sensor.py,sha256=ric_gEhn8oQWE7TR4Dwo1ASGysZpWJ6gsrQT4n_sgn4,8644
|
29
|
-
frost_sta_client/model/task.py,sha256
|
30
|
-
frost_sta_client/model/tasking_capability.py,sha256=
|
29
|
+
frost_sta_client/model/task.py,sha256=xsNXokC2Z9GLdn9W_c9erC_yj3Duz_p5EY20HLhxX_o,4366
|
30
|
+
frost_sta_client/model/tasking_capability.py,sha256=3aznDKyvzO4VMbuz4dLYY1oK9Ggk8fy18p9T13y05PU,7785
|
31
31
|
frost_sta_client/model/thing.py,sha256=1F-mkQPML5mf6NkzXswuTJr8nGnDV1u8GYNj8YtNcl0,13257
|
32
32
|
frost_sta_client/model/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
33
|
frost_sta_client/model/ext/data_array_document.py,sha256=Szvv4iHIHqQsost-ASInoTHYH7qc6qjMkgSYXJu-iYE,2201
|
@@ -40,8 +40,8 @@ frost_sta_client/query/query.py,sha256=hXd-ffYf2HDZ5aqVA5lW5XtoijIr4-4mTfevdRDz2
|
|
40
40
|
frost_sta_client/service/__init__.py,sha256=au1GqHe1OB7Iq-i90plqmIrH-7wBE7ogDoQ2uX03Fj0,109
|
41
41
|
frost_sta_client/service/auth_handler.py,sha256=qahYUK7Z0kGvbUcdtpodIA9sngYCfJz2jqKpLVGA8Z4,1117
|
42
42
|
frost_sta_client/service/sensorthingsservice.py,sha256=H2wM4v5oPvJ6eBfvdkbYyLI4V1vaWpbAuq-Q_fGo3-A,4621
|
43
|
-
frost_sta_client-1.1.
|
44
|
-
frost_sta_client-1.1.
|
45
|
-
frost_sta_client-1.1.
|
46
|
-
frost_sta_client-1.1.
|
47
|
-
frost_sta_client-1.1.
|
43
|
+
frost_sta_client-1.1.50.dist-info/licenses/LICENSE,sha256=LPNKwDiu5awG-TPd0dqYJuC7k4PBPY4LCI_O0LSpW1s,7814
|
44
|
+
frost_sta_client-1.1.50.dist-info/METADATA,sha256=_puhN-FXpb5axOVuwtPXbSTy2aprSKXWeOTdx_B3ONw,5905
|
45
|
+
frost_sta_client-1.1.50.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
46
|
+
frost_sta_client-1.1.50.dist-info/top_level.txt,sha256=c35-3D_K1E_y8fcadqI3j6kGQ7HBrkOqCNie5Rv64KI,17
|
47
|
+
frost_sta_client-1.1.50.dist-info/RECORD,,
|
File without changes
|
File without changes
|