functions/public/Get-KlippyFilamentSensor.ps1
|
function Get-KlippyFilamentSensor { <# .SYNOPSIS Gets filament sensor status from a Klipper printer. .DESCRIPTION Retrieves the status of filament sensors configured on the printer, including switch sensors and motion sensors. .PARAMETER Id The unique identifier of the printer. .PARAMETER PrinterName The friendly name of the printer. .PARAMETER InputObject A printer object from pipeline input. .PARAMETER Name Filter by specific sensor name. Supports wildcards. .EXAMPLE Get-KlippyFilamentSensor Gets all filament sensors from the default printer. .EXAMPLE Get-KlippyFilamentSensor -PrinterName "voronv2" Gets all filament sensors from the specified printer. .OUTPUTS KlippyCLI.FilamentSensor objects. #> [CmdletBinding(DefaultParameterSetName = 'Default')] [OutputType([PSCustomObject])] param( [Parameter(ParameterSetName = 'ById')] [ValidateNotNullOrEmpty()] [string]$Id, [Parameter(ParameterSetName = 'ByName', Position = 0)] [ValidateNotNullOrEmpty()] [string]$PrinterName, [Parameter(ParameterSetName = 'ByObject', ValueFromPipeline = $true)] [PSCustomObject]$InputObject, [Parameter()] [string]$Name ) process { # Resolve printer $resolveParams = @{} switch ($PSCmdlet.ParameterSetName) { 'ById' { $resolveParams['Id'] = $Id } 'ByName' { $resolveParams['PrinterName'] = $PrinterName } 'ByObject' { $resolveParams['InputObject'] = $InputObject } } $printer = Resolve-KlippyPrinterTarget @resolveParams try { # Get list of available objects $allObjects = Invoke-KlippyJsonRpc -Printer $printer -Method "printer/objects/list" # Define filament sensor prefixes $sensorPrefixes = @{ 'filament_switch_sensor' = 'Switch' 'filament_motion_sensor' = 'Motion' } # Find filament sensor objects $sensorObjects = foreach ($obj in $allObjects.Objects) { foreach ($prefix in $sensorPrefixes.Keys) { if ($obj.StartsWith("$prefix ")) { $sensorName = ($obj -split ' ', 2)[1] [PSCustomObject]@{ ObjectName = $obj SensorType = $sensorPrefixes[$prefix] SensorName = $sensorName } break } } } # Apply name filter if ($Name) { $sensorObjects = $sensorObjects | Where-Object { $_.SensorName -like $Name } } if (-not $sensorObjects) { Write-Verbose "No filament sensors found matching the specified criteria." return } # Build query string $queryParts = $sensorObjects | ForEach-Object { [System.Uri]::EscapeDataString($_.ObjectName) } $endpoint = "printer/objects/query?" + ($queryParts -join '&') $response = Invoke-KlippyJsonRpc -Printer $printer -Method $endpoint -NoNormalize # Process results foreach ($sensor in $sensorObjects) { $data = $response.status.($sensor.ObjectName) if ($data) { [PSCustomObject]@{ PSTypeName = 'KlippyCLI.FilamentSensor' PrinterId = $printer.Id PrinterName = $printer.PrinterName Name = $sensor.SensorName Type = $sensor.SensorType FilamentDetected = $data.filament_detected Enabled = $data.enabled } } } } catch { Write-Error "Failed to get filament sensors from '$($printer.PrinterName)': $_" } } } |