Homeassistant und Octoprint

Homeassistant und Octoprint

UPDATE: 18.01.2021
Ich habe zusätzlich einen Switch angelegt, der dem Raspberry Pi mit Octoprint nicht einfach den Strom klaut, sondern ihn vorher sauber über die Octoprint-API herunterfährt und dann erst vom Strom trennt.

Mein Raspberry Pi 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.

REST-Command anlegen

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.

Template Switch anlegen

Nun fehlt noch ein Switch, der schaut ob die Steckdose bereits an ist und explizite Anweisungen enthält, was beim Ein- oder Ausschalten erfolgen soll:

- 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 %}

Schaltet man den Switch nun aus, wird der Befehl zum herunterfahren des Raspberry Pis an Octoprint gesendet, gefolgt von 45 Sekunden Pause. Im letzten Schritt schaltet die Steckdose den Strom aus.

Der Switch erschein in Homeassistant unter dem Name switch.octoprint_shutdown und sollte in der Lovelace-Card den vorhandenen Switch switch.strom_octoprint ersetzen.

UPDATE: 21.12.2020
Ich habe die Lovelace Card überarbeitet und eine Variante entwickelt, die weniger Platz in der Höhe erfordert.

Die Card sieht nun folgendermaßen aus und beruht auf der picture elements card:

Verwendet wurde das Bild aus dem ursprünglichen Beitrag mit einer kleinen Abwandlung:

Der zugehörige Code zum erzeugen der Card mit allen dargestellten Informationen:

type: picture-elements
image: /local/entitypictures/anycubic.png
elements:
  - type: state-icon
    entity: switch.strom_octoprint
    icon: 'mdi:power-plug'
    style:
      top: 14%
      left: 68%
    tap_action:
      action: toggle
  - type: state-label
    entity: sensor.octoprint_energy_power
    icon: 'mdi:power-plug'
    style:
      top: 14%
      left: 76%
  - type: state-icon
    entity: binary_sensor.anycubic_printing_error
    style:
      top: 14%
      left: 93%
  - type: state-icon
    entity: switch.strom_anycubic
    icon: 'mdi:power-plug'
    style:
      top: 22%
      left: 31%
    tap_action:
      action: toggle
  - type: state-label
    entity: sensor.anycubic_energy_power
    icon: 'mdi:power-plug'
    style:
      top: 22%
      left: 14%
  - 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'

ORIGINALPOST

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.

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 in der Weboberfläche zu Einstellungen > API navigiert werden und der API-Key in die Zwischenablage kopiert werden.

Homeassistant Konfiguration

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.

Lovelace Card

Was nützen einem Sensorwerte, wenn sie nicht auch anschaulich dargestellt werden. Ich nutze dafür eine Picture Elements Card und habe dafür, entsprechend meines Druckermodells (Anycubic i3 Mega), 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/anycubic.png. Die Card sieht folgendermaßen aus:

Picture Entities Card für Anycubic i3 Mega Drucker

Dieses Bild muss dazu mit einem Rechtsklick im ./config/www Ordner gespeichert werden:

Custom Cards in HACS installieren

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

  1. custom:bar-card, zur Darstellung der Fortschrittsbalken
  2. custom:button-card, zur Darstellung der unteren 4 Icons
  3. custom:vertical-stack-in-card, zur Anordnung der Karten übereinander, ohne sichtbare Abgrenzung zueinander

Darstellung in der Lovelace Card

Dargestellt werden Informationen zum Druckfortschritt, der Bett- und Düsentemperatur, zum Druckstatus, zur Fehlerindikation und zur verbleibenden Druckzeit.

Die gesamte Config der Card sieht wie folgend aus:

type: 'custom:vertical-stack-in-card'
cards:
  - type: picture-elements  
    image: /local/entitypictures/anycubic.png
    elements:
      - type: 'custom:bar-card'
        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: 20%
          width: 50%
      - 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: 50%
          width: 50%
      - 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: 80%
          width: 50%
  - type: horizontal-stack          
    cards:
      - type: 'custom:button-card'
        color: auto-no-temperature
        color_type: icon
        entity: binary_sensor.anycubic_printing
        icon: 'mdi:printer-3d-nozzle'
        name: Printing
        show_name: true
        show_state: false
        size: 34%
        tap_action:
          action: more-info
      - type: 'custom:button-card'
        color: auto-no-temperature
        color_off: 'rgb(54, 95, 140)'
        color_type: icon
        entity: binary_sensor.anycubic_printing_error
        icon: 'mdi:printer-3d-nozzle-alert'
        name: Error
        show_name: true
        show_state: false
        size: 34%
        tap_action:
          action: more-info
        units: d
      - type: 'custom:button-card'
        color: auto-no-temperature
        color_off: 'rgb(54, 95, 140)'
        color_type: icon
        entity: sensor.anycubic_current_state
        show_name: false
        show_state: true
        size: 34%
        tap_action:
          action: more-info
      - type: 'custom:button-card'
        color: auto-no-temperature
        color_off: 'rgb(54, 95, 140)'
        color_type: icon
        entity: sensor.anycubic_time_remaining
        name: Restart
        show_name: false
        show_state: true
        size: 34%
        tap_action:
          action: more-info

Welche Werte müssen händisch angepasst werden?

Es müssen die jeweiligen max-Werte in den Bar Cards angepasst werden, die festlegen mit welcher Bett- und Düsentemperatur gedruckt werden. Ebenso muss der vollständige Pfad zur Bilddatei angepasst werden. Danach ist die Konfiguration abgeschlossen.

Viel Spaß!