diff --git a/roles/float-base/files/node-exporter-scripts/smartmon.py b/roles/float-base/files/node-exporter-scripts/smartmon.py
index 7f32f77f67cd83892defaa1b36800763abd38f28..7cfb6c1fdf78260b3107d6206100b37b8d11d8ff 100644
--- a/roles/float-base/files/node-exporter-scripts/smartmon.py
+++ b/roles/float-base/files/node-exporter-scripts/smartmon.py
@@ -196,10 +196,10 @@ def _wrap_hours(power_on_hours, n):
     # wraps around. Try to put it back in the range of the current
     # value of power_on_hours, although now we're just making up data
     # and this will fail spectacularly in certain circumstances.
-    if power_on_hours < 65536:
-        return n
-    if n < (power_on_hours & 0xffff):
-        return (power_on_hours & 0xffff0000) + n
+    up = power_on_hours & 0xffff0000
+    n = up + n
+    while n > power_on_hours:
+        n -= 65536
     return n
 
 
@@ -214,6 +214,8 @@ def collect_self_test_status(device, data):
     # Attempt to extract the most recent self test status by type.
     most_recent_test_by_type = {}
     for test in data['ata_smart_self_test_log']['standard']['table']:
+        # Fix the timestamp
+        test['lifetime_hours'] = _wrap_hours(power_on_hours, test['lifetime_hours'])
         key = test['type']['value']
         if (key not in most_recent_test_by_type) or \
            (test['lifetime_hours'] > most_recent_test_by_type[key]['lifetime_hours']):
@@ -222,8 +224,7 @@ def collect_self_test_status(device, data):
         labels = {'test': to_label_value(test['type']['string'])}
         labels.update(device.labels)
         yield Gauge('self_test_status', labels, test['status']['passed'])
-        yield Gauge('self_test_hours', labels,
-                    _wrap_hours(power_on_hours, test['lifetime_hours']))
+        yield Gauge('self_test_hours', labels, test['lifetime_hours'])
 
 
 def collect_ata_attributes(device, data):