Skip to content

Commit 89149fc

Browse files
authored
Add MdoHelper class (#17)
* Add MdoHelper class
1 parent c59b268 commit 89149fc

5 files changed

Lines changed: 92 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### v0.7.3 (2017-11-29)
2+
3+
* Add utils.mdo.MdoHelper class to help with raw stream data conversions
4+
15
### v0.7.2 (2017-11-02)
26

37
* Allow users to specify a verify=False option in Api() that disabled SSL certificate verification for iotile.cloud

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,31 @@ if __name__ == '__main__':
371371
work.main()
372372
```
373373

374+
### Misc Utilities
375+
376+
#### MdoHelper (advance)
377+
378+
IOTile Cloud assumes data is transformed in multiple places using a simple Multiple, Divide and Offset (or MDO)
379+
set of values. For example, streams use output_units, which include an MDO that can be used to convert the
380+
internal value stored on the data stream into this output unit. The MdoHelper is a simple class to help with these
381+
converstions.
382+
383+
```
384+
from iotile_cloud.stream.data import StreamData
385+
from iotile_cloud.utils.mdo import MdoHelper
386+
387+
stream = api.stream('s--0000-0001--0000-0000-0000-0001--5001').get()
388+
units = stream['output_unit']
389+
mdo = MdoHelper(m=units.get('m', 1), d=units.get('d', 1), o=units.get('o', 0.0))
390+
391+
# Get unmodified internal data. The 'value' member is based on some internal storage units for the given stream type
392+
stream_data = StreamRawData(stream['slug'], api)
393+
394+
stream_data.initialize_from_server(lastn=100)
395+
for item in stream_data.data:
396+
print('{0}: {1}'.format(item['timestamp'], mdo.compute_value(item['value'])))
397+
```
398+
374399
## Requirements
375400

376401
iotile_cloud requires the following modules.

iotile_cloud/utils/mdo.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class MdoHelper(object):
2+
_m = 1
3+
_d = 1
4+
_o = None
5+
6+
def __init__(self, m, d, o=None):
7+
assert(isinstance(m, int ) and m != 0)
8+
assert(isinstance(d, int ) and d != 0)
9+
assert(o is None or isinstance(o, int ) or isinstance(o, float ))
10+
self._m = float(m)
11+
self._d = float(d)
12+
if o:
13+
self._o = float(o)
14+
15+
def compute(self, value):
16+
ret_value = 0.0
17+
if self._o:
18+
ret_value += self._o
19+
ret_value += (value * self._m / self._d)
20+
return ret_value
21+
22+
def compute_reverse(self, value):
23+
ret_value = float(value)
24+
if self._o:
25+
ret_value -= self._o
26+
ret_value = (ret_value * self._d / self._m)
27+
return ret_value
28+
29+
def __str__(self):
30+
result = ''
31+
if self._o:
32+
result += '{}+'.format(self._o)
33+
result += '{0}x/{1}'.format(self._m, self._d)
34+
return result

tests/test_mdo.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import unittest2 as unittest
2+
3+
from iotile_cloud.utils.mdo import *
4+
5+
6+
class MdoTestCase(unittest.TestCase):
7+
8+
def test_compute_mdo(self):
9+
mdo = MdoHelper(m=1, d=1)
10+
self.assertEqual(mdo.compute(5), 5)
11+
self.assertEqual(mdo.compute(0), 0)
12+
self.assertEqual(mdo.compute(-10), -10)
13+
14+
mdo = MdoHelper(m=3, d=2, o=0.5)
15+
self.assertEqual(mdo.compute(5), 8.0)
16+
self.assertEqual(mdo.compute(0), 0.5)
17+
self.assertEqual(mdo.compute(-10), -14.5)
18+
19+
def test_reverse_compute_mdo(self):
20+
mdo = MdoHelper(m=1, d=1)
21+
self.assertEqual(mdo.compute_reverse(5), 5)
22+
self.assertEqual(mdo.compute_reverse(0), 0)
23+
self.assertEqual(mdo.compute_reverse(-10), -10)
24+
25+
mdo = MdoHelper(m=3, d=2, o=0.5)
26+
self.assertEqual(mdo.compute_reverse(8.0), 5)
27+
self.assertEqual(mdo.compute_reverse(0.5), 0)
28+
self.assertEqual(mdo.compute_reverse(-14.5), -10)

version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version = '0.7.2'
1+
version = '0.7.3'

0 commit comments

Comments
 (0)