Сверка документации с кодом выявила четыре расхождения, все появились после вчерашней правки протокола: - схема в шапке и пример вывода агента показывали строку без ключа M, хотя агент его шлёт: человек сверил бы свой вывод с образцом и решил, что у него что-то не так; - в таблице состава не были упомянуты кнопка и выбор экрана; - формулировка "короткое нажатие" подразумевала различие с длинным, которого в коде нет. Все 16 констант из таблицы настроек сверены с config.h, поведенческие утверждения - с кодом, расход прошивки подтверждён сборкой: 26% и 4%. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
87 lines
4.6 KiB
Markdown
87 lines
4.6 KiB
Markdown
# Агент CPU Temp
|
||
|
||
Читает температуру и загрузку процессора и раз в секунду отдаёт их плате
|
||
ESP32-C3 по USB-COM строкой вида `T=67.0;L=34;M=97`.
|
||
|
||
## Что нужно установить
|
||
|
||
### 1. LibreHardwareMonitor
|
||
|
||
Скачать со <https://github.com/LibreHardwareMonitor/LibreHardwareMonitor/releases>
|
||
архив **`LibreHardwareMonitor.zip`** и распаковать в `D:\Soft\LibreHardwareMonitor`.
|
||
|
||
Не брать `LibreHardwareMonitor.NET.10.zip`: это сборка под .NET 10, а Windows
|
||
PowerShell 5.1 работает на .NET Framework и такую сборку не загрузит.
|
||
|
||
Само приложение запускать не нужно — используются только
|
||
`LibreHardwareMonitorLib.dll` и лежащий рядом `HidSharp.dll`.
|
||
|
||
### 2. Драйвер PawnIO
|
||
|
||
Скачать со <https://github.com/namazso/PawnIO.Setup/releases> файл
|
||
`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`, потеряв дробную часть.
|