diff --git a/include/Utils.hpp b/include/Utils.hpp
index 7f529e1..c164187 100644
--- a/include/Utils.hpp
+++ b/include/Utils.hpp
@@ -42,6 +42,12 @@
               std::vector<std::pair<std::string, std::vector<std::string>>>>>;
 using Association = std::tuple<std::string, std::string, std::string>;
 
+std::optional<std::string> openAndRead(const std::string& hwmonFile);
+std::optional<std::string>
+    getFullHwmonFilePath(const std::string& directory,
+                         const std::string& hwmonBaseName,
+                         const std::set<std::string>& permitSet);
+std::set<std::string> getPermitSet(const SensorBaseConfigMap& config);
 bool findFiles(const std::filesystem::path dirPath,
                const std::string& matchString,
                std::vector<std::filesystem::path>& foundPaths,
diff --git a/src/HwmonTempMain.cpp b/src/HwmonTempMain.cpp
index be7be98..c972cf3 100644
--- a/src/HwmonTempMain.cpp
+++ b/src/HwmonTempMain.cpp
@@ -213,13 +213,20 @@
                         VariantToStringVisitor(), findPowerOn->second);
                     setReadState(powerState, readState);
                 }
+
+                auto permitSet = getPermitSet(*baseConfigMap);
                 auto& sensor = sensors[sensorName];
                 sensor = nullptr;
-                sensor = std::make_shared<HwmonTempSensor>(
-                    directory.string() + "/temp1_input", sensorType,
-                    objectServer, dbusConnection, io, sensorName,
-                    std::move(sensorThresholds), *interfacePath, readState);
-                sensor->setupRead();
+                auto hwmonFile = getFullHwmonFilePath(directory.string(),
+                                                      "temp1", permitSet);
+                if (hwmonFile)
+                {
+                    sensor = std::make_shared<HwmonTempSensor>(
+                        *hwmonFile, sensorType, objectServer, dbusConnection,
+                        io, sensorName, std::move(sensorThresholds),
+                        *interfacePath, readState);
+                    sensor->setupRead();
+                }
                 // Looking for keys like "Name1" for temp2_input,
                 // "Name2" for temp3_input, etc.
                 int i = 0;
@@ -232,18 +239,22 @@
                     {
                         break;
                     }
-
                     std::string sensorName =
                         std::get<std::string>(findKey->second);
-                    auto& sensor = sensors[sensorName];
-                    sensor = nullptr;
-                    sensor = std::make_shared<HwmonTempSensor>(
-                        directory.string() + "/temp" + std::to_string(i + 1) +
-                            "_input",
-                        sensorType, objectServer, dbusConnection, io,
-                        sensorName, std::vector<thresholds::Threshold>(),
-                        *interfacePath, readState);
-                    sensor->setupRead();
+                    hwmonFile = getFullHwmonFilePath(
+                        directory.string(), "temp" + std::to_string(i + 1),
+                        permitSet);
+                    if (hwmonFile)
+                    {
+                        auto& sensor = sensors[sensorName];
+                        sensor = nullptr;
+                        sensor = std::make_shared<HwmonTempSensor>(
+                            *hwmonFile, sensorType, objectServer,
+                            dbusConnection, io, sensorName,
+                            std::vector<thresholds::Threshold>(),
+                            *interfacePath, readState);
+                        sensor->setupRead();
+                    }
                 }
             }
         }));
diff --git a/src/Utils.cpp b/src/Utils.cpp
index b8e4506..899ec98 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -40,6 +40,93 @@
 static std::unique_ptr<sdbusplus::bus::match::match> powerMatch = nullptr;
 static std::unique_ptr<sdbusplus::bus::match::match> postMatch = nullptr;
 
+/**
+ * return the contents of a file
+ * @param[in] hwmonFile - the path to the file to read
+ * @return the contents of the file as a string or nullopt if the file could not
+ * be opened.
+ */
+
+std::optional<std::string> openAndRead(const std::string& hwmonFile)
+{
+    std::string fileVal;
+    std::ifstream fileStream(hwmonFile);
+    if (!fileStream.is_open())
+    {
+        return std::nullopt;
+    }
+    std::getline(fileStream, fileVal);
+    return fileVal;
+}
+
+/**
+ * given a hwmon temperature base name if valid return the full path else
+ * nullopt
+ * @param[in] directory - the hwmon sysfs directory
+ * @param[in] permitSet - a set of labels or hwmon basenames to permit. If this
+ * is empty then *everything* is permitted.
+ * @return a string to the full path of the file to create a temp sensor with or
+ * nullopt to indicate that no sensor should be created for this basename.
+ */
+std::optional<std::string>
+    getFullHwmonFilePath(const std::string& directory,
+                         const std::string& hwmonBaseName,
+                         const std::set<std::string>& permitSet)
+{
+    std::optional<std::string> result;
+    std::string filename;
+    if (permitSet.empty())
+    {
+        result = directory + "/" + hwmonBaseName + "_input";
+        return result;
+    }
+    filename = directory + "/" + hwmonBaseName + "_label";
+    auto searchVal = openAndRead(filename);
+    if (!searchVal)
+    {
+        /* if the hwmon temp doesn't have a corresponding label file
+         * then use the hwmon temperature base name
+         */
+        searchVal = hwmonBaseName;
+    }
+    if (permitSet.find(*searchVal) != permitSet.end())
+    {
+        result = directory + "/" + hwmonBaseName + "_input";
+    }
+    return result;
+}
+
+/**
+ * retrieve a set of basenames and labels to allow sensor creation for.
+ * @param[in] config - a map representing the configuration for a specific
+ * device
+ * @return a set of basenames and labels to allow sensor creation for. An empty
+ * set indicates that everything is permitted.
+ */
+std::set<std::string> getPermitSet(const SensorBaseConfigMap& config)
+{
+    auto permitAttribute = config.find("Labels");
+    std::set<std::string> permitSet;
+    if (permitAttribute != config.end())
+    {
+        try
+        {
+            auto val =
+                std::get<std::vector<std::string>>(permitAttribute->second);
+
+            permitSet.insert(std::make_move_iterator(val.begin()),
+                             std::make_move_iterator(val.end()));
+        }
+        catch (const std::bad_variant_access& err)
+        {
+            std::cerr << err.what()
+                      << ":PermitList does not contain a list, wrong "
+                         "variant type.\n";
+        }
+    }
+    return permitSet;
+}
+
 bool getSensorConfiguration(
     const std::string& type,
     const std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
