<div dir="ltr">Here is a diff<div><br><div>diff --git a/src/PSUSensor.cpp b/src/PSUSensor.cpp<br>index e454c74..4072e07 100644<br>--- a/src/PSUSensor.cpp<br>+++ b/src/PSUSensor.cpp<br>@@ -133,6 +133,31 @@ void PSUSensor::deactivate()<br>     i2cDevice = nullptr;<br>     path = "";<br> }<br>+bool PSUSensor::readStatusClearValue(bool success)<br>+{<br>+    bool result = false;<br>+    if(success)<br>+    {<br>+        lastClear = 0;<br>+    }<br>+    else<br>+    {<br>+        unsigned int now = (unsigned int) time(0);<br>+        if(lastClear == 0)<br>+        {<br>+            lastClear = now;<br>+        }<br>+        else<br>+        {<br>+            if((now - lastClear) > timeout_before_clear)<br>+            {<br>+                result = true;<br>+                lastClear = 0;<br>+            }<br>+        }<br>+    }<br>+    return result;<br>+}<br> <br> void PSUSensor::setupRead(void)<br> {<br>@@ -214,12 +239,19 @@ void PSUSensor::handleResponse(const boost::system::error_code& err,<br>     {<br>         if (readingStateGood())<br>         {<br>-            std::cerr << name << " read failed\n";<br>+            std::cerr << name << " read failed:" << err << "\n";<br>+            if(readStatusClearValue(false))<br>+            {<br>+                std::cerr << name << " clearing value" << "\n";<br>+                updateValue(0 + sensorOffset);<br>+            }<br>         }<br>         restartRead();<br>         return;<br>     }<br> <br>+    readStatusClearValue(true);<br>+<br>     // null terminate the string so we don't walk off the end<br>     std::array<char, 128>& bufferRef = *buffer;<br>     bufferRef[bytesRead] = '\0';<br>diff --git a/src/PSUSensor.hpp b/src/PSUSensor.hpp<br>index b49235f..a7ee95d 100644<br>--- a/src/PSUSensor.hpp<br>+++ b/src/PSUSensor.hpp<br>@@ -61,6 +61,16 @@ class PSUSensor : public Sensor, public std::enable_shared_from_this<PSUSensor><br> <br>     static constexpr size_t warnAfterErrorCount = 10;<br> <br>+    // Wait timeout_before_clear (5 minutes)<br>+    static constexpr unsigned int timeout_before_clear = 300; <br>+<br>+    // Time of last clear<br>+    unsigned int lastClear;<br>+<br>+    // Pass true if read was successful, else pass false<br>+    // If the value returned is true, clear the value<br>+    bool readStatusClearValue(bool success);<br>+<br>   public:<br>     static constexpr double defaultSensorPoll = 1.0;<br>     static constexpr unsigned int defaultSensorPollMs =<br></div></div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Mon, Jan 27, 2025 at 3:43 PM Mark Woodward <<a href="mailto:woodwardm@google.com">woodwardm@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">We are having an issue with psusensor in that when it is functioning with or without power, psusensor can read the status of the PSU. If the PSU is removed, the status of the PSU is never updated. <div><br></div><div>It looks like in void PSUSensor::handleResponse() when there is a read error an error log string is output, restartRead () is called, but there is nothing done to the sensor data. This means that when a PSU is removed, aside from the log entry, there is no change to the sensor readings. It will just continue to report the last readings. </div><div><br></div><div>Is a PoC, I added "updateValue(0 + sensorOffset);" in the error stanza, so that when the PSU is removed, the values are cleared.</div><div><br></div><div>Is this expected behavior?</div></div>
</blockquote></div>