# Агент CPU Temp Читает температуру и загрузку процессора и раз в секунду отдаёт их плате ESP32-C3 по USB-COM строкой вида `T=67.0;L=34;M=97`. ## Что нужно установить ### 1. LibreHardwareMonitor Скачать со архив **`LibreHardwareMonitor.zip`** и распаковать в `D:\Soft\LibreHardwareMonitor`. Не брать `LibreHardwareMonitor.NET.10.zip`: это сборка под .NET 10, а Windows PowerShell 5.1 работает на .NET Framework и такую сборку не загрузит. Само приложение запускать не нужно — используются только `LibreHardwareMonitorLib.dll` и лежащий рядом `HidSharp.dll`. ### 2. Драйвер PawnIO Скачать со файл `PawnIO_setup.exe` и запустить **без аргументов**: установщик не принимает никаких ключей, и на `/S` или `/quiet` отвечает кодом 87. Зачем: с версии 0.9.5 LibreHardwareMonitor читает MSR-регистры процессора через PawnIO, а не через WinRing0, и в архив с программой этот драйвер не входит. **Без PawnIO загрузка CPU читается, а все температуры пустые** — даже из консоли администратора. Выглядит как нехватка прав, но причина другая. ## Запуск вручную Нужны права администратора: без них драйвер не открывается. ```powershell powershell -ExecutionPolicy Bypass -File "D:\Soft\Arduino\CPU_temp\agent\cpu_temp_agent.ps1" -Echo ``` Ключ `-Echo` печатает каждую отправленную строку — только для проверки. При старте агент сам проверяет, доступна ли температура, и при отказе называет причину, а не крутит молча пустой цикл. ## Автозапуск Задание Планировщика `CPU Temp Agent`: триггер «при входе в систему», наивысшие права, скрытое окно. Регистрация (из консоли администратора): ```powershell $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "D:\Soft\Arduino\CPU_temp\agent\cpu_temp_agent.ps1"' $trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME $set = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit ([TimeSpan]::Zero) Register-ScheduledTask -TaskName 'CPU Temp Agent' -Action $action -Trigger $trigger -Settings $set -RunLevel Highest -Force ``` `-RunLevel Highest` обязателен. Нулевой `ExecutionTimeLimit` нужен, иначе Планировщик убьёт агента через трое суток. Удаление: ```powershell Unregister-ScheduledTask -TaskName 'CPU Temp Agent' -Confirm:$false ``` ## Перед заливкой прошивки — остановить агента Плата прошивается через тот же COM-порт, по которому идут данные. Пока агент держит порт, заливка падает с `PermissionError`. ```powershell Stop-ScheduledTask -TaskName 'CPU Temp Agent' ``` После заливки задание можно запустить снова: `Start-ScheduledTask -TaskName 'CPU Temp Agent'`. ## Замечания по коду - Файл `cpu_temp_agent.ps1` сохранён в **UTF-8 с BOM**. Без BOM PowerShell 5.1 читает его как ANSI, кириллица в комментариях превращается в мусор, и скрипт перестаёт разбираться с невнятными ошибками про скобки. - Номер COM-порта не задан жёстко: плата ищется по `VID_303A&PID_1001`, потому что номер меняется при перетыкании в другой разъём. - Числа форматируются через `InvariantCulture`: в русской локали иначе вышло бы `T=67,0`, и `atof` на плате прочитал бы `67`, потеряв дробную часть.