functions/public/Get-KlippyTemperatureSensor.ps1

function Get-KlippyTemperatureSensor {
    <#
    .SYNOPSIS
        Gets temperature sensor readings from a Klipper printer.

    .DESCRIPTION
        Retrieves the status of all temperature sensors configured on the printer,
        including current temperature and measured min/max values.

    .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-KlippyTemperatureSensor
        Gets all temperature sensors from the default printer.

    .EXAMPLE
        Get-KlippyTemperatureSensor -PrinterName "voronv2"
        Gets all temperature sensors from the specified printer.

    .EXAMPLE
        Get-KlippyTemperatureSensor -Name "*chamber*"
        Gets sensors with "chamber" in the name.

    .OUTPUTS
        KlippyCLI.TemperatureSensor 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"

            # Find temperature_sensor objects
            $sensorObjects = foreach ($obj in $allObjects.Objects) {
                if ($obj.StartsWith('temperature_sensor ')) {
                    $sensorName = ($obj -split ' ', 2)[1]
                    [PSCustomObject]@{
                        ObjectName = $obj
                        SensorName = $sensorName
                    }
                }
            }

            # Apply name filter
            if ($Name) {
                $sensorObjects = $sensorObjects | Where-Object { $_.SensorName -like $Name }
            }

            if (-not $sensorObjects) {
                Write-Verbose "No temperature 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.TemperatureSensor'
                        PrinterId      = $printer.Id
                        PrinterName    = $printer.PrinterName
                        Name           = $sensor.SensorName
                        Temperature    = [math]::Round($data.temperature, 1)
                        MeasuredMinTemp = $data.measured_min_temp
                        MeasuredMaxTemp = $data.measured_max_temp
                    }
                }
            }
        }
        catch {
            Write-Error "Failed to get temperature sensors from '$($printer.PrinterName)': $_"
        }
    }
}