# PRTG Custom Sensor to read Edimax SP2101W PowerPlug # # 20150120 Ver 1.0 Initial Version param ( [string]$deviceURL="http://192.168.178.62:10000/smartplug.cgi", [string]$deviceUser = "admin", [string]$devicepass = "1234" ) #set-psdebug -strict # enforce strict variable checking remove für PRTG write-host "Start prtg-sp2101w" (get-date).tostring() write-host "Initializing PRTG Result variable" [string]$prtgresult="" $prtgresult+="`r`n" $prtgresult+="`r`n" [bool]$errorfound = $false write-host ("Parametercheck: sp2101w URL :" + $deviceURL) write-host ("Parametercheck: sp2101w User :" + $deviceUser) write-host ("Parametercheck: sp2101w pass :" + $devicepass) [xml]$sp2101wdata ="" $error.clear() try { write-host (" Loading " + $deviceURL) #[System.Security.SecureString]$SecurePass = ConvertTo-SecureString -String $devicepass -AsPlainText -Force #$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($deviceUser, $SecurePass) # Webrequest hat das Problem mit partiellen paketen beim SP2101W #$sp2101wdata = Invoke-RestMethod ` # -Method post ` # -credential $Cred ` # -Uri $deviceURL ` # -Body '' #Methode mit WebClient - geht nicht das Body nach einem 100 continue gesendet würde, was der sp2101w nicht macht #$webclient = new-object System.Net.WebClient #$webclient.Credentials = New-Object System.Net.NetworkCredential($deviceUser,$devicepass) #[xml]$sp2101wdata = $webclient.UploadString($deviceURL, '') #Anfrage per System.Net.HttpWebRequest und der Option $HttpWebRequest.ServicePoint.Expect100Continue=$false $HttpWebRequest=[System.Net.HttpWebRequest]::Create($deviceURL); $HttpWebRequest.method= "POST" $HttpWebRequest.Credentials = New-Object System.Net.NetworkCredential($deviceUser,$devicepass) # Body vorbereiten und ablegen. $requestdata = [System.Text.Encoding]::ASCII.GetBytes('') $requestStream = $HttpWebRequest.GetRequestStream(); $requestStream.Write($requestdata, 0, $requestdata.Length); $requestStream.Close(); $HttpWebRequest.ContentType = "application/x-www-form-URLencoded"; #$HttpWebRequest.ContentLength = $requestdata.Length; # entfällt da durch schreiben schon gesetzt ? $HttpWebRequest.ServicePoint.Expect100Continue=$false $HttpWebRequest.Timeout = 10000 # default is 100000ms = 100sec. reduce to 10sec #$HttpWebRequest.PreAuthenticate=$true $responsedata = $HttpWebRequest.getresponse(); if ($HttpWebRequest.HaveResponse) { $responseStream = $responsedata.GetResponseStream(); $StreamReader = new-object System.IO.StreamReader($responseStream, [System.Text.Encoding]::Default); [string]$pageContent = $StreamReader.ReadToEnd(); [xml]$sp2101wdata = $pageContent $StreamReader.Close(); $responseStream.Close(); $responsedata.Close(); } else { write-host "No data Received via HTTP" $prtgresult+=" 2`r`n" $prtgresult+=" No data Received via HTTP`r`n" $errorfound = $true } } catch { write-host "Unable to retrieve data via HTTP" $prtgresult+=" 2`r`n" $prtgresult+=" Unable to get HTML-Data`r`n" $errorfound = $true } write-host "RawData" write-host "ToggleTime:"$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.LastToggleTime' write-host "Current :"$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowCurrent' write-host "Power :"$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowPower' write-host "Day :"$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Day' write-host "Week :"$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Week' write-host "Month :"$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Month' write-host " Processing Datapoint Device.System.Power.NowCurrent:" $sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowCurrent' $prtgresult+=" `r`n" $prtgresult+=" NowCurrent`r`n" $prtgresult+=" A`r`n" $prtgresult+=" "+$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowCurrent'+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" write-host " Processing Datapoint Device.System.Power.NowPower:" $sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowPower' $prtgresult+=" `r`n" $prtgresult+=" NowPower`r`n" $prtgresult+=" W`r`n" $prtgresult+=" "+$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowPower'+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" write-host " Processing Datapoint Device.System.Power.NowEnergy.Day:" $sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Day' $prtgresult+=" `r`n" $prtgresult+=" Day`r`n" $prtgresult+=" kWh`r`n" $prtgresult+=" "+$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Day'+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" write-host " Processing Datapoint Device.System.Power.NowEnergy.Week:" $sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Week' $prtgresult+=" `r`n" $prtgresult+=" Week`r`n" $prtgresult+=" kWh`r`n" $prtgresult+=" "+$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Week'+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" write-host " Processing Datapoint Device.System.Power.NowEnergy.Month:" $sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Month' $prtgresult+=" `r`n" $prtgresult+=" Month`r`n" $prtgresult+=" kWh`r`n" $prtgresult+=" "+$sp2101wdata.SMARTPLUG.cmd.now_power.'Device.System.Power.NowEnergy.Month'+"`r`n" $prtgresult+=" 1`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+="" 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 }