diff --git a/Redfish.md b/Redfish.md
index ca33c81..347048d 100644
--- a/Redfish.md
+++ b/Redfish.md
@@ -379,6 +379,8 @@
 
 ##### PowerSupply
 
+- EfficiencyRatings
+  - EfficiencyPercent
 - FirmwareVersion
 - Location
 - Manufacturer
diff --git a/redfish-core/lib/power_supply.hpp b/redfish-core/lib/power_supply.hpp
index 4a766d3..09f731b 100644
--- a/redfish-core/lib/power_supply.hpp
+++ b/redfish-core/lib/power_supply.hpp
@@ -365,6 +365,89 @@
         });
 }
 
+inline void handleGetEfficiencyResponse(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const boost::system::error_code& ec, uint32_t value)
+{
+    if (ec)
+    {
+        if (ec.value() != EBADR)
+        {
+            BMCWEB_LOG_ERROR << "DBUS response error for DeratingFactor "
+                             << ec.value();
+            messages::internalError(asyncResp->res);
+        }
+        return;
+    }
+    // The PDI default value is 0, if it hasn't been set leave off
+    if (value == 0)
+    {
+        return;
+    }
+
+    nlohmann::json::array_t efficiencyRatings;
+    nlohmann::json::object_t efficiencyPercent;
+    efficiencyPercent["EfficiencyPercent"] = value;
+    efficiencyRatings.emplace_back(std::move(efficiencyPercent));
+    asyncResp->res.jsonValue["EfficiencyRatings"] =
+        std::move(efficiencyRatings);
+}
+
+inline void handlePowerSupplyAttributesSubTreeResponse(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const boost::system::error_code& ec,
+    const dbus::utility::MapperGetSubTreeResponse& subtree)
+{
+    if (ec)
+    {
+        if (ec.value() != EBADR)
+        {
+            BMCWEB_LOG_ERROR << "DBUS response error for EfficiencyPercent "
+                             << ec.value();
+            messages::internalError(asyncResp->res);
+        }
+        return;
+    }
+
+    if (subtree.empty())
+    {
+        BMCWEB_LOG_DEBUG << "Can't find Power Supply Attributes!";
+        return;
+    }
+
+    if (subtree.size() != 1)
+    {
+        BMCWEB_LOG_ERROR
+            << "Unexpected number of paths returned by getSubTree: "
+            << subtree.size();
+        messages::internalError(asyncResp->res);
+        return;
+    }
+
+    const auto& [path, serviceMap] = *subtree.begin();
+    const auto& [service, interfaces] = *serviceMap.begin();
+    sdbusplus::asio::getProperty<uint32_t>(
+        *crow::connections::systemBus, service, path,
+        "xyz.openbmc_project.Control.PowerSupplyAttributes", "DeratingFactor",
+        [asyncResp](const boost::system::error_code& ec1, uint32_t value) {
+        handleGetEfficiencyResponse(asyncResp, ec1, value);
+        });
+}
+
+inline void
+    getEfficiencyPercent(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
+{
+    constexpr std::array<std::string_view, 1> efficiencyIntf = {
+        "xyz.openbmc_project.Control.PowerSupplyAttributes"};
+
+    dbus::utility::getSubTree(
+        "/xyz/openbmc_project", 0, efficiencyIntf,
+        [asyncResp](const boost::system::error_code& ec,
+                    const dbus::utility::MapperGetSubTreeResponse& subtree) {
+        handlePowerSupplyAttributesSubTreeResponse(asyncResp, ec, subtree);
+        });
+}
+
 inline void
     doPowerSupplyGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                      const std::string& chassisId,
@@ -417,6 +500,8 @@
             getPowerSupplyLocation(asyncResp, object.begin()->first,
                                    powerSupplyPath);
             });
+
+        getEfficiencyPercent(asyncResp);
     });
 }
 
