examples/Power-Device-Control.ps1

<#
.SYNOPSIS
    Power device control examples.

.DESCRIPTION
    Demonstrates how to monitor and control power devices (smart plugs,
    relays, GPIO pins) configured in Moonraker.
#>


Import-Module KlippyCLI

#region List Power Devices

# Get all configured power devices
Get-KlippyPowerDevice | Format-Table DeviceName, Type, Status, LockedWhilePrinting

# Get a specific device
Get-KlippyPowerDevice -DeviceName "printer_power"

# Check if printer is on
$printerPower = Get-KlippyPowerDevice -DeviceName "printer_power"
if ($printerPower.IsOn) {
    Write-Host "Printer is ON" -ForegroundColor Green
} else {
    Write-Host "Printer is OFF" -ForegroundColor Red
}

#endregion

#region Control Power Devices

# Turn on a device
Set-KlippyPowerDevice -DeviceName "printer_power" -Action On

# Turn off a device
Set-KlippyPowerDevice -DeviceName "printer_power" -Action Off

# Toggle a device
Set-KlippyPowerDevice -DeviceName "led_strip" -Action Toggle

# Control via pipeline
Get-KlippyPowerDevice -DeviceName "enclosure_fan" | Set-KlippyPowerDevice -Action On

#endregion

#region Automated Power Sequences

function Start-PrinterPowerOn {
    <#
    .SYNOPSIS
        Power on sequence for printer startup
    #>

    param(
        [string]$PrinterName
    )

    Write-Host "Starting power-on sequence..." -ForegroundColor Cyan

    # Turn on main power
    Set-KlippyPowerDevice -DeviceName "printer_power" -Action On -PrinterName $PrinterName
    Write-Host " Main power: ON"

    # Wait for Klipper to start
    Start-Sleep -Seconds 10
    Wait-KlippyReady -PrinterName $PrinterName -Timeout 120

    # Turn on enclosure lights
    Set-KlippyPowerDevice -DeviceName "led_strip" -Action On -PrinterName $PrinterName
    Write-Host " LED strip: ON"

    Write-Host "Printer is ready!" -ForegroundColor Green
}

function Start-PrinterPowerOff {
    <#
    .SYNOPSIS
        Safe power off sequence
    #>

    param(
        [string]$PrinterName
    )

    # Check if printing
    $status = Get-KlippyStatus -PrinterName $PrinterName
    if ($status.State -eq "printing") {
        Write-Warning "Cannot power off - print in progress!"
        return
    }

    Write-Host "Starting power-off sequence..." -ForegroundColor Cyan

    # Cool down heaters first
    Invoke-KlippyGcode -Gcode "M104 S0", "M140 S0" -PrinterName $PrinterName
    Write-Host " Heaters: OFF"

    # Turn off LEDs
    Set-KlippyPowerDevice -DeviceName "led_strip" -Action Off -PrinterName $PrinterName
    Write-Host " LED strip: OFF"

    # Park toolhead
    Invoke-KlippyGcode -Gcode "G28 X Y", "G1 X0 Y200 F3000" -PrinterName $PrinterName

    # Wait a moment then power off
    Start-Sleep -Seconds 5
    Set-KlippyPowerDevice -DeviceName "printer_power" -Action Off -PrinterName $PrinterName
    Write-Host " Main power: OFF"

    Write-Host "Printer powered off safely" -ForegroundColor Green
}

# Usage
Start-PrinterPowerOn
# ... do printing ...
Start-PrinterPowerOff

#endregion

#region Print-Triggered Power Control

function Invoke-PrintWithPowerControl {
    param(
        [string]$FileName
    )

    # Power on if needed
    $power = Get-KlippyPowerDevice -DeviceName "printer_power"
    if (-not $power.IsOn) {
        Write-Host "Powering on printer..."
        Set-KlippyPowerDevice -DeviceName "printer_power" -Action On
        Start-Sleep -Seconds 15
        Wait-KlippyReady -Timeout 120
    }

    # Turn on enclosure fan
    Set-KlippyPowerDevice -DeviceName "enclosure_fan" -Action On

    # Start print
    Start-KlippyPrint -FileName $FileName

    # Wait for print to complete
    Wait-KlippyPrintFinished

    # Cool down and power off
    Write-Host "Print complete, cooling down..."
    Start-Sleep -Seconds 300  # Wait 5 minutes to cool

    # Turn off enclosure fan
    Set-KlippyPowerDevice -DeviceName "enclosure_fan" -Action Off

    # Optionally power off printer
    # Set-KlippyPowerDevice -DeviceName "printer_power" -Action Off

    Write-Host "Done!" -ForegroundColor Green
}

# Usage
Invoke-PrintWithPowerControl -FileName "overnight_print.gcode"

#endregion

#region Multi-Printer Power Status

# Check power status across all printers
Get-KlippyPrinter | ForEach-Object {
    $printerName = $_.PrinterName
    Write-Host "`n$printerName Power Devices:" -ForegroundColor Cyan

    Get-KlippyPowerDevice -PrinterName $printerName |
        Format-Table DeviceName, Status, Type
}

#endregion