diff --git a/sensor-monitor/shutdown_alarm_monitor.cpp b/sensor-monitor/shutdown_alarm_monitor.cpp
index 2017770..b5b5843 100644
--- a/sensor-monitor/shutdown_alarm_monitor.cpp
+++ b/sensor-monitor/shutdown_alarm_monitor.cpp
@@ -119,7 +119,47 @@
 void ShutdownAlarmMonitor::propertiesChanged(
     sdbusplus::message::message& message)
 {
-    // check the values
+    std::map<std::string, std::variant<bool>> properties;
+    std::string interface;
+
+    if (!_powerState->isPowerOn())
+    {
+        return;
+    }
+
+    message.read(interface, properties);
+
+    auto type = getShutdownType(interface);
+    if (!type)
+    {
+        return;
+    }
+
+    std::string sensorPath = message.get_path();
+
+    const auto& lowAlarmName = alarmProperties.at(*type).at(AlarmType::low);
+    if (properties.count(lowAlarmName) > 0)
+    {
+        AlarmKey alarmKey{sensorPath, *type, AlarmType::low};
+        auto alarm = alarms.find(alarmKey);
+        if (alarm == alarms.end())
+        {
+            alarms.emplace(alarmKey, nullptr);
+        }
+        checkAlarm(std::get<bool>(properties.at(lowAlarmName)), alarmKey);
+    }
+
+    const auto& highAlarmName = alarmProperties.at(*type).at(AlarmType::high);
+    if (properties.count(highAlarmName) > 0)
+    {
+        AlarmKey alarmKey{sensorPath, *type, AlarmType::high};
+        auto alarm = alarms.find(alarmKey);
+        if (alarm == alarms.end())
+        {
+            alarms.emplace(alarmKey, nullptr);
+        }
+        checkAlarm(std::get<bool>(properties.at(highAlarmName)), alarmKey);
+    }
 }
 
 void ShutdownAlarmMonitor::checkAlarm(bool value, const AlarmKey& alarmKey)
@@ -139,4 +179,19 @@
     }
 }
 
+std::optional<ShutdownType>
+    ShutdownAlarmMonitor::getShutdownType(const std::string& interface) const
+{
+    auto it = std::find_if(
+        shutdownInterfaces.begin(), shutdownInterfaces.end(),
+        [interface](const auto& a) { return a.second == interface; });
+
+    if (it == shutdownInterfaces.end())
+    {
+        return std::nullopt;
+    }
+
+    return it->first;
+}
+
 } // namespace sensor::monitor
diff --git a/sensor-monitor/shutdown_alarm_monitor.hpp b/sensor-monitor/shutdown_alarm_monitor.hpp
index 6b1c823..65f905d 100644
--- a/sensor-monitor/shutdown_alarm_monitor.hpp
+++ b/sensor-monitor/shutdown_alarm_monitor.hpp
@@ -117,6 +117,16 @@
     void powerStateChanged(bool powerStateOn);
 
     /**
+     * @brief Returns the ShutdownType for the passed in interface
+     *
+     * @param[in] interface - The D-Bus interface name
+     * @return The interface, or std::nullopt if the interface isn't one
+     *         of the shutdown interfaces.
+     */
+    std::optional<ShutdownType>
+        getShutdownType(const std::string& interface) const;
+
+    /**
      * @brief The sdbusplus bus object
      */
     sdbusplus::bus::bus& bus;
