diff --git a/redfish-core/lib/thermal_metrics.hpp b/redfish-core/lib/thermal_metrics.hpp
index da4da01..abf296c 100644
--- a/redfish-core/lib/thermal_metrics.hpp
+++ b/redfish-core/lib/thermal_metrics.hpp
@@ -1,17 +1,117 @@
 #pragma once
 
 #include "app.hpp"
+#include "dbus_utility.hpp"
 #include "query.hpp"
 #include "registries/privilege_registry.hpp"
 #include "utils/chassis_utils.hpp"
+#include "utils/json_utils.hpp"
+#include "utils/sensor_utils.hpp"
 
+#include <boost/system/error_code.hpp>
+
+#include <array>
 #include <functional>
 #include <memory>
 #include <optional>
 #include <string>
+#include <string_view>
 
 namespace redfish
 {
+inline void afterGetTemperatureValue(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& chassisId, const std::string& path,
+    const boost::system::error_code& ec,
+    const dbus::utility::DBusPropertiesMap& valuesDict)
+{
+    if (ec)
+    {
+        if (ec.value() != EBADR)
+        {
+            BMCWEB_LOG_ERROR("DBUS response error for getAllProperties {}",
+                             ec.value());
+            messages::internalError(asyncResp->res);
+        }
+        return;
+    }
+
+    nlohmann::json item = nlohmann::json::object();
+
+    /* Don't return an error for a failure to fill in properties from any of
+     * the sensors in the list. Just skip it.
+     */
+    if (sensor_utils::objectExcerptToJson(
+            path, chassisId, sensor_utils::ChassisSubNode::thermalMetricsNode,
+            "temperature", valuesDict, item))
+    {
+        nlohmann::json& temperatureReadings =
+            asyncResp->res.jsonValue["TemperatureReadingsCelsius"];
+        nlohmann::json::array_t* temperatureArray =
+            temperatureReadings.get_ptr<nlohmann::json::array_t*>();
+        if (temperatureArray == nullptr)
+        {
+            BMCWEB_LOG_ERROR("Missing TemperatureReadingsCelsius Json array");
+            messages::internalError(asyncResp->res);
+            return;
+        }
+
+        temperatureArray->emplace_back(std::move(item));
+        asyncResp->res.jsonValue["TemperatureReadingsCelsius@odata.count"] =
+            temperatureArray->size();
+
+        json_util::sortJsonArrayByKey(*temperatureArray, "DataSourceUri");
+    }
+}
+
+inline void handleTemperatureReadingsCelsius(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& chassisId, const boost::system::error_code& ec,
+    const sensor_utils::SensorServicePathList& sensorsServiceAndPath)
+{
+    if (ec)
+    {
+        if (ec.value() != EBADR)
+        {
+            BMCWEB_LOG_ERROR("DBUS response error for getAssociatedSubTree {}",
+                             ec.value());
+            messages::internalError(asyncResp->res);
+        }
+        return;
+    }
+
+    asyncResp->res.jsonValue["TemperatureReadingsCelsius"] =
+        nlohmann::json::array_t();
+    asyncResp->res.jsonValue["TemperatureReadingsCelsius@odata.count"] = 0;
+
+    for (const auto& [service, sensorPath] : sensorsServiceAndPath)
+    {
+        sdbusplus::asio::getAllProperties(
+            *crow::connections::systemBus, service, sensorPath,
+            "xyz.openbmc_project.Sensor.Value",
+            [asyncResp, chassisId,
+             sensorPath](const boost::system::error_code& ec1,
+                         const dbus::utility::DBusPropertiesMap& properties) {
+                afterGetTemperatureValue(asyncResp, chassisId, sensorPath, ec1,
+                                         properties);
+            });
+    }
+}
+
+inline void getTemperatureReadingsCelsius(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& validChassisPath, const std::string& chassisId)
+{
+    constexpr std::array<std::string_view, 1> interfaces = {
+        "xyz.openbmc_project.Sensor.Value"};
+
+    sensor_utils::getAllSensorObjects(
+        validChassisPath, "/xyz/openbmc_project/sensors/temperature",
+        interfaces, 1,
+        std::bind_front(handleTemperatureReadingsCelsius, asyncResp,
+                        chassisId));
+}
+
 inline void
     doThermalMetrics(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                      const std::string& chassisId,
@@ -32,6 +132,8 @@
         "/redfish/v1/Chassis/{}/ThermalSubsystem/ThermalMetrics", chassisId);
     asyncResp->res.jsonValue["Id"] = "ThermalMetrics";
     asyncResp->res.jsonValue["Name"] = "Thermal Metrics";
+
+    getTemperatureReadingsCelsius(asyncResp, *validChassisPath, chassisId);
 }
 
 inline void handleThermalMetricsHead(
