# PRTG Custom Sensor to read Pluggit Box # # 20150430 Ver 1.0 Initial Version # 20160107 Ver 2.0 Mehr sensoren, mehr formate param( [string] $remoteHost = "192.168.178.71", [int]$port = 502 ) # set-psdebug -strict # enforce strict variable checking function modbusread ([string]$remoteHost, [int]$port, [int]$startaddress,[int]$bytecount,[string]$targetformat,[string]$flipoption) { write-host "prtg-pluggit: Prepare request" [byte[]]$sendbuffer=00,110 # Transaction Identifier $sendbuffer+=00,00 #Protocol identifier $sendbuffer+=00,06 #Length $sendbuffer+=00 #Unit ID $sendbuffer+=03 #Function Read Holding Registers $sendbuffer+=[byte]([math]::Truncate(($startaddress -40001)/256)),([system.byte](($startaddress -40001)%256)) #Data of first register 40133-40001 = 132 $sendbuffer+=00,($bytecount) write-host "prtg-pluggit: Send request" $tcpclient = new-object System.Net.Sockets.TcpClient($remoteHost, $port) $netStream = $tcpclient.GetStream() $netStream.write($sendbuffer,0,$sendbuffer.length) start-sleep -milliseconds 50 write-host "prtg-pluggit: prepare Read of @($startaddress -40001) bytes" [byte[]]$recbuffer = new-object System.Byte[] ([int]($bytecount+9)) # +8 für ModbusTCP Header write-host "prtg-pluggit: Reading socket" $receivedbytes = $netStream.Read($recbuffer, 0, [int]($bytecount+9)); write-host "prtg-pluggit: Received Byes: $receivedbytes " $tcpclient.Close() $netStream.Close() $resultdata = $recbuffer[9..($recbuffer[8]+8)] if (($flipoption.tolower() -eq "reverse") -or ($flipoption.tolower() -eq "both")) { [array]::reverse($resultdata) } if (($resultdata.length%2 -eq 0) ` -and (($flipoption.tolower() -eq "flip") ` -or ($flipoption.tolower() -eq "both"))) { $resultdataflip = $resultdata.clone() # flip bytes für some actions for ($count=0; $count -lt $resultdata.length ;$count+=2) { $resultdataflip[$count] = $resultdata[$count+1] $resultdataflip[$count+1] = $resultdata[$count] } $resultdata = $resultdataflip } #write-host " Convertto" $targetformat.tolower() switch ($targetformat.tolower()) { "uint16" {[bitconverter]::ToUInt16($resultdata,0)} "int16" {[bitconverter]::ToInt16($resultdata,0)} "uint32" {[bitconverter]::ToUInt32($resultdata,0)} "int32" {[bitconverter]::ToInt32($resultdata,0)} "uint64" {[bitconverter]::ToUInt64($resultdata,0)} "int64" {[bitconverter]::ToInt64($resultdata,0)} "float" {[Math]::Round(([BitConverter]::ToSingle(($resultdata[1],$resultdata[0],$resultdata[3],$resultdata[2]),0)),1)} "float2" {[Math]::Round(([BitConverter]::ToSingle($resultdataflip,0)),1)} "time" {(get-date "1970-01-01 00:00:00").addseconds([bitconverter]::ToUInt32($resultdata,0))} "string" {[System.Text.Encoding]::ASCII.GetString($resultdata)} default {$resultdata} } } write-host "prtg-pluggit: Start Script" write-host "Initializing PRTG Result variable" [string]$prtgresult="" $prtgresult+="`r`n" $prtgresult+="`r`n" [bool]$errorfound = $false #$recbuffer = $recbuffer[9..($receivedbytes-10)] ##$recbuffer = $recbuffer[9..($recbuffer[8]+8)] #$recbuffer = $recbuffer[9..($recbuffer[8]+188)] try { $prtgresult+=" `r`n" $prtgresult+=" T1 Aussenluft`r`n" $prtgresult+=" Grad Celsius`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40133 4 float)+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" T2 Zuluft Raum`r`n" $prtgresult+=" Grad Celsius`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40135 4 float)+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" T3 Abluft Raum`r`n" $prtgresult+=" Grad Celsius`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40137 4 float)+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" T4 Fortluft nach aussen`r`n" $prtgresult+=" Grad Celsius`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40139 4 float)+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" FanSpeed`r`n" $prtgresult+=" Stufe`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40325 4 uint32 flip)+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Fan1 RPM`r`n" $prtgresult+=" RPM`r`n" $prtgresult+=" "+( modbusread $remoteHost $port 40101 4 float)+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Fan2 RPM`r`n" $prtgresult+=" RPM`r`n" $prtgresult+=" "+( modbusread $remoteHost $port 40103 4 float)+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Filter Days Remaining`r`n" $prtgresult+=" Days`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40555 4 uint32 flip)+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" OperationMode`r`n" $prtgresult+=" Mode`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40473 4 uint32 flip)+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" LastAlarm`r`n" $prtgresult+=" Level`r`n" $prtgresult+=" "+(modbusread $remoteHost $port 40517 4 uint32 flip)+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+="" } catch { write-host "Unable to Connect and retrieve data" $prtgresult+=" 2`r`n" $prtgresult+=" Unable to Connect and retrieve data`r`n" $errorfound = $true } if ($errorfound) { write-host "Error Found. Ending with EXIT Code" ([xml]$prtgresult).prtg.error } write-host "Sending PRTGRESULT to STDOUT" $prtgresult if ($errorfound) { exit ([xml]$prtgresult).prtg.error }