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)': $_"
        }
    }
}