Files
Arduino/CPU_temp/agent
oskarvitaliiandClaude Opus 5 4344fa8873 feat(agent): слать загрузку оперативной памяти ключом M
Прошивка её пока не показывает - на 72x40 нет места под третий
показатель. Это намеренно: неизвестный ключ прошивка игнорирует, поэтому
агента можно обновлять независимо от плат.

Память берётся у железа с именем Total Memory - это физическая память.
У соседнего Virtual Memory датчик называется точно так же, но считает
вместе с файлом подкачки и показывает заниженную цифру: 87% против
фактических 97%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 19:04:11 +07:00
..

Агент CPU Temp

Читает температуру и загрузку процессора и раз в секунду отдаёт их плате ESP32-C3 по USB-COM строкой вида T=67.0;L=34.

Что нужно установить

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 -ExecutionPolicy Bypass -File "D:\Soft\Arduino\CPU_temp\agent\cpu_temp_agent.ps1" -Echo

Ключ -Echo печатает каждую отправленную строку — только для проверки.

При старте агент сам проверяет, доступна ли температура, и при отказе называет причину, а не крутит молча пустой цикл.

Автозапуск

Задание Планировщика CPU Temp Agent: триггер «при входе в систему», наивысшие права, скрытое окно.

Регистрация (из консоли администратора):

$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 нужен, иначе Планировщик убьёт агента через трое суток.

Удаление:

Unregister-ScheduledTask -TaskName 'CPU Temp Agent' -Confirm:$false

Перед заливкой прошивки — остановить агента

Плата прошивается через тот же COM-порт, по которому идут данные. Пока агент держит порт, заливка падает с PermissionError.

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, потеряв дробную часть.