feat(agent): слать загрузку оперативной памяти ключом M

Прошивка её пока не показывает - на 72x40 нет места под третий
показатель. Это намеренно: неизвестный ключ прошивка игнорирует, поэтому
агента можно обновлять независимо от плат.

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

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
oskarvitaliiandClaude Opus 5 committed 2026-09-17 19:04:11 +07:00
1 parent b15421305c
commit 4344fa8873
2 files changed
+24 -2

No files matched your search

+10 -1
View File
@@ -299,13 +299,22 @@ Start-ScheduledTask -TaskName 'CPU Temp Agent'
Агент шлёт плате по одной строке в секунду, в конце — перевод строки: Агент шлёт плате по одной строке в секунду, в конце — перевод строки:
``` ```
T=67.0;L=34 T=67.0;L=34;M=97
``` ```
| Ключ | Смысл | | Ключ | Смысл |
|---|---| |---|---|
| `T` | температура CPU Package, °C | | `T` | температура CPU Package, °C |
| `L` | общая загрузка CPU, % | | `L` | общая загрузка CPU, % |
| `M` | загрузка оперативной памяти, % |
Ключ `M` агент шлёт, а прошивка пока **не показывает** — на экране 72×40 нет
места для третьего показателя. Это и есть демонстрация расширяемости: агента
обновили, платы не трогали, ничего не сломалось.
Берётся он у железа с именем `Total Memory` — это физическая память. У соседнего
`Virtual Memory` датчик называется точно так же, но считает вместе с файлом
подкачки и показывает заниженную цифру.
Неизвестные ключи прошивка молча игнорирует, поэтому протокол расширяем: можно Неизвестные ключи прошивка молча игнорирует, поэтому протокол расширяем: можно
добавить, например, `G=` для видеокарты, не трогая уже прошитые платы. добавить, например, `G=` для видеокарты, не трогая уже прошитые платы.
+14 -1
View File
@@ -29,6 +29,7 @@ Add-Type -Path $LhmPath
$computer = New-Object LibreHardwareMonitor.Hardware.Computer $computer = New-Object LibreHardwareMonitor.Hardware.Computer
$computer.IsCpuEnabled = $true $computer.IsCpuEnabled = $true
$computer.IsMemoryEnabled = $true
$computer.Open() $computer.Open()
function Get-CpuStats { function Get-CpuStats {
@@ -36,10 +37,15 @@ function Get-CpuStats {
$temp = $null $temp = $null
$load = $null $load = $null
$mem = $null
foreach ($hw in $computer.Hardware) { foreach ($hw in $computer.Hardware) {
foreach ($s in $hw.Sensors) { foreach ($s in $hw.Sensors) {
if ($s.SensorType -eq 'Temperature' -and $s.Name -eq 'CPU Package') { $temp = $s.Value } if ($s.SensorType -eq 'Temperature' -and $s.Name -eq 'CPU Package') { $temp = $s.Value }
if ($s.SensorType -eq 'Load' -and $s.Name -eq 'CPU Total') { $load = $s.Value } if ($s.SensorType -eq 'Load' -and $s.Name -eq 'CPU Total') { $load = $s.Value }
# Имя железа проверяем обязательно: у "Virtual Memory" датчик зовётся
# точно так же, но считает физическую память вместе с файлом подкачки
# и показывает заниженную цифру.
if ($hw.Name -eq 'Total Memory' -and $s.SensorType -eq 'Load' -and $s.Name -eq 'Memory') { $mem = $s.Value }
} }
} }
@@ -48,6 +54,7 @@ function Get-CpuStats {
return @{ return @{
Temp = $temp Temp = $temp
Load = $load Load = $load
Mem = $mem
} }
} }
@@ -73,7 +80,13 @@ function Assert-SensorsAvailable {
# Форматирование только через InvariantCulture: в русской локали вышло бы # Форматирование только через InvariantCulture: в русской локали вышло бы
# "T=67,0", и atof на плате прочитал бы 67, молча потеряв дробную часть. # "T=67,0", и atof на плате прочитал бы 67, молча потеряв дробную часть.
function Format-StatsLine($stats) { function Format-StatsLine($stats) {
return [string]::Format([cultureinfo]::InvariantCulture, 'T={0:F1};L={1}', [double]$stats.Temp, [int][math]::Round([double]$stats.Load)) $line = [string]::Format([cultureinfo]::InvariantCulture, 'T={0:F1};L={1}', [double]$stats.Temp, [int][math]::Round([double]$stats.Load))
# Память необязательна: если датчика нет, строка просто идёт без ключа M,
# и прошивка этого не заметит.
if ($null -ne $stats.Mem) {
$line += [string]::Format([cultureinfo]::InvariantCulture, ';M={0}', [int][math]::Round([double]$stats.Mem))
}
return $line
} }
# Номер порта не хардкодим: он меняется при перетыкании в другой разъём. # Номер порта не хардкодим: он меняется при перетыкании в другой разъём.