Как я сделал бесплатный монитор температуры CPU и GPU для Mac, который живёт в строке меню и не просит пароль

Как я сделал бесплатный монитор температуры CPU и GPU для Mac, который живёт в строке меню и не просит пароль

macOS прячет температуру чипа за приватными API. Большинство мониторов — это либо тяжёлые Electron-приложения, либо утилиты, которые требуют sudo при каждом запуске, либо платный iStat Menus. Я хотел просто видеть, насколько горячий мой M4 Max. Поэтому написал нативное приложение на Swift — и выложил с открытым кодом.Каждый, у кого есть MacBook на Apple Silicon, рано или поздно задаётся вопросом: а насколько горячо он сейчас работает? Особенно когда вентиляторы раскручиваются под нагрузкой, корпус нагревается, а ты компилируешь большой проект или рендеришь видео

И тут выясняется неприятное: macOS не показывает температуру чипа. Нигде. Ни в «Мониторинге системы», ни в настройках. Apple держит эти данные за приватными API и наружу не отдаёт.

Что предлагает рынок

Когда я полез искать решение, оказалось, что выбор сводится к трём вариантам, и каждый меня не устраивал.

Первый — мониторы на Electron. Это веб-приложения, завёрнутые в браузерный движок. Они едят сотни мегабайт оперативной памяти просто чтобы показать одно число в углу экрана. Запускать целый Chromium ради температуры — абсурд.

Второй — утилиты, которые требуют sudo при каждом запуске. То есть каждый раз, когда ты хочешь увидеть температуру, нужно вводить пароль администратора. Это быстро надоедает.

Третий — платные пакеты вроде iStat Menus. Хороший софт, но он показывает целую панель из десятков показателей, а стоит денег. Мне же нужно было одно: температура. Платить за комбайн ради одной функции не хотелось.

Я решил, что должно существовать что-то лёгкое, быстрое и бесплатное. Не нашёл — написал сам.

ThermalBar

Получилось крошечное нативное приложение на Swift, которое живёт в строке меню и показывает три вещи в реальном времени: температуру процессора, температуру видеоядра и потребляемую мощность в ваттах.

Выглядит это так: C 52° G 48° 35W — прямо в строке меню, всегда на виду.

Главная фишка — цветовая индикация. Каждое значение окрашивается в зависимости от того, насколько всё горячо:

  • зелёный — холодный режим, всё спокойно;
  • оранжевый — нагревается;
  • красный — горячо;
  • тёмно-красный — критично.

Один взгляд на строку меню — и сразу понятно состояние, без необходимости вчитываться в цифры. Пороги при этом настраиваются под себя, любую метрику можно включить или выключить.

Техническая часть: как читать температуру без sudo

Дальше будет интересно тем, кто разбирается. Остальные могут смело пропустить до раздела про установку.

Самое сложное было — получить температуру вообще, да ещё и без прав root. Большинство утилит для этого либо ставят системное расширение, либо запускаются от администратора. Я хотел обойтись без этого.

Решение нашлось в приватном API IOKit — фреймворке IOHIDEventSystemClient. Через него можно подключиться к системе HID-датчиков и прочитать температурные сенсоры напрямую, без повышения привилегий. Тот же механизм, по сути, использует системная утилита powermetrics, только ей нужен sudo, а через HID-клиент можно обойтись без него.

Дальше всплыла любопытная деталь, характерная именно для Apple Silicon. Когда я выгрузил полный список датчиков на своём M4 Max, их оказалось 53 штуки. Все они — температурные сенсоры группы AppleVendor: PMU tdie и tdev (это термодатчики кристалла), датчики батареи, датчик NAND-памяти.

И вот что важно: отдельного датчика температуры GPU на M4 Max попросту нет. На некоторых старых чипах он встречался, но здесь видеоядро и процессорные ядра живут на одном кристалле, и Apple не выделяет для GPU отдельный сенсор. Те самые tdie-датчики разбросаны по всему кристаллу и покрывают в том числе зону GPU, но именованного «датчика видеокарты» среди них нет.

Поэтому я сделал гибридную архитектуру. Температуру процессора ThermalBar читает нативно через IOKit — это работает всегда и без зависимостей. А температуру GPU и мощность берёт из лёгкого вспомогательного процесса с открытым кодом (macmon), который поднимается фоном и отдаёт эти данные по локальному адресу. Если вспомогательный модуль не запущен, приложение просто скрывает GPU и ватты, а температура процессора продолжает работать.

Получилась честная схема: ядро функциональности работает само по себе на голом системном API, а расширенные метрики подключаются опционально.

Установка в одну команду

Я специально сделал установку максимально простой. Никаких сборок вручную, никаких танцев с зависимостями:

git clone https://github.com/evilork/thermalbar.git cd thermalbar ./install.sh

Установщик сам соберёт приложение, положит его в папку «Программы» и настроит автозапуск при входе в систему. Температуры появятся в строке меню через пару секунд. Никакой настройки не требуется — всё работает из коробки.

Кому это нужно

В первую очередь — разработчикам, которые компилируют тяжёлые проекты и видят, как греется машина. Видеомонтажёрам, нагружающим GPU. ML-инженерам, обучающим модели на Apple Silicon. Геймерам. И вообще всем, у кого MacBook время от времени становится горячим, и кто хочет понять, что именно его греет — но без установки громоздкого пакета мониторинга.

Открытый код

ThermalBar полностью бесплатный, с открытым исходным кодом под лицензией MIT. Это не демо и не триал — приложение бесплатное навсегда, а код можно посмотреть, форкнуть и улучшить.

По сути это бесплатный нативный аналог iStat Menus, но заточенный под одну задачу — температуру, и решающий её без лишнего веса.

Репозиторий: thermalbar

Если приложение оказалось полезным — звезда на GitHub помогает другим его найти. А если найдёте баг или захотите добавить функцию — issues и pull requests открыты.

macOS, Apple Silicon, разработка, Swift, open source, MacBook, температура, мониторинг, программирование, M4

44