MCWrapperをCocoa Framework化してAppleScriptから呼びやすいように書き換えた「SMCKit.framework」を呼び出して、CPUの温度や放熱ファンの回転数を取得するAppleScriptのパラメータを追跡調査したものです。
最近、夏の暑さ対策のためにMacのファン回転を操作&各種センサー値を取得する「TG Pro」を使い始め、MacBook Proの下にCooling Fanを設置し、人間を冷やすためにサーキュレーター(「戦場の絆」のPOD内によく設置されている一品)を設置しています。
▲このプログラムを書いたころ、ちょうど鹿児島の海沿いの東向きの部屋にいたので、夏場は暑さで人間よりも先にコンピュータ(Mac)が音を上げていました(なつかしい) そして、桜島が噴火を起こすとドアとか窓ガラスが衝撃波でビリビリと震えていました。激しい噴火だと、ドアを蹴られたような音がするほど(海沿いだったもので)
ちょっと前までは、このサーキュレータでMacBook Proに送風していました。これだと人間が冷えなさすぎなので、近くのPC DepotでノートPC用のクーリングファンを買ってきた次第です。
▲TG Pro(左)、HWMonitor(右)
オープンソースのHWMonitor(HWSensorsに含まれる実行バイナリ)の中身を見てみたところ、SMCにはもっといろいろパラメータを指定できることがわかりました。ざっと調べて、その数493個!
ただし、実行するハードウェアの構成によって、取得できるセンサーも変わってきます。デスクトップ型のMac miniやMac Proに明度センサー(アンビエント・センサー)やバッテリー関連のセンサーはついていないですし(Mac Pro 2013には明度センサーが付いていたかもしれない)、ディスクリートGPUを搭載していないMacBook AirやMac miniでディスクリートGPU関連のセンサーから値を取ることはできません。
–> Download SMCKit.framework(To ~/Library/Frameworks/)
実際には、CPU/GPU関連の温度センサーの値だけ取得できれば、Cocoa呼び出しで高速に処理しすぎてCPUの温度が上がりすぎた、というケースにも対応できるはずです(警告を出すとかいった程度で、ファンの回転数を上げるといった処理はまだできていません)。
長時間、ファイルを大量に処理するような場合には、マシンの種別を取得して、ノートであればあらかじめ放熱に気をつけるようにメッセージを表示し、処理中にCPU温度が上がりすぎた場合には何らかの対策を行うといったところでしょうか(サーマルスロットリングが起こらない程度に様子を見る、とか?)。
AppleScript名:SMCkitで各種センサー値を取得する |
— Created 2018-08-21 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "SMCKit" –https://github.com/FergusInLondon/SMCWrapper –I turned the SMCWrapper into Cocoa Framework and change it to call from AppleScript set smc to current application’s SMCWrapper’s sharedWrapper() –CPU Proximity set a0Res to (smc’s readKeyAsString:"TC0P") as string as number –> 53.875 (℃) –CPU set a1Res to (smc’s readKeyAsString:"TCXC") as string as number –> 69.984(℃) –PECI SA set a2Res to (smc’s readKeyAsString:"TCSA") as string as number –> 68(℃) –PECI GPU set a3Res to (smc’s readKeyAsString:"TCGC") as string as number –> 69(℃) –PCH Die set a4Res to (smc’s readKeyAsString:"TPCD") as string as number –> 71(℃) –Memory Module, Proximity set a5Res to (smc’s readKeyAsString:"TM0P") as string as number –> 56.75(℃) –GPU Die set a6Res to (smc’s readKeyAsString:"TG0D") as string as number –> 65.375(℃) –GPU Proximity set a7Res to (smc’s readKeyAsString:"TG0P") as string as number –> 59.5(℃) –Airport Proximity set a8Res to (smc’s readKeyAsString:"TW0P") as string as number –> 52(℃) –Battery set a9Res to (smc’s readKeyAsString:"TB0T") as string as number –> 38.699 –Battery set a10Res to (smc’s readKeyAsString:"TB1T") as string as number –> 38.699 –Battery set a11Res to (smc’s readKeyAsString:"TB2T") as string as number –> 36.5 –Heatpipe set a12Res to (smc’s readKeyAsString:"Th1H") as string as number –> 46.75(℃) –Heatpipe Incoming Air set a12Res to (smc’s readKeyAsString:"Ts0P") as string as number –> 40(℃) –CPU VRM set a13Res to (smc’s readKeyAsString:"VC0C") as string as number –> 0.86963 –CPU GFX –set a13Res to (smc’s readKeyAsString:"VC0G") as list of string or string –> 0.86963 –CPU Core set a13Res to (smc’s readKeyAsString:"IC0C") as string as number –> 13.57 –CPU Rail set a14Res to (smc’s readKeyAsString:"IC0R") as string as number –> 1.0586 –GPU set a15Res to (smc’s readKeyAsString:"IG0C") as string as number –> 7.898 –IM:021C|Memory Module %X set a16Res to (smc’s readKeyAsString:"IM0C") as string as number –> 0.3252 –Battery –set a16Res to (smc’s readKeyAsString:"IBAC") as list of string or string –> 0.3252 –Mainboard S0 Rail set a17Res to (smc’s readKeyAsString:"ID0R") as string as number –> 2.29321 –CPU Core set a18Res to (smc’s readKeyAsString:"PC0C") as string as number –> 10.39 (A) –CPU Package Cores set a18Res to (smc’s readKeyAsString:"PCPC") as string as number –> 5.75 (W) –CPU Package Graphics set a18Res to (smc’s readKeyAsString:"PCPG") as string as number –> 0.094 –CPU Package Total set a19Res to (smc’s readKeyAsString:"PCPT") as string as number –> 12.07 (W) –PM:041C|Memory Module %X set a20Res to (smc’s readKeyAsString:"PM0R") as string as number –> 0.441 –Battery Rail set a21Res to (smc’s readKeyAsString:"PBLC") as string as number –> 0.012 –Mainboard S0 Rail set a21Res to (smc’s readKeyAsString:"PC0R") as string as number –> 14.617 –System Total set a21Res to (smc’s readKeyAsString:"PSTR") as string as number –> 41.234 |