diff --git a/powersensor3/PowerSensor3.cpp b/powersensor3/PowerSensor3.cpp
index 0a58f590062bd801b92df2dc8351cc4b2bc49dd8..5fb0ee93601ecbda59afc79c61bba18d2f89425d 100644
--- a/powersensor3/PowerSensor3.cpp
+++ b/powersensor3/PowerSensor3.cpp
@@ -1,7 +1,13 @@
 #include "PowerSensor3.h"
 
+#include <cassert>
+#include <iostream>
+#include <map>
+
 #include POWERSENSOR3_HEADER
 
+const unsigned MAX_PAIRS = PowerSensor3::MAX_PAIRS;
+
 namespace {
 double Seconds(const PowerSensor3::State &first,
                const PowerSensor3::State &second) {
@@ -9,13 +15,13 @@ double Seconds(const PowerSensor3::State &first,
 }
 
 double Joules(const PowerSensor3::State &first,
-              const PowerSensor3::State &second, int sensor_id) {
-  return PowerSensor3::Joules(first, second, sensor_id);
+              const PowerSensor3::State &second, int pair_id) {
+  return PowerSensor3::Joules(first, second, pair_id);
 }
 
 double Watt(const PowerSensor3::State &first, const PowerSensor3::State &second,
-            int sensor_id) {
-  return PowerSensor3::Watt(first, second, sensor_id);
+            int pair_id) {
+  return PowerSensor3::Watt(first, second, pair_id);
 }
 }  // namespace
 
@@ -26,25 +32,57 @@ class PowerSensor3Impl : public PowerSensor3 {
  public:
   PowerSensor3Impl(const char *device)
       : powersensor_(std::make_unique<PowerSensor>(device)),
-        first_state_(powersensor_->read()) {}
+        first_state_(powersensor_->read()) {
+    for (unsigned pair_id; pair_id < MAX_PAIRS; pair_id++) {
+      pairNames[pair_id] = GetPairName(pair_id);
+    }
+  }
 
   State GetState() override {
+    State state(MAX_PAIRS + 1);
     const PowerSensorState powersensor_state = powersensor_->read();
-    State state;
+
+    state.name_[0] = "total";
     state.timestamp_ = ::Seconds(first_state_, powersensor_state);
-    state.name_[0] = "device";
     state.joules_[0] = ::Joules(first_state_, powersensor_state, -1);
     state.watt_[0] = ::Watt(first_state_, powersensor_state, -1);
+
+    for (unsigned pair_id; pair_id < MAX_PAIRS; pair_id++) {
+      state.name_[pair_id + 1] = pairNames[pair_id];
+      state.joules_[pair_id + 1] =
+          ::Joules(first_state_, powersensor_state, pair_id);
+      state.watt_[pair_id + 1] =
+          ::Watt(first_state_, powersensor_state, pair_id);
+    }
+    return state;
+  }
+
+  State Read(int pair_id) override {
+    State state{1};
+    State current_state{MAX_PAIRS + 1};
+    current_state = PMT::Read();
+
+    state.timestamp_ = current_state.timestamp_;
+    state.name_[0] = current_state.name_[pair_id + 1];
+    state.joules_[0] = current_state.joules_[pair_id + 1];
+    state.watt_[0] = current_state.watt_[pair_id + 1];
     return state;
   }
 
+  bool IsInUse(int pair_id) override { return powersensor_->getInUse(pair_id); }
+
+  std::string GetPairName(int pair_id) override {
+    return powersensor_->getPairName(pair_id);
+  }
+
  private:
   virtual const char *GetDumpFilename() { return "/tmp/pmt_powersensor3.out"; }
 
-  virtual int GetMeasurementInterval() {
+  virtual int GetMeasurementInterval() override {
     return 1;  // milliseconds
   }
 
+  std::string pairNames[MAX_PAIRS];
   std::unique_ptr<PowerSensor> powersensor_{};
   PowerSensorState first_state_{};
 };
diff --git a/powersensor3/PowerSensor3.h b/powersensor3/PowerSensor3.h
index 355407a5d83d538519673c7d56db05177888ec73..225e62ce666caff1df8ce58fe9aa3f2231cca104 100644
--- a/powersensor3/PowerSensor3.h
+++ b/powersensor3/PowerSensor3.h
@@ -10,8 +10,11 @@ class PowerSensor3 : public PMT {
   static std::unique_ptr<PowerSensor3> Create(
       const char *device = default_device().c_str());
   static std::string default_device() { return "/dev/ttyACM0"; }
+  virtual std::string GetPairName(int pairID) { return ""; };
+  virtual bool IsInUse(int pairID) { return false; };
+  virtual State Read(int pairID) { return PMT::Read(); };
 };
 
 }  // end namespace pmt::powersensor3
 
-#endif // PMT_POWERSENSOR3_H_
+#endif  // PMT_POWERSENSOR3_H_
diff --git a/python/pmt.py b/python/pmt.py
index fc8481eb38b36415ca084b7adbd1cab7507dfa4b..0dd5ac1f81275fd4245de5d565e8392704eb2823 100644
--- a/python/pmt.py
+++ b/python/pmt.py
@@ -1,17 +1,29 @@
 import pypmt
+import os
+import re
+
+
+def is_tty_device(device_id):
+    return isinstance(device_id, str) and bool(re.search(r"^/dev/tty.*", device_id))
 
 
 def get_pmt(platform, device_id=0):
     if platform == "cray":
         return pypmt.Cray.create()
-    elif platform in ['powersensor2', 'powersensor3']:
+    elif platform == 'powersensor2':
         try:
-            return pypmt.PowerSensor_.create(device_id, 2)
+            if is_tty_device(device_id):
+                return pypmt.PowerSensor2.create(str(device_id))
+            else:
+                return pypmt.PowerSensor2.create()
         except AttributeError:
             raise Exception("PowerSensor2 not installed")
     elif platform == 'powersensor3':
         try:
-            return pypmt.PowerSensor_.create(device_id, 3)
+            if is_tty_device(device_id):
+                return pypmt.PowerSensor3.create(str(device_id))
+            else:
+                return pypmt.PowerSensor3.create()
         except AttributeError:
             raise Exception("PowerSensor3 not installed")
     elif platform == "dummy":
@@ -76,14 +88,13 @@ def dump(platform, **kwargs):
         device_id = kwargs[device_id_arg]
 
     def decorator(func):
-       def wrapper(*args, **kwargs):
-           pmt = get_pmt(platform, device_id)
-           pmt.startDump(filename)
-           result = func(*args, **kwargs)
-           pmt.stopDump()
-           return result
+        def wrapper(*args, **kwargs):
+            pmt = get_pmt(platform, device_id)
+            pmt.startDump(filename)
+            result = func(*args, **kwargs)
+            pmt.stopDump()
+            return result
 
-       return wrapper
+        return wrapper
 
     return decorator
-
diff --git a/python/pypmt.cpp b/python/pypmt.cpp
index 510d2bc9b14a06972faa674b5126a9e28892f06f..3636cb9c09d957e373340e1acf098c838031ced4 100644
--- a/python/pypmt.cpp
+++ b/python/pypmt.cpp
@@ -58,7 +58,9 @@ PYBIND11_MODULE(pypmt, m) {
       .def("create", &pmt::powersensor3::PowerSensor3::Create)
       .def("read", &pmt::powersensor3::PowerSensor3::Read)
       .def("startDump", &pmt::powersensor3::PowerSensor3::StartDump)
-      .def("stopDump", &pmt::powersensor3::PowerSensor3::StopDump);
+      .def("stopDump", &pmt::powersensor3::PowerSensor3::StopDump)
+      .def("getPairName", &pmt::powersensor3::PowerSensor3::GetPairName)
+      .def("isInUse", &pmt::powersensor3::PowerSensor3::IsInUse);
 #endif
 
   py::class_<pmt::Dummy>(m, "Dummy")