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 erscheint 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 erscheint 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:

Hello Friend

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 mit 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.

Hello Friend

Custom Cards aus HACS installieren

Zur Darstellung der Lovelace Card verwende ich drei Custom Cards, die einfach über HACS installiert werden können:

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'