5 Minuten
Homeassistant und Octoprint

Octoprint ist eine freie open-source Software, die es Laien ermöglicht in einer webbasierten Oberfläche 3D-Drucker anzusteuern und zu überwachen. Sie stellt eine vielseitige API zum monitoren des 3D-Druckers bereit, die einfach und unkompliziert in Homeassistant mit der offiziellen Octoprint Integration genutzt werden kann.
Heimisches Setup
- Mein Raspberry Pi mit Octoprint hängt an einer Gosund SP111 Steckdose, die mit Tasmota geflasht wurde und in Homeassistant eingebunden ist. Diese hat den Namen
switch.strom_octoprint
. Ist diese Steckdose ausgeschaltet ist logischerweise auch Octoprint nicht verfügbar. Ziel war es Octoprint sauber auf dem Pi herunterzufahren, bevor er vom Strom getrennt wird. Dafür wird ein REST-Command und ein Template-Switch benötigt. - Mein Anycubic 3D-Drucker bezieht ebenfalls über eine Gosund SP111 seinen Strom und ist in Homeassistant über den Switch
switch.strom_anycubic
erreichbar.
Octoprint API-Key generieren
Zur erfolgreichen Einbindung der Octoprint Integration muss ein Eintrag in der configuration.yaml
erfolgen, die anschließend Sensoren zum Drucker und weitere Binary Sensoren bereitstellt.
Im ersten Schritt muss jedoch ein API-Key in der Octoprint Weboberfläche erstellt werden. Dazu muss im Browser zum Eintrag Einstellungen > API
navigiert werden und der API-Key in die Zwischenablage kopiert werden.
Homeassistant konfigurieren
In der configuration.yaml
muss zwingend die IP-Adresse des Octoprint Servers angegeben werden. Diese sollte idealerweise statisch sein und sich nicht bei jedem Neustart ändern:
octoprint:
host: IP-ADDRESSE
api_key: API-KEY
name: Anycubic
number_of_tools: 1
bed: true
Je nach Druckermodell können mehrere Druckdüsen (Nozzles) vorhanden sein. Die Anzahl der Düsen sollte in der Konfiguration generell gesetzt werden, da sonst kein Sensor zur Überwachung der Temperatur bereitgestellt wird. Ebenso verhält es sich mit dem Eintrag bed: true
. Wenn ein beheiztes Druckbett vorhanden ist, sollte also der boolsche Wert auf true
gesetzt werden.
Rest Command erstellen
octopi_shutdown:
url: "http://OCTOPRINT-IP/api/system/commands/core/shutdown"
method: POST
headers:
content-type: application/json
X-Api-Key: !secret octoprint_api_key
In der secrets.yaml
sollte ein Eintrag für den Octoprint-API-Key angelegt werden. Die IP von der Octoprint Instanz muss in dem API-Aufruf entsprechend angepasst werden.
Zwei Template-Switches anlegen
Der erste Template-Switch, schaut ob die Steckdose des Raspberry Pis mit Octoprint bereits eingeschaltet ist. Wird der Switch auf off
geschaltet, wird der Pi über die Octoprint API heruntergefahren. Nach weiteren 45 Sekunden schaltet sich die Steckdose auf aus
. Der Switch erschein in Homeassistant unter dem Name switch.octopi_shutdown
.
- platform: template
switches:
octopi_shutdown:
friendly_name: Octopi Shutdown
value_template: "{{ is_state('switch.strom_octoprint', 'on') }}"
turn_on:
- service: switch.turn_on
entity_id: switch.strom_octoprint
turn_off:
- service: rest_command.octopi_shutdown
- delay: '00:00:45'
- service: switch.turn_off
entity_id: switch.strom_octoprint
icon_template: >-
{% if is_state('switch.strom_octoprint', 'on') %}
mdi:power-plug
{% else %}
mdi:power-plug-off
{% endif %}
Ein weiterer Template Switch für das Gesamtsystem 3D-Drucker + Raspberry Pi wird zusätzlich angelegt. Dieser kann sowohl 3D-Drucker, als auch den Pi mit einem Klick an und ausschalten:
- platform: template
switches:
3dprinter_setup:
friendly_name: "3D Printer Setup"
value_template: "{{ is_state('switch.strom_octoprint', 'on') and is_state('switch.strom_anycubic', 'on') }}"
turn_on:
- service: switch.turn_on
entity_id: switch.strom_octoprint
- service: switch.turn_on
entity_id: switch.strom_anycubic
turn_off:
- service: switch.turn_off
entity_id: switch.strom_anycubic
- service: rest_command.octopi_shutdown
- delay: '00:00:45'
- service: switch.turn_off
entity_id: switch.strom_octoprint
icon_template: >-
{% if is_state('switch.strom_octoprint', 'on') and is_state('switch.strom_anycubic', 'on') %}
mdi:power-plug
{% else %}
mdi:power-plug-off
{% endif %}
Dieser Switch erschein in Homeassistant unter dem Name switch.3dprinter_setup
.
Lovelace Card: Picture-Elements
Was nützen einem Sensorwerte, wenn sie nicht auch anschaulich dargestellt werden. Ich nutze dafür eine Picture Elements Card, die folgendermaßen aussieht:

