Connect-Twinkly.ps1

function Connect-Twinkly
{
    <#
    .Synopsis
        Connects to a Twinkly light controller.
    .Description
        Connects to a Twinkly light controller
    .Example
        Connect-Twinkly 192.168.0.144 -PassThru
    .Link
        Get-Twinkly

    #>

    [OutputType([Nullable], [PSObject])]
    param(
    # The IP Address for the Twinkly device. This can be discovered thru the phone user interface.
    [Parameter(Mandatory,Position=0,ValueFromPipelineByPropertyName)]
    [Alias('TwinklyIPAddress')]
    [IPAddress]
    $IPAddress,

    # If set, will output the connection information.
    [switch]
    $PassThru
    )

    begin {
        if ($home) {
            $lightScriptRoot = Join-Path $home -ChildPath LightScript
        }
    }

    process {
        #region Create a Login
        $twinklyLogin = Invoke-RestMethod -Uri "http://$IPAddress/xled/v1/login" -Method POST -Body (
            @{
                challenge=[Convert]::ToBase64String(@(foreach ($n in 1..32) {50..115 | Get-Random }))
            } | ConvertTo-Json
        )
        #endregion Create a Login


        if ($twinklyLogin) {
            #region Validate the Login
            $null = Invoke-RestMethod -Uri "http://$IPAddress/xled/v1/verify" -Headers @{
                "X-Auth-Token" = $twinklyLogin.authentication_token
            } -Method Post
            #endregion Validate the Login

            #region Get Device Information
            $twinklyDeviceInfo = Invoke-RestMethod -Uri "http://$IPAddress/xled/v1/gestalt"
            $twinklyDeviceInfo = $twinklyDeviceInfo |
                    Add-Member NoteProperty IPAddress $IPAddress -Force -PassThru |
                    Add-Member NoteProperty Authentication_Token $twinklyLogin.authentication_token -Force -PassThru |
                    Add-Member NoteProperty Authentication_ExpiresAt ([DateTime]::Now.AddSeconds($twinklyLogin.authentication_token_expires_in)) -Force -PassThru
            #endregion Get Device Information

            #region Save Device Information
            if ($home -and $twinklyDeviceInfo) {
                if (-not (Test-Path $lightScriptRoot)) {
                    $createLightScriptDir = New-Item -ItemType Directory -Path $lightScriptRoot
                    if (-not $createLightScriptDir) { return }
                }


                $twinklyDataFile = Join-Path $lightScriptRoot ".$($twinklyDeviceInfo.uuid).twinkly.clixml"

                $twinklyDeviceInfo |
                    Export-Clixml -Path $twinklyDataFile
            }
            #endregion Save Device Information
            if ($PassThru) {
                $twinklyDeviceInfo
            }
        }
    }
}