Motherboard, PCH, Heatsink & Component Temperatures #18

Closed
opened 2026-09-08 10:29:22 +01:00 by gronod · 2 comments
Owner

Purpose

Monitor auxiliary component temperatures across Intel Mac hardware, including the Intel Platform Controller Hub (PCH), system heatsinks, memory DIMMs, power supply units (PSU), Thunderbolt controllers, and ambient air intake/exhaust.

Priority

Medium (Complete thermal visibility across chassis components for workstation and thermal diagnosis)

Dependencies

  • Depends on #2 (SMC Interface Engine (AppleSMC IOKit Client))

Scope

  • Query SMC temperature keys across Intel motherboard components:
    • Intel PCH die temperature (TPCD, TP0P)
    • Main heatsink temperatures (Th0H, Th1H, Th2H)
    • Memory slot / DIMM proximity temperatures (TM0P, TM1P, TM2P...)
    • Power supply unit (PSU) temperature (Tp0P, Tp1P on Mac Pro and iMac)
    • Ambient air intake and internal chassis ambient (TA0P, TA1P, TA0S)
    • Thunderbolt controller temperature (TTLD)
  • Filter out non-existent keys dynamically based on detected Mac model.
  • Group and present sensor readings in a dedicated Thermal Matrix view.

Implementation Suggestions

  • Enumerate model-specific sensor dictionaries keyed by Mac hardware identifier (e.g. MacBookPro16,1, iMac20,2, MacPro7,1).
  • Read keys using MMAppleSMCClient and decode sp78 fixed-point floats.
  • Provide a collapsible or tabular UI grouped by subsystem (Chassis, Memory, Chipset, Power).
### Purpose Monitor auxiliary component temperatures across Intel Mac hardware, including the Intel Platform Controller Hub (PCH), system heatsinks, memory DIMMs, power supply units (PSU), Thunderbolt controllers, and ambient air intake/exhaust. ### Priority **Medium** (Complete thermal visibility across chassis components for workstation and thermal diagnosis) ### Dependencies - Depends on #2 (SMC Interface Engine (AppleSMC IOKit Client)) ### Scope - Query SMC temperature keys across Intel motherboard components: - Intel PCH die temperature (`TPCD`, `TP0P`) - Main heatsink temperatures (`Th0H`, `Th1H`, `Th2H`) - Memory slot / DIMM proximity temperatures (`TM0P`, `TM1P`, `TM2P`...) - Power supply unit (PSU) temperature (`Tp0P`, `Tp1P` on Mac Pro and iMac) - Ambient air intake and internal chassis ambient (`TA0P`, `TA1P`, `TA0S`) - Thunderbolt controller temperature (`TTLD`) - Filter out non-existent keys dynamically based on detected Mac model. - Group and present sensor readings in a dedicated Thermal Matrix view. ### Implementation Suggestions - Enumerate model-specific sensor dictionaries keyed by Mac hardware identifier (e.g. `MacBookPro16,1`, `iMac20,2`, `MacPro7,1`). - Read keys using `MMAppleSMCClient` and decode `sp78` fixed-point floats. - Provide a collapsible or tabular UI grouped by subsystem (Chassis, Memory, Chipset, Power).
Author
Owner

Technical Implementation Plan & Code Solution

1. Intel Component Thermal Mapping

Beyond CPU cores, Intel motherboards contain critical silicon blocks whose temperatures govern fan acoustic curves:

  • PCH (Platform Controller Hub): TPCD, TP0P
  • Heatsinks: Th0H, Th1H, Th2H
  • Memory DIMMs: TM0P, TM1P, TM2P, TM3P, TM0S
  • Ambient Air Intake: TA0P, TA1P, TA0S
  • Power Supply: Tp0P, Tp1P
  • Thunderbolt Subsystem: TTLD, TTHD

2. Objective-C Provider (MMComponentThermalProvider.m)

#import "MMComponentThermalProvider.h"
#import "MMAppleSMCClient.h"

@interface MMComponentThermalProvider ()
@property (nonatomic, strong) NSDictionary<NSString *, NSString *> *sensorDictionary;
@end

@implementation MMComponentThermalProvider

- (instancetype)init {
    self = [super init];
    if (self) {
        _sensorDictionary = @{
            @"TPCD": @"Intel PCH Die",
            @"TP0P": @"Platform Controller Hub",
            @"Th0H": @"Main Heatsink 1",
            @"Th1H": @"Main Heatsink 2",
            @"TM0P": @"Memory Proximity (Slot 1)",
            @"TM1P": @"Memory Proximity (Slot 2)",
            @"TM2P": @"Memory Proximity (Slot 3)",
            @"TM3P": @"Memory Proximity (Slot 4)",
            @"TA0P": @"Chassis Ambient Air",
            @"TA1P": @"Exhaust Ambient",
            @"Tp0P": @"Power Supply (PSU)",
            @"TTLD": @"Thunderbolt Controller"
        };
    }
    return self;
}

