|
| 1 | +# 3D Printer Binding |
| 2 | + |
| 3 | +This binding integrates FDM 3D printers into openHAB, allowing you to monitor print status, temperatures, and job progress, and to control prints (pause, resume, cancel) and adjust temperatures, print speed, and fan speed. |
| 4 | + |
| 5 | +Three printer firmware/server platforms are supported: |
| 6 | + |
| 7 | +- **PrusaLink** — Prusa printers running PrusaLink firmware (MK4, XL, Mini+, etc.) |
| 8 | +- **Klipper** — Klipper firmware printers accessed via the Moonraker REST API |
| 9 | +- **OctoPrint** — Any printer managed by an OctoPrint server |
| 10 | + |
| 11 | +## Supported Things |
| 12 | + |
| 13 | +| Thing ID | Description | |
| 14 | +|---------------|------------------------------------------------------| |
| 15 | +| `prusaprinter`| Prusa printer via the PrusaLink v1 REST API | |
| 16 | +| `klipper` | Klipper printer via the Moonraker REST API | |
| 17 | +| `octoprint` | Printer managed by an OctoPrint server | |
| 18 | + |
| 19 | +## Discovery |
| 20 | + |
| 21 | +Auto-discovery is not supported. Things must be added manually. |
| 22 | + |
| 23 | +## Thing Configuration |
| 24 | + |
| 25 | +### PrusaLink (`prusaprinter`) |
| 26 | + |
| 27 | +| Parameter | Description | Default | Required | |
| 28 | +|-------------------|---------------------------------------------------------------------------------|---------|----------| |
| 29 | +| `hostname` | Hostname or IP address of the printer. | – | Yes | |
| 30 | +| `port` | HTTP port of the PrusaLink API. | `80` | No | |
| 31 | +| `apiKey` | API key shown in the printer's settings menu under **Network → API Key**. | – | Yes | |
| 32 | +| `username` | Username for PrusaLink (not used for authentication, kept for future use). | `maker` | No | |
| 33 | +| `refreshInterval` | How often to poll the printer, in seconds. | `30` | No | |
| 34 | + |
| 35 | +### Klipper (`klipper`) |
| 36 | + |
| 37 | +| Parameter | Description | Default | Required | |
| 38 | +|-------------------|---------------------------------------------------------------------------------|---------|----------| |
| 39 | +| `hostname` | Hostname or IP address of the Moonraker server. | – | Yes | |
| 40 | +| `port` | HTTP port of the Moonraker API. | `7125` | No | |
| 41 | +| `apiKey` | Moonraker API key. Optional when accessing from a trusted local network. | – | No | |
| 42 | +| `refreshInterval` | How often to poll the printer, in seconds. | `30` | No | |
| 43 | + |
| 44 | +### OctoPrint (`octoprint`) |
| 45 | + |
| 46 | +| Parameter | Description | Default | Required | |
| 47 | +|-------------------|---------------------------------------------------------------------------------|---------|----------| |
| 48 | +| `hostname` | Hostname or IP address of the OctoPrint server. | – | Yes | |
| 49 | +| `port` | HTTP port of the OctoPrint API. | `5000` | No | |
| 50 | +| `apiKey` | OctoPrint API key from **Settings → API → Global API Key**. | – | Yes | |
| 51 | +| `refreshInterval` | How often to poll the printer, in seconds. | `30` | No | |
| 52 | + |
| 53 | +## Channels |
| 54 | + |
| 55 | +All three thing types expose the same set of channels. |
| 56 | + |
| 57 | +| Channel ID | Item Type | R/W | Description | |
| 58 | +|-------------------------------|----------------------|-----|------------------------------------------------------------------------------------------------------| |
| 59 | +| `printer-state` | String | R | Current printer state: `IDLE`, `PRINTING`, `PAUSED`, `FINISHED`, `ERROR`, or `BUSY`. | |
| 60 | +| `job-name` | String | R | Name of the file currently loaded or being printed. | |
| 61 | +| `job-progress` | Number | R | Print completion percentage (0–100). | |
| 62 | +| `time-elapsed` | Number | R | Seconds elapsed since the print started. | |
| 63 | +| `time-remaining` | Number | R | Estimated seconds remaining. | |
| 64 | +| `nozzle-temperature` | Number:Temperature | R | Current nozzle (hotend) temperature. | |
| 65 | +| `nozzle-temperature-setpoint` | Number:Temperature | RW | Nozzle temperature target. Send a temperature to change it. | |
| 66 | +| `bed-temperature` | Number:Temperature | R | Current heated bed temperature. | |
| 67 | +| `bed-temperature-setpoint` | Number:Temperature | RW | Bed temperature target. Send a temperature to change it. | |
| 68 | +| `print-speed` | Number | RW | Print speed as a percentage of the configured profile speed (0–200). Read support varies by firmware.| |
| 69 | +| `fan-speed` | Number | RW | Part-cooling fan speed percentage (0–100). Read support varies by firmware. | |
| 70 | +| `pause-resume` | Switch | RW | `ON` when the print is paused. Send `ON` to pause, `OFF` to resume. | |
| 71 | +| `cancel` | Switch | W | Send `ON` to cancel the current print. Resets to `OFF` automatically. | |
| 72 | + |
| 73 | +## Full Example |
| 74 | + |
| 75 | +### Things |
| 76 | + |
| 77 | +`threedprinter.things` |
| 78 | + |
| 79 | +```java |
| 80 | +Thing threedprinter:prusaprinter:mk4 "Prusa MK4" [ |
| 81 | + hostname="192.168.1.50", |
| 82 | + apiKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", |
| 83 | + refreshInterval=15 |
| 84 | +] |
| 85 | + |
| 86 | +Thing threedprinter:klipper:voron "Voron 2.4" [ |
| 87 | + hostname="voron.local", |
| 88 | + port=7125, |
| 89 | + refreshInterval=10 |
| 90 | +] |
| 91 | + |
| 92 | +Thing threedprinter:octoprint:ender "Ender 3 (OctoPrint)" [ |
| 93 | + hostname="octopi.local", |
| 94 | + apiKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", |
| 95 | + refreshInterval=20 |
| 96 | +] |
| 97 | +``` |
| 98 | + |
| 99 | +### Items |
| 100 | + |
| 101 | +`threedprinter.items` |
| 102 | + |
| 103 | +```java |
| 104 | +String MK4_State "Printer state [%s]" { channel="threedprinter:prusaprinter:mk4:printer-state" } |
| 105 | +String MK4_JobName "Current job [%s]" { channel="threedprinter:prusaprinter:mk4:job-name" } |
| 106 | +Number MK4_Progress "Progress [%.1f %%]" { channel="threedprinter:prusaprinter:mk4:job-progress" } |
| 107 | +Number MK4_TimeElapsed "Time elapsed [%d s]" { channel="threedprinter:prusaprinter:mk4:time-elapsed" } |
| 108 | +Number MK4_TimeRemaining "Time remaining [%d s]" { channel="threedprinter:prusaprinter:mk4:time-remaining" } |
| 109 | +Number:Temperature MK4_NozzleTemp "Nozzle temp [%.1f %unit%]" { channel="threedprinter:prusaprinter:mk4:nozzle-temperature" } |
| 110 | +Number:Temperature MK4_NozzleTarget "Nozzle target [%.1f %unit%]" { channel="threedprinter:prusaprinter:mk4:nozzle-temperature-setpoint" } |
| 111 | +Number:Temperature MK4_BedTemp "Bed temp [%.1f %unit%]" { channel="threedprinter:prusaprinter:mk4:bed-temperature" } |
| 112 | +Number:Temperature MK4_BedTarget "Bed target [%.1f %unit%]" { channel="threedprinter:prusaprinter:mk4:bed-temperature-setpoint" } |
| 113 | +Number MK4_PrintSpeed "Print speed [%d %%]" { channel="threedprinter:prusaprinter:mk4:print-speed" } |
| 114 | +Number MK4_FanSpeed "Fan speed [%d %%]" { channel="threedprinter:prusaprinter:mk4:fan-speed" } |
| 115 | +Switch MK4_PauseResume "Paused" { channel="threedprinter:prusaprinter:mk4:pause-resume" } |
| 116 | +Switch MK4_Cancel "Cancel print" { channel="threedprinter:prusaprinter:mk4:cancel" } |
| 117 | +``` |
| 118 | + |
| 119 | +### Sitemap |
| 120 | + |
| 121 | +`threedprinter.sitemap` |
| 122 | + |
| 123 | +```perl |
| 124 | +sitemap threedprinter label="3D Printers" { |
| 125 | + Frame label="Prusa MK4" { |
| 126 | + Text item=MK4_State |
| 127 | + Text item=MK4_JobName |
| 128 | + Text item=MK4_Progress |
| 129 | + Text item=MK4_TimeElapsed |
| 130 | + Text item=MK4_TimeRemaining |
| 131 | + Text item=MK4_NozzleTemp |
| 132 | + Setpoint item=MK4_NozzleTarget minValue=0 maxValue=300 step=5 |
| 133 | + Text item=MK4_BedTemp |
| 134 | + Setpoint item=MK4_BedTarget minValue=0 maxValue=120 step=5 |
| 135 | + Slider item=MK4_PrintSpeed minValue=0 maxValue=200 step=10 |
| 136 | + Slider item=MK4_FanSpeed minValue=0 maxValue=100 step=5 |
| 137 | + Switch item=MK4_PauseResume label="Pause/Resume" |
| 138 | + Switch item=MK4_Cancel label="Cancel Print" |
| 139 | + } |
| 140 | +} |
| 141 | +``` |
0 commit comments