diff --git a/src/IpmbSensor.cpp b/src/IpmbSensor.cpp
index 5c76e8b..738ef57 100644
--- a/src/IpmbSensor.cpp
+++ b/src/IpmbSensor.cpp
@@ -61,7 +61,7 @@
            "xyz.openbmc_project.Configuration.ExitAirTemp", ipmbMaxReading,
            ipmbMinReading),
     objectServer(objectServer), dbusConnection(conn), waitTimer(io),
-    deviceAddress(deviceAddress)
+    deviceAddress(deviceAddress), readState(PowerState::on)
 {
     sensorInterface = objectServer.add_interface(
         "/xyz/openbmc_project/sensors/temperature/" + name,
@@ -195,7 +195,7 @@
         {
             return; // we're being canceled
         }
-        if (!isPowerOn() && readState == PowerState::on)
+        if (!isPowerOn() && readState != PowerState::always)
         {
             updateValue(0);
             read();
@@ -218,7 +218,7 @@
                     read();
                     return;
                 }
-                if (!isPowerOn() && readState == PowerState::on)
+                if (!isPowerOn() && readState != PowerState::always)
                 {
                     updateValue(0);
                     read();
@@ -384,13 +384,14 @@
 {
     constexpr const size_t reinitWaitSeconds = 2;
     std::string objectName;
-    boost::container::flat_map<std::string, std::variant<int32_t>> values;
+    boost::container::flat_map<std::string, std::variant<std::string>> values;
     message.read(objectName, values);
 
-    auto findPgood = values.find("pgood");
-    if (findPgood != values.end())
+    auto findStatus = values.find(power::property);
+    if (findStatus != values.end())
     {
-        int32_t powerStatus = std::get<int32_t>(findPgood->second);
+        bool powerStatus = boost::ends_with(
+            std::get<std::string>(findStatus->second), "Running");
         if (powerStatus)
         {
             if (!initCmdTimer)
@@ -461,9 +462,9 @@
 
     sdbusplus::bus::match::match powerChangeMatch(
         static_cast<sdbusplus::bus::bus&>(*systemBus),
-        "type='signal',interface='org.freedesktop.DBus.Properties',path_"
-        "namespace='/xyz/openbmc_project/Chassis/Control/"
-        "Power0',arg0='xyz.openbmc_project.Chassis.Control.Power'",
+        "type='signal',interface='" + std::string(properties::interface) +
+            "',path='" + std::string(power::path) + "',arg0='" +
+            std::string(power::interface) + "'",
         reinitSensors);
 
     io.run();
diff --git a/src/Utils.cpp b/src/Utils.cpp
index d90813d..e43d90e 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -24,15 +24,12 @@
 #include <sdbusplus/bus/match.hpp>
 
 namespace fs = std::filesystem;
-const static constexpr char* powerInterfaceName =
-    "xyz.openbmc_project.Chassis.Control.Power";
-const static constexpr char* powerObjectName =
-    "/xyz/openbmc_project/Chassis/Control/Power0";
 
 static bool powerStatusOn = false;
 static bool biosHasPost = false;
 
 static std::unique_ptr<sdbusplus::bus::match::match> powerMatch = nullptr;
+static std::unique_ptr<sdbusplus::bus::match::match> postMatch = nullptr;
 
 bool getSensorConfiguration(
     const std::string& type,
@@ -122,9 +119,9 @@
 
 bool hasBiosPost(void)
 {
-    if (!powerMatch)
+    if (!postMatch)
     {
-        throw std::runtime_error("Power Match Not Created");
+        throw std::runtime_error("Post Match Not Created");
     }
     return biosHasPost;
 }
@@ -133,57 +130,75 @@
 {
     // create a match for powergood changes, first time do a method call to
     // cache the correct value
-    std::function<void(sdbusplus::message::message & message)> eventHandler =
-        [](sdbusplus::message::message& message) {
-            std::string objectName;
-            boost::container::flat_map<std::string, std::variant<int32_t, bool>>
-                values;
-            message.read(objectName, values);
-            auto findPgood = values.find("pgood");
-            if (findPgood != values.end())
-            {
-                powerStatusOn = std::get<int32_t>(findPgood->second);
-            }
-            auto findPostComplete = values.find("post_complete");
-            if (findPostComplete != values.end())
-            {
-                biosHasPost = std::get<bool>(findPostComplete->second);
-            }
-        };
+    if (powerMatch)
+    {
+        return;
+    }
 
     powerMatch = std::make_unique<sdbusplus::bus::match::match>(
         static_cast<sdbusplus::bus::bus&>(*conn),
-        "type='signal',interface='org.freedesktop.DBus.Properties',path_"
-        "namespace='/xyz/openbmc_project/Chassis/Control/"
-        "Power0',arg0='xyz.openbmc_project.Chassis.Control.Power'",
-        eventHandler);
-
-    conn->async_method_call(
-        [](boost::system::error_code ec, const std::variant<int32_t>& pgood) {
-            if (ec)
+        "type='signal',interface='" + std::string(properties::interface) +
+            "',path='" + std::string(power::path) + "',arg0='" +
+            std::string(power::interface) + "'",
+        [](sdbusplus::message::message& message) {
+            std::string objectName;
+            boost::container::flat_map<std::string, std::variant<std::string>>
+                values;
+            message.read(objectName, values);
+            auto findState = values.find(power::property);
+            if (findState != values.end())
             {
-                // we commonly come up before power control, we'll capture the
-                // property change later
-                return;
+                powerStatusOn = boost::ends_with(
+                    std::get<std::string>(findState->second), "Running");
             }
-            powerStatusOn = std::get<int32_t>(pgood);
-        },
-        powerInterfaceName, powerObjectName, "org.freedesktop.DBus.Properties",
-        "Get", powerInterfaceName, "pgood");
+        });
+
+    postMatch = std::make_unique<sdbusplus::bus::match::match>(
+        static_cast<sdbusplus::bus::bus&>(*conn),
+        "type='signal',interface='" + std::string(properties::interface) +
+            "',path='" + std::string(post::path) + "',arg0='" +
+            std::string(post::interface) + "'",
+        [](sdbusplus::message::message& message) {
+            std::string objectName;
+            boost::container::flat_map<std::string, std::variant<std::string>>
+                values;
+            message.read(objectName, values);
+            auto findState = values.find(post::property);
+            if (findState != values.end())
+            {
+                biosHasPost =
+                    std::get<std::string>(findState->second) != "Inactive";
+            }
+        });
 
     conn->async_method_call(
         [](boost::system::error_code ec,
-           const std::variant<int32_t>& postComplete) {
+           const std::variant<std::string>& state) {
             if (ec)
             {
                 // we commonly come up before power control, we'll capture the
                 // property change later
                 return;
             }
-            biosHasPost = std::get<int32_t>(postComplete);
+            powerStatusOn =
+                boost::ends_with(std::get<std::string>(state), "Running");
         },
-        powerInterfaceName, powerObjectName, "org.freedesktop.DBus.Properties",
-        "Get", powerInterfaceName, "post_complete");
+        power::busname, power::path, properties::interface, properties::get,
+        power::interface, power::property);
+
+    conn->async_method_call(
+        [](boost::system::error_code ec,
+           const std::variant<std::string>& state) {
+            if (ec)
+            {
+                // we commonly come up before power control, we'll capture the
+                // property change later
+                return;
+            }
+            biosHasPost = std::get<std::string>(state) != "Inactive";
+        },
+        post::busname, post::path, properties::interface, properties::get,
+        post::interface, post::property);
 }
 
 // replaces limits if MinReading and MaxReading are found.