- (NSDictionary<NSString *, id> *)sampleTelemetryWithError:(NSError **)error {
    MMAppleSMCClient *smc = [MMAppleSMCClient sharedClient];
    NSMutableArray *sensors = [NSMutableArray array];

    for (NSString *key in self.sensorDictionary) {
        NSNumber *temp = [smc readTemperatureForKey:key];
        if (temp) {
            [sensors addObject:@{
                @"key": key,
                @"label": self.sensorDictionary[key],
                @"temperatureCelsius": temp
            }];
        }
    }

    return @{@"components": [sensors copy]};
}
@end

3. Swift Model

public struct ComponentThermalSensor: Identifiable, Sendable {
    public var id: String { key }
    public let key: String
    public let label: String
    public let temperatureCelsius: Double
}

4. Dynamic Filtering

Only sensors physically installed and populated on the current hardware model will return non-nil numbers, ensuring iMac, Mac Pro, and MacBook models display clean, model-tailored lists.

## Technical Implementation Plan & Code Solution ### 1. Intel Component Thermal Mapping Beyond CPU cores, Intel motherboards contain critical silicon blocks whose temperatures govern fan acoustic curves: - **PCH (Platform Controller Hub)**: `TPCD`, `TP0P` - **Heatsinks**: `Th0H`, `Th1H`, `Th2H` - **Memory DIMMs**: `TM0P`, `TM1P`, `TM2P`, `TM3P`, `TM0S` - **Ambient Air Intake**: `TA0P`, `TA1P`, `TA0S` - **Power Supply**: `Tp0P`, `Tp1P` - **Thunderbolt Subsystem**: `TTLD`, `TTHD` --- ### 2. Objective-C Provider (`MMComponentThermalProvider.m`) ```objc #import "MMComponentThermalProvider.h" #import "MMAppleSMCClient.h" @interface MMComponentThermalProvider () @property (nonatomic, strong) NSDictionary<NSString *, NSString *> *sensorDictionary; @end @implementation MMComponentThermalProvider - (instancetype)init { self = [super init]; if (self) { _sensorDictionary = @{ @"TPCD": @"Intel PCH Die", @"TP0P": @"Platform Controller Hub", @"Th0H": @"Main Heatsink 1", @"Th1H": @"Main Heatsink 2", @"TM0P": @"Memory Proximity (Slot 1)", @"TM1P": @"Memory Proximity (Slot 2)", @"TM2P": @"Memory Proximity (Slot 3)", @"TM3P": @"Memory Proximity (Slot 4)", @"TA0P": @"Chassis Ambient Air", @"TA1P": @"Exhaust Ambient", @"Tp0P": @"Power Supply (PSU)", @"TTLD": @"Thunderbolt Controller" }; } return self; } - (NSDictionary<NSString *, id> *)sampleTelemetryWithError:(NSError **)error { MMAppleSMCClient *smc = [MMAppleSMCClient sharedClient]; NSMutableArray *sensors = [NSMutableArray array]; for (NSString *key in self.sensorDictionary) { NSNumber *temp = [smc readTemperatureForKey:key]; if (temp) { [sensors addObject:@{ @"key": key, @"label": self.sensorDictionary[key], @"temperatureCelsius": temp }]; } } return @{@"components": [sensors copy]}; } @end ``` --- ### 3. Swift Model ```swift public struct ComponentThermalSensor: Identifiable, Sendable { public var id: String { key } public let key: String public let label: String public let temperatureCelsius: Double } ``` --- ### 4. Dynamic Filtering Only sensors physically installed and populated on the current hardware model will return non-nil numbers, ensuring iMac, Mac Pro, and MacBook models display clean, model-tailored lists.
gronod added this to the M2: Primary System & Thermal Telemetry milestone 2026-09-08 10:42:11 +01:00
gronod added a new dependency 2026-09-08 11:37:09 +01:00
Author
Owner

Completed in feat/18-component-temps and merged into develop.

  • Implemented MMComponentThermalProvider probing Intel PCH (TPCD, TP0P), heatsinks (Th0H .. Th3H), memory (TM0P .. TM3P, TM0S), power supply (Tp0P .. Tp2P), ambient intake/exhaust (TA0P, TA1P, TA0S), and Thunderbolt controllers (TTLD).
  • Categorized sensors dynamically into PCH / Chipset, Heatsink, Memory, Power Supply, Ambient / Enclosure, and Thunderbolt / IO subsystems.
  • Implemented pure static calculator for peak and average auxiliary temperatures.
  • Unit tested with 100% pass in MMComponentThermalTests.swift.
Completed in `feat/18-component-temps` and merged into `develop`. - Implemented `MMComponentThermalProvider` probing Intel PCH (`TPCD`, `TP0P`), heatsinks (`Th0H` .. `Th3H`), memory (`TM0P` .. `TM3P`, `TM0S`), power supply (`Tp0P` .. `Tp2P`), ambient intake/exhaust (`TA0P`, `TA1P`, `TA0S`), and Thunderbolt controllers (`TTLD`). - Categorized sensors dynamically into PCH / Chipset, Heatsink, Memory, Power Supply, Ambient / Enclosure, and Thunderbolt / IO subsystems. - Implemented pure static calculator for peak and average auxiliary temperatures. - Unit tested with 100% pass in `MMComponentThermalTests.swift`.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: gronod/MacMonitor#18