Ein universelles Script zur Anbindung einer UPS USV an IP-Symcon

Hi,

es gibt ja diverse Möglichkeiten, um die Betriebsdaten einer USV in IP-Symcon zu bekommen. Bei Windows Systemen wird meistens dazu die proprietäre Software des Herstellers verwendet und mit irgendwelchen Klimmzügen die benötigten Daten aus Logeinträgen, Datenbankfiles oder der Registry ausgelesen und an IPS übermittelt. Die „PowerChute“ Software von APC wäre hier als Beispiel genannt.

Nachdem ich meine APC CS 650 per USB an einen Windows 2012 R2 Server angeschlossen habe, hat dieser die nativen Microsoft Treiber für die UPS installiert. Im Geräte Manager fand sich danach unter „Akkus“ ein neues „HID-USV-Akku“ Gerät.

Also schnell ein Powershell Command-Fenster gestartet und „Get-WmiObject Win32_Battery“ eingegeben und voila:


PS C:\> Get-WmiObject Win32_Battery


__GENUS                     : 2
__CLASS                     : Win32_Battery
__SUPERCLASS                : CIM_Battery
__DYNASTY                   : CIM_ManagedSystemElement
__RELPATH                   : Win32_Battery.DeviceID="3B0746X67310  American Power ConversionBack-UPS CS 650
                              FW:817.v4.I USB FW:v4"
__PROPERTY_COUNT            : 33
__DERIVATION                : {CIM_Battery, CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER                    : ADKS01
__NAMESPACE                 : root\cimv2
__PATH                      : \\SERVER\root\cimv2:Win32_Battery.DeviceID="3B07xxxxx  American Power
                              ConversionBack-UPS CS 650 FW:817.v4.I USB FW:v4"
Availability                : 2
BatteryRechargeTime         :
BatteryStatus               : 2
Caption                     : Interner Akku
Chemistry                   : 3
ConfigManagerErrorCode      :
ConfigManagerUserConfig     :
CreationClassName           : Win32_Battery
Description                 : Interner Akku
DesignCapacity              :
DesignVoltage               : 13510
DeviceID                    : 3B07xxxx  American Power ConversionBack-UPS CS 650 FW:817.v4.I USB FW:v4
ErrorCleared                :
ErrorDescription            :
EstimatedChargeRemaining    : 100
EstimatedRunTime            : 25
ExpectedBatteryLife         :
ExpectedLife                :
FullChargeCapacity          :
InstallDate                 :
LastErrorCode               :
MaxRechargeTime             :
Name                        : Back-UPS CS 650 FW:817.v4.I USB FW:v4
PNPDeviceID                 :
PowerManagementCapabilities : {1}
PowerManagementSupported    : False
SmartBatteryVersion         :
Status                      : OK
StatusInfo                  :
SystemCreationClassName     : Win32_ComputerSystem
SystemName                  : SERVER
TimeOnBattery               :
TimeToFullCharge            :
PSComputerName              : SERVER

PS C:\>

WMI liefert mir alle Daten die ich brauche. Also habe ich mit Hilfe der PowerIPS.dll folgendes Powershell Script geschrieben:
(Die Variablensicht auf IPS Seite ist im Screenshot)


# Achtung Powershell kein PHP !!!
# Referenziere PowerIPS.dll und lade WF-Config aus PowerIPS.ini 
Add-Type -Path 'C:\PowerIPS\PowerIPS.dll'
$IPS = [PowerIPS]::Instance
$IPS.setWF_LoadIniFile("c:\PowerIPS\PowerIPS.ini")

# Hilfsfunktion um nur geänderte Werte an IPS zu senden
$OldValues = @{}
function Send2IPS ($VarID, $Value) {
	if($OldValues.get_Item($VarID) -ne $Value) { 
		$result = $IPS.SetValue($VarID, $Value)
		$OldValues.set_Item($VarID, $Value)
	}
}

#Hauptprogramm als Endlosschleife (Variablen IDs entsprechend anpassen)	
while($true) {
	$WMI = Get-WmiObject win32_battery
	Send2IPS 18892 $WMI.Availability
	Send2IPS 18847 $WMI.BatteryStatus
	Send2IPS 44503 ($WMI.DesignVoltage / 1000)
	Send2IPS 57737 $WMI.EstimatedChargeRemaining
	Send2IPS 20127 $WMI.EstimatedRunTime
	Send2IPS 58221 $WMI.Status
	$shutdown = $IPS.GetValueBoolean(32110)
	if($shutdown) { Stop-Computer }
	Sleep -Seconds 15
}	

Das Script prüft alle 15 Sekunden die Werte der USV und sendet bei einer Änderung ein JSON-RPC Request an IPS. IP-Symcon braucht dafür nicht auf der gleichen Maschine installiert sein.

Dieses Script richte ich dann mit taskschd.msc als ScheduledTask beim Systemstart ein. Als User nehme ich „System“ und setze die Checkbox „mit höchsten Privilegien ausführen“. Ohne dieses Setting könnte das Powershell Script ansonsten den Rechner nicht herunterfahren.

Mit der Variable „Shutdown“ steuere ich von IP-Symcon aus den Shutdown Zeitpunkt. Ich kann z.B. in IPS ein entsprechendes PHP Script anlegen, was diese „Shutdown“ Variable bei einer Batterieladung < 10% auf TRUE setzt.

Für die WMI Werte „Availability“ und „BatteryStatus“ findet man hier eine schöne Übersicht. Ich habe mir die Werte als Assoziation des entsprechenden Variablen Profil hinterlegt und fertig!

Das Script sollte auch für die Akkuüberwachung auf Notebooks funktionieren. Einfach mal mit dem Powershell Befehl „Get-WmiObject Win32_Battery“ testen, ob die Werte zur Verfügung stehen.

UPS1.JPG

UPS2.JPG