functions/New-ZGMaintenance.ps1

function New-ZGMaintenance {
    param (
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $false)]
        [long[]] $HostId,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $false)]
        [long[]] $GroupId,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $false)]
        [string] $Name,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $false)]
        [string] $Description,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $false)]
        [datetime] $From,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $false)]
        [datetime] $To,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $false)]
        [hashtable[]] $Timeperiod
    )

    Begin {
        $parameters = @{
            name          = $Name
            active_since  = [int][double]::Parse((Get-Date $From -UFormat %s))
            active_till   = [int][double]::Parse((Get-Date $To -UFormat %s))
            tags_evaltype = 0
            timeperiods   = $Timeperiod
        }

        if ($PSBoundParameters.ContainsKey('HostId')) {
            $parameters.hosts = (Get-ZGHost -HostId $HostId | Select-Object -Property hostid) 
        }

        if ($PSBoundParameters.ContainsKey('GroupId')) {
            $parameters.groups = (Get-ZGGroup -GroupId $GroupId | Select-Object -Property groupid) 
        }
    }

    Process {
        $response = Invoke-ZGRequest -Method "POST" -Body @{
            "method" = "maintenance.create"
            "params" = $parameters
            "auth"   = $script:RequestAuth
        } 

        $response.result
    } 
}