Bildvorlage für Picture-Elements Card speichern
Entsprechend meines Druckermodells (Anycubic i3 Mega), habe ich eine Bilddatei erstellt und diese in der Lovelace UI eingebunden. Dieses Bild kann micht einem Rechtsklick gespeichert und in Homeassistant /config/www/
-Ordner platziert werden. In meinem Beispiel lautet der Pfad zum Bild /config/www/entitypictures/octoprint-ui-template.png
.

Custom Cards aus HACS installieren
Zur Darstellung der Lovelace Card verwende ich drei Custom Cards, die einfach über HACS installiert werden können:
- custom:bar-card, zur Darstellung der Fortschrittsbalken
- custom:button-card, zur Darstellung der unteren 4 Icons
- custom:vertical-stack-in-card, zur Anordnung der Karten übereinander, ohne sichtbare Abgrenzung zueinander
Code für Lovelace
Dargestellt werden Informationen zum Druckfortschritt, der Bett- und Düsentemperatur, zum Druckstatus, zur Fehlerindikation und zur verbleibenden Druckzeit. Darüber hinaus gibt es einen Service Button zum Ein- und Ausschalten von Drucker und Pi.
Die gesamte Config der Card sieht wie folgend aus:
image: /local/entitypictures/octoprint-ui-template.png
type: picture-elements
elements:
- type: conditional
conditions:
- entity: switch.3dprinter_setup
state: 'off'
elements:
- type: service-button
title: Turn On
service: switch.turn_on
service_data:
entity_id: switch.3dprinter_setup
style:
left: 86%
top: 14%
width: 20%
- type: conditional
conditions:
- entity: switch.3dprinter_setup
state: 'on'
elements:
- type: service-button
title: Turn Off
service: switch.turn_off
service_data:
entity_id: switch.3dprinter_setup
style:
left: 86%
top: 14%
width: 20%
- type: state-icon
entity: switch.octopi_shutdown
style:
top: 14%
left: 68%
tap_action:
action: toggle
- type: conditional
conditions:
- entity: switch.strom_anycubic
state: 'on'
elements:
- type: state-icon
entity: binary_sensor.anycubic_printing_error
style:
top: 22%
left: 14%
- type: state-icon
entity: switch.strom_anycubic
icon: 'mdi:power-plug'
style:
top: 22%
left: 31%
tap_action:
action: toggle
- type: conditional
conditions:
- entity: switch.strom_anycubic
state: 'on'
elements:
- type: state-label
entity: sensor.anycubic_current_state
style:
top: 55%
left: 23%
- animation: true
color: '#90ee90'
entity: sensor.anycubic_job_percentage
entity_row: true
height: 36px
name: Progress
positions:
icon: 'off'
indicator: 'off'
minmax: inside
title: outside
speed: 1000
style:
left: 72%
top: 40%
width: 48%
type: 'custom:bar-card'
- animation: true
entity: sensor.anycubic_actual_bed_temp
entity_row: true
height: 36px
max: 60
name: Bed
positions:
icon: 'off'
indicator: 'off'
minmax: inside
title: outside
severity:
- color: '#f08080'
from: 0
to: 40
- color: '#ff9966'
from: 40
to: 55
- color: '#90ee90'
from: 55
to: 65
style:
left: 72%
top: 62%
width: 48%
type: 'custom:bar-card'
- animation: true
entity: sensor.anycubic_actual_tool0_temp
entity_row: true
height: 36px
max: 200
name: Nozzle
positions:
icon: 'off'
indicator: 'off'
minmax: inside
title: outside
severity:
- color: '#f08080'
from: 0
to: 120
- color: '#ff9966'
from: 120
to: 180
- color: '#90ee90'
from: 180
to: 220
style:
left: 72%
top: 84%
width: 48%
type: 'custom:bar-card'