New-VESession.ps1

function New-VESession {
    <#
        .SYNOPSIS
            Create a new session connected to the Victron Energy API
        .DESCRIPTION
            Long description
        .INPUTS
            No object can be piped to the function
        .EXAMPLE
            New-VESession
            Example of how to create a new session using the Victron Energy API
        .NOTES
            Author: Decembry Quentin
    #>

    [CmdletBinding(DefaultParameterSetName='Login')]
    [OutputType([PSCustomObject])]
    [Alias()]
    param(
        # The VRM username
        [Parameter(Mandatory=$true,ParameterSetName='Login')] [String] $Username,
        
        # The VRM password
        # Default: 1
        [Parameter(Mandatory=$false,ParameterSetName='Login')] [System.Security.SecureString] $SecureString,
        
        # Set the SMS token if SMS authentication token is required
        [Parameter(Mandatory=$false,ParameterSetName='Login')] [String] $SmsToken,
        
        # Set this session as default
        [Parameter(Mandatory=$false,ParameterSetName='Demo')] [Switch] $Demo,
        
        # Set this session as default
        [Parameter(Mandatory=$false)] [Switch] $AsDefault
    )

    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"
        
        if ($AsDefault) {
            Write-Debug "[$Private:ThisFunction] Remove default session"
            $Script:VE_Session = $null
        }
        
        if ($Demo) {
            Write-Debug "[$Private:ThisFunction] Sign in as 'Demo'"
            $Uri = $Script:VE_VrmApiBaseUri + 'auth/loginAsDemo'
            $Params = @{}
        } else {
            Write-Debug "[$Private:ThisFunction] Sign in as '$Username'"
            if (!$SecureString) {
                $SecureString = Read-Host -Prompt 'Enter your VRM password' -AsSecureString
            }
            $Uri = $Script:VE_VrmApiBaseUri + 'auth/login'
            $Params = @{
                username = $Username
                password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString))
            }
            
            if ($SmsToken) {
                $Params.SmsToken = $SmsToken
            }
        }
        
        $Body = ConvertTo-Json -InputObject $Params -Compress
        
        try {
            Write-Debug "[$Private:ThisFunction] Send request to '$Uri'"
            $WebRequest = Invoke-WebRequest -UseBasicParsing -Uri $Uri -Method POST -Body $Body -ErrorAction Stop
            $Json = ConvertFrom-Json -InputObject $WebRequest.Content -ErrorAction Stop
            $Hashtable = ConvertTo-Hashtable -InputObject $Json
            
            Write-Debug "[$Private:ThisFunction] Response validation"
            if (!$Hashtable.token) {
                throw "Invalid response from server (missing token)"
            }
            
            if ($Demo) {
                $Hashtable.IdUser = 22
                $Hashtable.Username = 'Demo'
            } elseif (!$Hashtable.IdUser) {
                throw "Invalid response from server (missing idUser)"
            } else {
                $Hashtable.Username = $Username
            }
            
            
            Write-Debug "[$Private:ThisFunction] Create session object from reply"
            $Hashtable.PSTypeName = 'VictronEnergy.Session'
            $VEObject = [PSCustomObject] $Hashtable
            
            if ($AsDefault) {
                Write-Debug "[$Private:ThisFunction] Set current session as default"
                $Script:VE_Session = $VEObject
            }
            
            Write-Debug "[$Private:ThisFunction] Return session object"
            Write-Output -NoEnumerate -InputObject $VEObject
        } catch {
            $_ | ForEach-Object {
                Write-Error $_
            }
        }
     }
    
    end {
        Write-Debug "[$Private:ThisFunction] End"
    }
}

# SIG # Begin signature block
# MIIIbQYJKoZIhvcNAQcCoIIIXjCCCFoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUALO6RzWAEQLC2ooPOBQvuAiE
# 2FKgggX4MIICYjCCAgigAwIBAgITXwAAAAITcsrrTJecaQAAAAAAAjAKBggqhkjO
# 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
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUwzHzMwN1
# CYZpsNFc/fECskg5eV4wDQYJKoZIhvcNAQEBBQAEggEAiIAgrSWLYExt5pAYnkm5
# O3cJXD0eBgHXeUJCio9PPaGGb+GaDzCnz6ssqMuYioYafIQkxBw7GJfM63L4CckM
# aii6vre4pFgGEeIVzoJ+jDVy6veOXk8gCn1os+PkySd6iBQqaQom9IgLpcY5SZvU
# dXpTPf7bEGaAcPAjK1Ss0W2qYMpZmpLpqUKwvyTvNwkty4FAfwlE4SqPIIIyKHq4
# P2dAuPrngOv3fImbGFX/cb5a8GTQUKBWlsg6I1CbVQ0u9XhHP+0YlR0GYdWfHIQX
# if3W6xTZDPlQETrQpNTyhX6+PTFXhNWMiwOZO0gHTDEHJ0UjNc6NpD1IKwkJA5LY
# dA==
# SIG # End signature block