Get-VEDevices.ps1
|
function Get-VEDevices { <# .SYNOPSIS Return the device list from a site .DESCRIPTION Return the device list from a site .INPUTS The VE site object can be piped to the function .EXAMPLE $VESite | Get-VEDevices Example of how to get the devices list from a site using the VRM API .NOTES Author: Decembry Quentin #> [CmdletBinding(DefaultParameterSetName='Object')] [OutputType([PSCustomObject])] [Alias()] param( # The VE session # Default: the default VE session [Parameter(Mandatory=$false)] [PSTypeName('VictronEnergy.Session')] $Session = $Script:VE_Session, # The VE site [Parameter(Mandatory=$true,ValueFromPipeline=$true,ParameterSetName='Object')] [PSTypeName('VictronEnergy.Site')] $Site, # The VE site id [Parameter(Mandatory=$true,ParameterSetName='Property')] [String] $SiteId, # Switch to return only the unconfigured devices [Parameter(Mandatory=$false)] [Switch] $UnconfiguredDevices ) begin { if ($PSBoundParameters['Debug']) { $DebugPreference = 'Continue' } if ($MyInvocation.MyCommand.ModuleName) { $Private:ThisFunction = '{0}::{1}' -f $MyInvocation.MyCommand.ModuleName, $MyInvocation.MyCommand.Name } else { $Private:ThisFunction = '{0}::{1}' -f (Get-PSCallStack)[0].ScriptName, $MyInvocation.MyCommand.Name } Write-Debug "[$Private:ThisFunction] Begin" } process { Write-Debug "[$Private:ThisFunction] Process site $Site" switch ($PSCmdlet.ParameterSetName) { 'Object' { $SiteId = $Site.IdSite } 'Property' { # Nothing } default { thrown "Unsupported parameter set name '$_'" } } if (!$Session.Token) { throw 'Unable to list devices without a session token' } if (!$SiteId) { throw 'Unable to list devices without a site id' } $Uri = $Script:VE_VrmApiBaseUri + ('installations/{0}/system-overview' -f $SiteId) $Headers = @{ 'X-Authorization' = 'Bearer {0}' -f $Session.Token } try { Write-Debug "[$Private:ThisFunction] Send request to '$Uri'" $WebRequest = Invoke-WebRequest -UseBasicParsing -Uri $Uri -Method GET -Headers $Headers -ErrorAction Stop $Json = ConvertFrom-Json -InputObject $WebRequest.Content -ErrorAction Stop Write-Debug "[$Private:ThisFunction] Response validation" if ($Json.success -isnot [Boolean]) { throw "Invalid content received from server" } if (!$Json.success) { throw "Error occured" } Write-Debug "[$Private:ThisFunction] Processing records" if ($UnconfiguredDevices) { Write-Debug "[$Private:ThisFunction] Return unconfigured devices raw object" Write-Output -NoEnumerate -InputObject $Json.Records.Unconfigured_Devices break } if ($Json.Records.Unconfigured_Devices) { Write-Warning "[$Private:ThisFunction] Unconfigured devices found. Use -UnconfiguredDevices to get the raw object." } foreach ($Record in $Json.Records.Devices) { Write-Debug "[$Private:ThisFunction] Record validation" if (!$Record.Name) { throw "Invalid response from server (missing name)" } if (!$Record.Class) { throw "Invalid response from server (missing class)" } if ($Record.idSite -ne $SiteId) { throw "Unexpected idSite for record (mismatch with site object)" } Write-Debug "[$Private:ThisFunction] Create device object from record" $Hashtable = ConvertTo-Hashtable -InputObject $Record $Hashtable.PSTypeName = 'VictronEnergy.Device' $VEObject = [PSCustomObject] $Hashtable $VEObject | Add-Member -MemberType ScriptMethod -Name ToString -Value { if ($this.machineSerialNumber) { '{0} ({1})' -f $this.productName, $this.machineSerialNumber } else { $this.productName } } -Force Write-Debug "[$Private:ThisFunction] Return device object" Write-Output -NoEnumerate -InputObject $VEObject } } catch { $_ | ForEach-Object { Write-Error $_ } } } end { Write-Debug "[$Private:ThisFunction] End" } } # SIG # Begin signature block # MIIIbQYJKoZIhvcNAQcCoIIIXjCCCFoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU8eRZjlhtu9Py9ViyREHAa2xv # 3FGgggX4MIICYjCCAgigAwIBAgITXwAAAAITcsrrTJecaQAAAAAAAjAKBggqhkjO # PQQDAjAkMQswCQYDVQQGEwJCRTEVMBMGA1UEAxMMSG9tZSBSb290IENBMB4XDTIy # MDUwNTE0MDMxOFoXDTMyMDUwNTE0MTMxOFowJzELMAkGA1UEBhMCQkUxGDAWBgNV # BAMTD0hvbWUgSXNzdWluZyBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDOT # aIIU+QU7LfsmyPqGkCf53SrJuaBPpb5iVILCvG3cQxL6vgIZaGRaKlzYO+lq3CnN # b4rtJW2d7rlTeehXtpWjggEUMIIBEDAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4E # FgQUYf1/nMEp3Df+Nzi+Hvk7FymPsrMwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD # AEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUfSS6 # P6qin/3ibmvelGJQhV1r1VgwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL3BraS5x # ZWRpbnV4LmJlL0hvbWUlMjBSb290JTIwQ0EuY3JsMEYGCCsGAQUFBwEBBDowODA2 # BggrBgEFBQcwAoYqaHR0cDovL3BraS5xZWRpbnV4LmJlL0hvbWUlMjBSb290JTIw # Q0EuY3J0MAoGCCqGSM49BAMCA0gAMEUCIERRzfMu3vx9vb+Apud4sDkOEKhKrCEl # gSsedbjZRJ+YAiEA8BBaOqhnbnsUBIX2nty77euunwoAHrCuWzab5xJiy0UwggOO # MIIDM6ADAgECAhNRAAAAMJpCm89a8zgYAAAAAAAwMAoGCCqGSM49BAMCMCcxCzAJ # BgNVBAYTAkJFMRgwFgYDVQQDEw9Ib21lIElzc3VpbmcgQ0EwHhcNMjIwNzExMDc0 # NzQ3WhcNMjQwNzExMDc1NzQ3WjAbMRkwFwYDVQQDExBEZWNlbWJyeSBRdWVudGlu # MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjALWtmJ1AQG77y9rUBbT # HXR9FZokTP01bBWfNzk4Kenr/Xpm7Jt09PqLoNS8ToWWKRz9EkM+jg7lnLljWKcO # G+fT1TbaEwxOpncugnbrioQQonbdWpyn0P7PxlqjUQdWd5Z7xQ0Z8RO3vvERWtDA # L9QH0VBHNK4WqdWh3ElV6ogJUsy5hYxVTIU0K5VEYkIT4qvqq0RdajKavGWIr57R # EsYv52Jcyh9FNgZKGdu9NwSKZUvkwHxGsI8zmwfP1I6QRkzsqPXlpk7A8NTD3+h+ # 4Y5AprRFyAWrVNYH+UQQe2D/PjjbKtfsU9xzG9EnqJF09pVRchapis+8DbfWnoC8 # iQIDAQABo4IBfTCCAXkwOgYJKwYBBAGCNxUHBC0wKwYjKwYBBAGCNxUIhorlOcPr # DIadiwndkzuHjPAAPqb1CYWVxXgCAWQCAQowEwYDVR0lBAwwCgYIKwYBBQUHAwMw # DgYDVR0PAQH/BAQDAgeAMBsGCSsGAQQBgjcVCgQOMAwwCgYIKwYBBQUHAwMwHQYD # VR0OBBYEFAkUh200U2U2epAoy2ZvT7nwAYGBMB8GA1UdIwQYMBaAFGH9f5zBKdw3 # /jc4vh75Oxcpj7KzMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9wa2kucWVkaW51 # eC5iZS9Ib21lJTIwSXNzdWluZyUyMENBLmNybDBJBggrBgEFBQcBAQQ9MDswOQYI # KwYBBQUHMAKGLWh0dHA6Ly9wa2kucWVkaW51eC5iZS9Ib21lJTIwSXNzdWluZyUy # MENBLmNydDAuBgNVHREEJzAloCMGCisGAQQBgjcUAgOgFQwTRGVjZW1icnkuUUBo # b21lLmxhbjAKBggqhkjOPQQDAgNJADBGAiEAh39vHCgqIDL4XazyHPiChMbu0by+ # aFP7rdzlJmM0K6ACIQCaP4CXolxlzdfkJsoIoDIJUrunYIlZ0yxs9OSnG1qmCjGC # Ad8wggHbAgEBMD4wJzELMAkGA1UEBhMCQkUxGDAWBgNVBAMTD0hvbWUgSXNzdWlu # ZyBDQQITUQAAADCaQpvPWvM4GAAAAAAAMDAJBgUrDgMCGgUAoHgwGAYKKwYBBAGC # NwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUWFwhlzGd # FQQ++5AgxWuHkBg6mxEwDQYJKoZIhvcNAQEBBQAEggEAJ2O4oEURjE3+LjgEQ6t2 # Rz2lee2wrIFA0f7aZZmb6s3MXL6EOwBEXEOVFYZi4PuW4CqM0t0rApxKNG0imJGC # xP19fhKGdyqzNMJa12oAVVCC2jv3HIJO8/2Op0p1dWA9hzu8aj7Gq/znyptPsTKU # FfzWPKcRCE6gUolxhXOW2TE6WnjVgvbzvVsD6lU4hiA6z7ramLHpdTL2z6JEM2NL # IE7dukzcuZr6LWjN19gNENQfyJac9uqAM1TcYO2OApeE36CEDKgIJLc1i7QYlupw # do3t0j5+7+ORWtN4yuod6pY9k9Ue7iTBs1ezfMv/XqpkqE34QihYZY9NnRAl/MNJ # QQ== # SIG # End signature block |