<# Skriven av Markus Jakobsson 2014-12-27 www.automatiserar.se Syftet är att hämta ut all enheter ur veran och exponera dessa som objekt i powershell. Send-MJ-Speak - ger möjlighet att skicka meddelanden som ljud. #> ################################################################## Send-MJ-Speak function Send-MJ-Speak { [cmdletbinding()] param( [string]$message = "No information given!", [int]$SoundVolume = 100 # hur högt ska de låta? 0 - 100 ) Add-Type -AssemblyName System.speech $prata = New-Object System.Speech.Synthesis.SpeechSynthesizer $prata.Volume = $SoundVolume $prata.Speak($message) } ################################################################## Function get-MJ-VeraStatus { [cmdletbinding()] param( [string]$veraIP = "Vera", # ange din vera controllers ip eller namn [int]$FindThisDevice # ange detta om du vill få fram ett enda device. ) # Namnsättning på Enheter $SensorNameZWaveNetwork1 = "Z-wave Controller" $SensorNameSceneController1 = "Scene Controller" $SensorNameSwitchPower1 = "PowerPlugg" $SensorNameCamera1 = "Kamera" $SensorNameWOL1 = "Wake On Lan" $SensorNameDataMine1 = "Data Mine" $SensorNameLightSensor1 = "Ljus Sensor" $SensorNameSecuritySensor1 = "Säkerhetsbrytare" $SensorNameTemperatureSensor1 = "Temperaturgivare" $SensorNameHumiditySensor1 = "Luftfuktighetsgivare" $SensorNameHaDevice1 = "HaDevice1" $SensorNamePingSensor1 = "Ping Sensor" $SensorNameVSwitch1 = "Virtuell Knapp" function Speak-MJ-VeraInfo { [cmdletbinding()] param( [string]$message = "fick ingen info!" ) Add-Type -AssemblyName System.speech $prata = New-Object System.Speech.Synthesis.SpeechSynthesizer $prata.Speak($message) } # slut på namnsättning: function UnixTime-TillNormaltid{ [cmdletbinding()] param( $Unuxtid # ange ditt unix datum ) $origin = New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0 $origin.AddSeconds($Unuxtid) } # end UnixTime-TillNormalTid # hämtar ut rum och ID. Function GetAllVeraNames { # Hämtar in informationen $veraJsonData = ConvertFrom-Json (Invoke-WebRequest -Uri "http://$($veraIP):3480/data_request?id=sdata").content $veraJsonData } # skapar ett objekt av varje enhet: function Device-ToObject { [cmdletbinding()] param( [object]$CurrentDevice # ett objekt som ska översättas till ett Powershell Objekt. ) begin{} process { Write-Verbose "[Device-ToObject] $Tempdevice" $PSVeraDevice = New-Object -TypeName psobject $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsID" -Value $CurrentDevice.ID $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Name" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Room" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "RoomID" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Status" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Target" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Lastupdated" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "CurrentLevel" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "KWH" -Value "" # power plugg $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "KWHReading" -Value "" # power plugg $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Watts" -Value "" # power plugg $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "CurrentTemperature" -Value "" # power plugg $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Armed" -Value "" # Dörr brytare $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "Tripped" -Value "" # Dörr brytare / ping sensor / rörelse vakt $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "ArmedTripped" -Value "" # Dörr brytare $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "LastTrip" -Value "" # Dörr brytare $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "BatteryLevel" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "BatteryDate" -Value "" $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "IPPeriod" -Value "" # ping sensor $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "IPAddress" -Value "" # ping sensor $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "IPInvert" -Value "" # ping sensor $DeviceType = ($($CurrentDevice.states.state).service | Group-Object | Select-Object -ExpandProperty name)[0].split(':')[3] #$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $DeviceType $FixedDevice = $false # Detta kontrollerar om jag har hunnit lägga upp översättningen av objeketet. switch ($DeviceType) { 'ZWaveNetwork1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameZWaveNetwork1 ; $FixedDevice = $false;break} 'SceneController1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameSceneController1 ; $FixedDevice = $false;break} 'SwitchPower1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameSwitchPower1 ; $FixedDevice = $true;break} 'Camera1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameCamera1 ; $FixedDevice = $false;break} 'WOL1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameWOL1 ; $FixedDevice = $false;break} 'DataMine1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameDataMine1 ; $FixedDevice = $false;break} 'LightSensor1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameLightSensor1 ; $FixedDevice = $true;break} 'SecuritySensor1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameSecuritySensor1 ; $FixedDevice = $true;break} 'TemperatureSensor1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameTemperatureSensor1 ; $FixedDevice = $true;break} 'HumiditySensor1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameHumiditySensor1 ; $FixedDevice = $true;break} 'HaDevice1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameHaDevice1 ; $FixedDevice = $false;break} 'PingSensor1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNamePingSensor1 ; $FixedDevice = $true;break} 'VSwitch1' {$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $SensorNameVSwitch1 ; $FixedDevice = $true;break} Default {Write-Warning "[Device-ToObject][Switch] Enheten $DeviceType är inte upplagd!";$PSVeraDevice | Add-Member -MemberType NoteProperty -Name "EnhetsTyp" -Value $DeviceType} } $PSVeraDevice | Add-Member -MemberType NoteProperty -Name "ObjektiferadEnhet" -Value $FixedDevice Write-Verbose "[Device-ToObject] Översätter enheten till ett objekt" # följande är av enhetstypen strömbrytare. if ($DeviceType -eq "SwitchPower1"){ # ta med # SwitchPower1 # EnergyMetering1 ( detta finns bara om enheten stödjer detta ) $PSVeraDevice.Status = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:upnp-org:serviceId:SwitchPower1" -and $_.variable -eq "Status"}).value $PSVeraDevice.Target = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:upnp-org:serviceId:SwitchPower1" -and $_.variable -eq "Target"}).value $PSVeraDevice.KWH = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:EnergyMetering1" -and $_.variable -eq "KWH"}).value $PSVeraDevice.KWHReading = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:EnergyMetering1" -and $_.variable -eq "KWHReading"}).value $PSVeraDevice.Watts = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:EnergyMetering1" -and $_.variable -eq "Watts"}).value #$CurrentDevice.states.state } # slut SwitchPower1 if ($DeviceType -eq "LightSensor1"){ $PSVeraDevice.CurrentLevel = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:LightSensor1" -and $_.variable -eq "CurrentLevel"}).value # man kan ha flera enheter här! $PSVeraDevice.Lastupdated = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:HaDevice1" -and $_.variable -eq "LastUpdate"}).value } # end LightSensor1 if ($DeviceType -eq "TemperatureSensor1"){ $PSVeraDevice.CurrentTemperature = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:upnp-org:serviceId:TemperatureSensor1" -and $_.variable -eq "CurrentTemperature"}).value } # end TemperatureSensor1 if ($DeviceType -eq "SecuritySensor1"){ $PSVeraDevice.Armed = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "Armed"}).value $PSVeraDevice.Tripped = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "Tripped"}).value $PSVeraDevice.ArmedTripped = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "ArmedTripped"}).value $PSVeraDevice.LastTrip = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "LastTrip"}).value $PSVeraDevice.BatteryDate = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:HaDevice1" -and $_.variable -eq "BatteryDate"}).value $PSVeraDevice.BatteryLevel = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:HaDevice1" -and $_.variable -eq "BatteryLevel"}).value } # end SecuritySensor1 if ($DeviceType -eq "VSwitch1"){ $PSVeraDevice.Status = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:upnp-org:serviceId:VSwitch1" -and $_.variable -eq "Status"}).value } # end VSwitch1 if ($DeviceType -eq "HumiditySensor1"){ $PSVeraDevice.CurrentLevel = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:HumiditySensor1" -and $_.variable -eq "CurrentLevel"}).value # man kan ha flera enheter här! } # end HumiditySensor1 if ($DeviceType -eq "PingSensor1"){ #$CurrentDevice.states.state $PSVeraDevice.IPPeriod = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:demo-ted-striker:serviceId:PingSensor1" -and $_.variable -eq "Period"}).value # man kan ha flera enheter här! $PSVeraDevice.IPAddress = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:demo-ted-striker:serviceId:PingSensor1" -and $_.variable -eq "Address"}).value # man kan ha flera enheter här! $PSVeraDevice.IPInvert = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:demo-ted-striker:serviceId:PingSensor1" -and $_.variable -eq "Invert"}).value # man kan ha flera enheter här! $PSVeraDevice.Tripped = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "Tripped"}).value # man kan ha flera enheter här! $PSVeraDevice.LastTrip = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "LastTrip"}).value # man kan ha flera enheter här! $PSVeraDevice.Armed = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "Armed"}).value # man kan ha flera enheter här! $PSVeraDevice.ArmedTripped = (($CurrentDevice.states.state) | Where-Object {$_.service -eq "urn:micasaverde-com:serviceId:SecuritySensor1" -and $_.variable -eq "ArmedTripped"}).value # man kan ha flera enheter här! } # end PingSensor1 } end { # översätter så man slipper Unix Time i powershell... if ($PSVeraDevice.LastTrip){ $PSVeraDevice.LastTrip = UnixTime-TillNormaltid -Unuxtid $PSVeraDevice.LastTrip } if ($PSVeraDevice.Lastupdated){ $PSVeraDevice.Lastupdated = UnixTime-TillNormaltid -Unuxtid $PSVeraDevice.Lastupdated } if ($PSVeraDevice.BatteryDate){ $PSVeraDevice.BatteryDate = UnixTime-TillNormaltid -Unuxtid $PSVeraDevice.BatteryDate } if ($PSVeraDevice.KWHReading){ $PSVeraDevice.KWHReading = UnixTime-TillNormaltid -Unuxtid $PSVeraDevice.KWHReading } # ta fram namn och rum till enheten $tmpdevicInfoname = $enhetsInfon.devices | Where-Object {$_.id -eq $PSVeraDevice.EnhetsID} $PSVeraDevice.name = $tmpdevicInfoname.name $PSVeraDevice.room = ($enhetsInfon.rooms | Where-Object {$_.id -eq $tmpdevicInfoname.room}).name $PSVeraDevice.roomID = $tmpdevicInfoname.room $PSVeraDevice } } # Verifierar så att enheten är aktiv. if (!(Test-Connection $veraIP -Count 1 -ErrorAction SilentlyContinue)){Write-Error "kunde ej hitta $veraIP"; break} else {Write-Verbose "[Test-Connection]`$VeraIP = svarar på ping"} $enhetsInfon = GetAllVeraNames # Hämtar in informationen $veraData = Invoke-WebRequest -Uri "http://$($veraIP):3480/data_request?id=status&output_format=xml" # fortsätter bara om man fick korrket web response. if ($veraData.StatusCode -eq 200){ # data som ska processas $WorkData = ([xml]$veraData.Content).root Write-Verbose "[Workdata] Antal Enheter hittade $($WorkData.devices.ChildNodes.count)" $WorkData.devices.device | ForEach-Object {Device-ToObject -CurrentDevice $_} } else { Write-Error "Felande status kod från webresponse!, fick inte status 200" } } # end Get-MJ-VeraStatus