diff --git a/preload/apps/spo2/__init__.py b/preload/apps/spo2/__init__.py
index 152cf15131c6f58d13810a8a316df943e78c5694..6775f040baf1a464d54ba38c792c044676c196d6 100644
--- a/preload/apps/spo2/__init__.py
+++ b/preload/apps/spo2/__init__.py
@@ -38,7 +38,7 @@ class SPO2:
     def update_history(self, datasets):
         for val in datasets:
             # get red value (first in tuple)
-            self.avg[self.avg_pos] = val[0]
+            self.avg[self.avg_pos] = val.red
             if self.avg_pos < 9:
                 self.avg_pos += 1
             else:
diff --git a/pycardium/modules/py/max86150.py b/pycardium/modules/py/max86150.py
index 08fdecc1582aafae3105fb05b1424bdbde7814d3..7a799c1ca6096752cba2d3f5e33218ffc1dfd9c3 100644
--- a/pycardium/modules/py/max86150.py
+++ b/pycardium/modules/py/max86150.py
@@ -1,6 +1,9 @@
 import sys_max86150
 import uerrno
 import interrupt
+import ucollections
+
+Max86150Data = ucollections.namedtuple("Max86150Data", ["red", "infrared", "ecg"])
 
 
 class MAX86150:
@@ -68,7 +71,13 @@ class MAX86150:
         Read as many samples (signed integer) as currently available.
         """
         assert self.active, "Sensor is inactive"
-        return sys_max86150.read_sensor(self.stream_id)
+        result = []
+        for sample in sys_max86150.read_sensor(self.stream_id):
+            result.append(self._convert(sample))
+        return result
+
+    def _convert(self, sample):
+        return Max86150Data(sample[0], sample[1], sample[2])
 
     def _interrupt(self, _):
         if self.active: