Homematic-CCU2.psm1

function Get-CCU2Version
{
[CmdletBinding()]
param(
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url
)
$method = "CCU.getVersion"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method;
            "params"= @{'_session_id_' = $session_id;
}
            "id" = 1 }| ConvertTo-Json -Compress
write-verbose "Calling method $method with $json"
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}


#CCU.restartSSHDaemon
function Restart-CCU2SSHDaemon
{
[CmdletBinding()]
param(
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url)
$method = "CCU.restartSSHDaemon"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method;
            "params"= @{'_session_id_' = $session_id;
}
            "id" = 1 }| ConvertTo-Json -Compress
write-verbose "Calling method $method with $json"
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}
function Get-CCU2SSHState
{
[CmdletBinding()]
param(
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url)
$method = "CCU.getSSHState"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method;
            "params"= @{'_session_id_' = $session_id;
}
            "id" = 1 }| ConvertTo-Json -Compress
write-verbose "Calling method $method with $json"
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}
#CCU.getStickyUnreachState


function Get-CCU2StickyUnreachState
{
    [CmdletBinding()]
    param(
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url)
$method = "CCU.StickyUnreachState"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method;
            "params"= @{'_session_id_' = $session_id;
}
            "id" = 1 }| ConvertTo-Json -Compress
write-verbose "Calling method $method with $json"      
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result 
}
function Get-CCU2Serialnumber {
    [CmdletBinding()]
    param(
        $session_id = $global:ccu2session,
        $ccu2url = $global:ccu2url)
    $method = "CCU.getSerial"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress
    write-verbose "Calling method $method with $json"
    (Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result 
}



function Get-CCU2DeviceDetails {
    [CmdletBinding()]
    param(
        $session_id = $global:ccu2session,
        $ccu2url = $global:ccu2url)
    $method = "Device.listAllDetail"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
            #'interface' = $interface
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress
    write-verbose "Calling method $method with $json"
    (Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result 
}


function Get-CCU2Interfaces {
    [CmdletBinding()]
    param(
        $session_id = $global:ccu2session,
        $ccu2url = $global:ccu2url)
    $method = "Interface.listInterfaces"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress

    write-verbose "Calling method $method with $json"
    (Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result 
}
#Device.get
function Get-CCU2Device
{
   [CmdletBinding()]
   param(
#[ValidateSet('BidCos-RF','HmIP-RF','VirtualDevices')]$interface = "HmIP-RF",
[Parameter(Mandatory = $true)]
#[ValidatePattern('[A-F,a-f,0-9]{14}')]
[string][alias('ID')]$Device_id,     
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url)
$method = "Device.get"
$Json = [ordered]@{   "jsonrpc" = "1.1"
           "method"= $method;
           "params"= @{'_session_id_' = $session_id;
           'id' = $Device_id}
           "id" = 1 }| ConvertTo-Json -Compress

write-verbose "Calling method $method with $json"
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}



#Device.listAll
function Get-CCU2ConfiguredDevices {
    [CmdletBinding()]
    param(
        $session_id = $global:ccu2session,
        $ccu2url = $global:ccu2url)
    $method = "Device.listAll"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress

    write-verbose "Calling method $method with $json"
    (Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}

#Interface.getDeviceDescription

function Get-CCU2DeviceDescription {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [ValidatePattern('[A-F,a-f,0-9]{14}')]
        [string][alias('device')]$address,        
        [ValidateSet('BidCos-RF', 'HmIP-RF', 'VirtualDevices')]$interface = "HmIP-RF",
        $session_id = $global:ccu2session,
        $ccu2url = $global:ccu2url)
    $method = "Interface.getDeviceDescription"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
            "interface"             = $interface;
            "address"               = $address
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress

    write-verbose "Calling method $method with $json"
    (Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result 
}

function Get-CCU2Devices
 {
    [CmdletBinding()]
    param(
[ValidateSet('BidCos-RF','HmIP-RF','VirtualDevices')]$interface = "HmIP-RF",
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url)
$method = "Interface.listDevices"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method;
            "params"= @{'_session_id_' = $session_id;
            'interface' = $interface}
            "id" = 1 }| ConvertTo-Json -Compress

write-verbose "Calling method $method with $json"
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result 
}

function Get-CCU2DeviceFirmwareState
{
    [CmdletBinding()]
    param(
[ValidateSet('BidCos-RF','HmIP-RF','VirtualDevices')]$interface = "HmIP-RF",
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url)
$method = "Interface.listDevices"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method;
            "params"= @{'_session_id_' = $session_id;
            'interface' = $interface}
            "id" = 1 }| ConvertTo-Json -Compress

            write-verbose "Calling method $method with $json" 
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result | select address,type,firmware,availableFirmware,updatable,firmwareUpdateState | where address -notmatch ":" |  Sort-Object -Descending -Property firmwareUpdateState | ft
}

#Interface.getInstallMode
function Get-CCU2HmIPInstallMode {
    [CmdletBinding()]
    param(
        [ValidateSet('BidCos-RF', 'HmIP-RF', 'VirtualDevices')]$interface = "HmIP-RF",
        $session_id = $global:ccu2session,
        $ccu2url = $global:ccu2url)
    $method = "Interface.getInstallMode"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
            'interface'             = $interface;
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress
    write-verbose "Calling method $method with $json" 
    Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json"
}


#Interface.setInstallModeHMIP
#_session_id_ installMode interface on time address key keymode
function Set-CCU2HmIPInstallMode {
    [CmdletBinding()]
    param(
        [ValidateSet('BidCos-RF', 'HmIP-RF', 'VirtualDevices')]$interface = "HmIP-RF",
        $session_id = $global:ccu2session,
        #[parameter(mandatory = $false)][ValidateRange(1,120)][int]$time = 60,
        $ccu2url = $global:ccu2url)
    $method = "Interface.setInstallModeHMIP"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
            'interface'             = $interface;
            'installMode'           = 'online'
            'on'                    = '1';
            'address'               = '';
            'key'                   = ''
            'keymode'               = ''
            'time'                  = ''
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress

    write-verbose "Calling method $method with $json" 
    Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json"
}


#Interface.refreshDeployedDeviceFirmwareList

function Update-CCU2DeployedDeviceFirmwareList
{
    [CmdletBinding()]
    param(
[ValidateSet('BidCos-RF','HmIP-RF','VirtualDevices')]$interface = "HmIP-RF",
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url)
$method = "Interface.refreshDeployedDeviceFirmwareList"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method;
            "params"= @{'_session_id_' = $session_id;
            'interface' = $interface}
            "id" = 1 }| ConvertTo-Json -Compress

            write-verbose "Calling method $method with $json" 
Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json"
}

#Interface.updateFirmware

function Update-CCU2DeviceFirmware {
    [CmdletBinding()]
    param(
        #[Parameter(Mandatory = $true)]
        #[ValidatePattern('[A-F,a-f,0-9]{14}')]
        [string][alias('address')]$Device,        
        [ValidateSet('BidCos-RF', 'HmIP-RF', 'VirtualDevices')]$interface = "HmIP-RF",
        $session_id = $global:ccu2session,
        $ccu2url = $global:ccu2url)
    $method = "Interface.updateFirmware"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method;
        "params"           = @{'_session_id_' = $session_id;
            "device"                = $Device
            'interface'             = $interface
        }
        "id"               = 1 
    }| ConvertTo-Json -Compress

    write-verbose "Calling method $method with $json" 
    Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json"
}

function Connect-CCU2

{
    [CmdletBinding()]
    
param(
$ccu2_name = "homematic-ccu2.fritz.box",
$Username = "Admin",
$Password = ""

)
$global:ccu2url = "http://$ccu2_name/api/homematic.cgi"

$json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= "Session.login"
            "params"= @{'username' = $Username
                        "password" = $Password}
            "id" = 2 }| ConvertTo-Json -Compress
$Login = Invoke-CCU2method -Uri $global:ccu2url -body $json -Method Post -ContentType "application/json"
$global:ccu2session = $login.result
$host.ui.RawUI.WindowTitle = "Connected to $ccu2_name with SessionID $($Global:ccu2session) as $Username"
Write-Output $Login
}

function Disconnect-CCU2 {
    [CmdletBinding()]
    param(
        $ccu2_url = $Global:ccu2url,
        $Session_id = $Global:ccu2session
    )
    $json = [ordered]@{   "jsonrpc" = "1.1"
        "method"                 = "Session.logout"
        "params"                 = @{'_session_id_' = $session_id}
        "id"                     = 1 
    }| ConvertTo-Json -Compress
    write-verbose "Calling method $method with $json"
    Invoke-CCU2method -Uri $ccu2_url -body $json -Method Post -ContentType "application/json"
    $host.ui.RawUI.WindowTitle = "Windows Powershell"
    
}
#Session.renew
function Update-CCU2Session {
    [CmdletBinding()]
    param(
        $ccu2_url = $Global:ccu2url,
        $Session_id = $Global:ccu2session
        )
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"                 = "Session.renew"
        "params"                 = @{'_session_id_' = $session_id}
        "id"                     = 1 
    }| ConvertTo-Json -Compress
    write-verbose "Calling method $method with $json"
    Invoke-CCU2method -Uri $ccu2_url -body $Json -Method Post -ContentType "application/json"
    $host.ui.RawUI.WindowTitle = "Windows Powershell"
    
}

function Invoke-CCU2method 
{
    [CmdletBinding()]
    param
(
$uri = $Global:ccu2url,
$body,
$method = "POST",
$ContentType = "application/json" 
)    

try {
    $result = Invoke-RestMethod -Uri $uri -body $body -Method $method -ContentType $ContentType
            
}
catch {
     write-host "error calling ccu2 with $body"
     Write-Host $_.exception
     break
}
if ($($result.error))
    {
        write-warning "We got $($result.error), will evaluate $($result.error.code)"
        switch ($result.error.code)
            {
                100    {
                    write-Host "illegal request"}
                101    {
                    write-host "the element 'ID' missing in request"}
                102    {
                    write-host "the element 'method' missing in request"}
                103    {
                    write-host "the element 'parameters' missing in request"}
                200    {
                    write-host "illegal response"}
                201    {
                    write-host "the element 'ID' missing in response"}
                202    {
                    write-host "the element 'result' missing in response"}
                203    {
                    write-host "the element 'error' missing in response"}
                300    {
                    write-host "internal error"}
                400    {
                    write-host "user level insufficient"}
                401    {
                    write-host "method not found"}
                402    {
                    write-host "argument not fount"}
                default
                    {
                        write-host "Application Specific error $($result.error.code) occured"
                    } 
                }
        break
    }
Write-Verbose $result
write-output $result
}


#Device.getNewDeviceCount
function Get-CCU2NewDevicesCount
{
[CmdletBinding()]
param(
$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url
)
$method = "Device.getNewDeviceCount"
$Json = [ordered]@{   "jsonrpc" = "1.1";
            "method"= $method;
            "params"                 = @{'_session_id_' = $session_id}
            "id" = 1 }| ConvertTo-Json -Compress
write-verbose "Calling method $method with $json"
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}

#system.listMethods
function Get-CCU2Methods
{
[CmdletBinding()]
param(
#$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url
)
$method = "system.listMethods"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method
            "params"= ""
            "id" = 1 }| ConvertTo-Json -Compress
write-verbose "Calling method $method with $json"
(Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}

function Get-CCU2methodHelp {
    [CmdletBinding()]
    param(
        $Methodname,
        $ccu2url = $global:ccu2url
    )
    $method = "system.methodHelp"
    $Json = [ordered]@{   "jsonrpc" = "1.1"
        "method"           = $method
        "params"           = @{"name" = $Methodname}
        "id"               = 1 
    }| ConvertTo-Json -Compress
    write-verbose "Calling method $method with $json"
    (Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json").result
}

#system.describe
function Get-CCU2Api
{
[CmdletBinding()]
param(
#$session_id = $global:ccu2session,
$ccu2url = $global:ccu2url
)
$method = "system.describe"
$Json = [ordered]@{   "jsonrpc" = "1.1"
            "method"= $method
            "params"= ""
            "id" = 1 }| ConvertTo-Json -Compress
write-verbose "Calling method $method with $json"
$api = Invoke-CCU2method -Uri $ccu2url -body $json -Method Post -ContentType "application/json"
#cleaning wron formatted json
$myresult = $api -replace ",}","}" | ConvertFrom-Json
write-output $myresult.result
}