Files
Arduino/CPU_temp/agent/README.md
T
oskarvitaliiandClaude Opus 5 f25f24b6c5 docs: привести README в соответствие с реализацией
Сверка документации с кодом выявила четыре расхождения, все появились
после вчерашней правки протокола:

- схема в шапке и пример вывода агента показывали строку без ключа M,
  хотя агент его шлёт: человек сверил бы свой вывод с образцом и решил,
  что у него что-то не так;
- в таблице состава не были упомянуты кнопка и выбор экрана;
- формулировка "короткое нажатие" подразумевала различие с длинным,
  которого в коде нет.

Все 16 констант из таблицы настроек сверены с config.h, поведенческие
утверждения - с кодом, расход прошивки подтверждён сборкой: 26% и 4%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 12:08:49 +07:00

87 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Агент 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`, потеряв дробную часть.