# 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
}