feat(ups): monitorizare UPS pe serverul 36, in locul ViewPower

ViewPower nu putea dialoga cu acest UPS: 5777 de "QPI return(NAK" si zero
citiri reusite in fereastra 6-10 august, pentru ca UPS-ul vorbeste HID Power
Device standard, nu dialectul text Voltronic. Serviciile au fost dezactivate
pe 10.08.2026 la 22:34, lasand serverul fara nicio alertare 17 zile. Nici
inainte nu exista: emailReceivers = 0, iar excuteProgram era gol, deci Oracle
nu era oprit curat oricum.

UPS-ul comunica insa perfect cu Windows pe canalul HID - dovedit de perechile
de evenimente Kernel-Power 105 la panele reale din 2026.

Monitorul nou citeste GetSystemPowerStatus, acelasi semnal pe care il foloseste
Windows pentru propria actiune la baterie critica. Alerteaza pe email la
trecerea pe baterie, la revenirea curentului si cand UPS-ul nu mai comunica -
cazul care a trecut neobservat. Opreste curat listenerul, apoi instanta cu
shutdown immediate, apoi Windows-ul, inaintea pragului brutal de 20% al
Windows-ului.

Ruleaza ca task programat sub SYSTEM, cu AllowStartIfOnBatteries si
DontStopIfGoingOnBatteries - fara ele Windows ar fi oprit taskul exact cand
serverul trece pe baterie.

Validat pe 27.08.2026: citire, email, secventa de oprire in dry-run si
pierderea comunicatiei (alerta la exact 8 cicluri, apoi revenire). Pragurile
de 10 min / 35% sunt conservatoare, nu masurate - testul de autonomie reala
ramane de facut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RRyaDj39hPQ89SZS6URRpS
This commit is contained in:
Marius
2026-08-27 15:33:45 +03:00
parent 1e65805835
commit 9ba99eb9d1
8 changed files with 1205 additions and 2 deletions

View File

@@ -0,0 +1,65 @@
<#
.SYNOPSIS
Verifica alerta "UPS-ul nu mai comunica", dezactivand temporar dispozitivul de
baterie HID - echivalentul software al cablului USB scos din UPS.
.DESCRIPTION
Se ruleaza PE SERVER, ridicat (Administrator), cu monitorul deja pornit.
Reactivarea dispozitivului e in blocul finally, ca sa nu ramana oprit daca pica
sesiunea SSH sau se intrerupe scriptul. Testul e sigur cat timp serverul e pe
retea: fara baterie vizibila, monitorul intra pe ramura de "comunicatie pierduta"
si NU ia nicio decizie de oprire.
Asteptarea implicita e calculata din config.json: commsLostPolls * pollSeconds,
plus o marja.
.EXAMPLE
powershell -ExecutionPolicy Bypass -File .\test-comms-loss.ps1
#>
[CmdletBinding()]
param(
[string]$InstallDir = 'C:\ROMFAST\ups-monitor',
[int]$WaitSeconds = 0
)
Set-StrictMode -Version 2.0
$ErrorActionPreference = 'Stop'
$dev = Get-PnpDevice -Class Battery -ErrorAction SilentlyContinue |
Where-Object { $_.InstanceId -like 'HID\*' } | Select-Object -First 1
if (-not $dev) {
throw 'Nu am gasit niciun dispozitiv de baterie HID - UPS-ul nu e vazut de Windows nici acum.'
}
Write-Host "Dispozitiv tinta: $($dev.FriendlyName) [$($dev.InstanceId)]"
if ($WaitSeconds -le 0) {
$cfg = Get-Content -LiteralPath (Join-Path $InstallDir 'config.json') -Raw -Encoding UTF8 | ConvertFrom-Json
$WaitSeconds = ($cfg.commsLostPolls * $cfg.pollSeconds) + 45
}
Write-Host "Astept $WaitSeconds secunde cat dispozitivul e oprit."
try {
Disable-PnpDevice -InstanceId $dev.InstanceId -Confirm:$false -ErrorAction Stop
Start-Sleep -Seconds 3
$n = @(Get-CimInstance Win32_Battery -ErrorAction SilentlyContinue).Count
Write-Host "dezactivat : $((Get-PnpDevice -InstanceId $dev.InstanceId).Status) | instante Win32_Battery = $n"
Start-Sleep -Seconds $WaitSeconds
} finally {
Enable-PnpDevice -InstanceId $dev.InstanceId -Confirm:$false -ErrorAction SilentlyContinue
Start-Sleep -Seconds 10
$n = @(Get-CimInstance Win32_Battery -ErrorAction SilentlyContinue).Count
Write-Host "reactivat : $((Get-PnpDevice -InstanceId $dev.InstanceId).Status) | instante Win32_Battery = $n"
if ($n -lt 1) {
Write-Warning 'UPS-ul NU a revenit in Win32_Battery. Verifica Device Manager -> Batteries inainte de a pleca.'
}
}
Start-Sleep -Seconds 45
Write-Host ''
Write-Host '--- ultimele linii de log ---'
Get-Content (Join-Path $InstallDir ('log\ups-monitor-{0}.log' -f (Get-Date -Format 'yyyy-MM'))) -Tail 12
Write-Host ''
Write-Host 'Asteptat: o linie ALERT "UPS-ul nu mai este vazut de Windows", un email trimis,'
Write-Host 'apoi "Comunicatia cu UPS-ul a revenit" si al doilea email.'