bookmark_borderOctoPrint – Zugriff auf Systemfunktionen

OctoPrint läuft ja in den meisten Fällen unter einem normalen Nutzeraccount mit eingeschränkten Rechten. Dies bedeutet, dass wichtige Systemfunktionen wie das Herunterfahren oder Neustarten des Systems eigentlich nicht möglich sind.

Damit das funktioniert, müssen lediglich im System die relevanten Systembefehle für OctoPrint freigegeben werden.
Dies geschieht über entsprechende Einträge in der Sudo-Konfigurationsdatei /etc/sudoers bzw besser in einer eigenen, separaten Datei für OctoPrint: /etc/sudoers.d/octoprint
Dazu wird die Datei mittels sudo visudo -f /etc/sudoers.d/octoprint erstellt und die entsprechenden Befehle dort eingefügt.

octoprint ALL=NOPASSWD:/usr/bin/systemctl poweroff,/usr/bin/systemctl reboot,/usr/bin/systemctl restart octoprint,/sbin/ip

Der erste Eintrag octoprint gibt den Nutzernamen an, unter dessen Accout OctoPrint läuft. In meinem Fall eben der User „octoprint“.
Die nächsten Einträge ALL=NOPASSWD: bedeuten, dass der entprechende User alle folgenden Befehle ohne besondere Restriktionen und ohne Passwort ausführen darf.
Die drei systemctl-Befehle sind für das OctoPrint-Systemmenü, der letzte Befehl /sbin/ip für das „Network Health“-plugin.

bookmark_borderOctoPrint auf Orange Pi Zero

Bisher habe ich meinen 3D-Drucker mit einem alten Notebook angesteuert auf dem neben Prusaslicer noch RepetierHost installiert war. Die 3D-Modelle habe ich via Dateifreigabe oder USB-Stick auf den Laptop gebracht, dort gesliced und dann mit RepetierHost an den Drucker gestreamt.

Seit einiger Zeit (ich glaube seit Version 2.3) unterstützt der Prusaslicer das direkte hochladen der generierten G-Codes auf den Drucker bzw den vorgeschalteten G-Code-Streamer (Repetier Server, Octoprint, Astroprint, …)

Seitdem läuft auf dem Notebook eigentlich nur noch der Repetier Server über den ich vom Schreibtisch aus den Drucker bedienen kann..
Da ist der alte Laptop natürlich overkill und Platzverschwendung, -Monitor und Tastatur brauchts beim 3D-Drucker jetzt nicht mehr.

Ich habe hier noch einen Orange Pi Zero rumliegen, der soll ab jetzt den alten Laptop ersetzten und direkt in den 3D-Drucker eingebaut werden. Bisher habe ich den Repetier Server genutzt, da ich jetzt aber eh alles neu installieren muss, probiere ich mal OctoPrint aus.

Nachdem der Orange Pi Zero mit einem frischen Armbian Image gestartet wurde, kann’s mit der Installation losgehen.

Zuerst einmal das System auf den neuesten Stand bringen und die benötigten Pakete installieren:

sudo apt update
sudo apt upgrade -y
sudo apt install python3-pip python3-dev python3-setuptools python3-venv git libyaml-dev build-essential

Verbunden wird der Orange Pi Zero mit dem Drucker nicht über die USB-Schnittstelle, sondern direkt über die internen seriellen Schnittstellen. Dadurch entfällt ein potentieller Störfaktor und Flaschenhals in der Verbindung. Auch wenn die seriellen Schnittstellen unter /dev schon auftauchen, müssen die gpio-pins noch korrekt konfiguriert werden. Dies geschieht über sudo armbian-config .
Dort können unter System -> Hardware die benötigten Ports aktiviert werden. Nach einem Neustart lässt sich nun die benötigte Schnittstelle auch unter /dev/ttySx korrekt nutzen.

Entgegen der „offiziellen“ Anleitung werden ich für OctoPrint einen neuen Nutzer mit eigenem home-Verzeichnis anlegen, damit sämtliche Daten sauber getrennt bleiben.

sudo useradd -rm octoprint

Die OctoPrint-Installation erfolgt dann im Verzeichnis /srv/octoprint/

cd /srv
sudo mkdir octoprint
sudo chown octoprint:octoprint octoprint

Nun noch zum Nutzer „octoprint“ wechseln, die virtuelle Python-Umgebung erstellen und darin die Installation abschliessen.

sudo -u octoprint -H -s
cd /srv/octoprint
python3 -m venv .
source bin/activate
pip install pip --upgrade
pip install octoprint

Damit OctoPrint auf die seriellen Schnittstellen zugreifen kann noch schnell den Nutzer zu den benötigten Gruppen hinzufügen.

sudo usermod -a -G tty,dialout octoprint

Fertig!

OctoPrint kann jetzt direkt (als user „octoprint“!) gestartet werden mit

sudo -u octoprint -H -s
/srv/octoprint/bin/octoprint serve

Damit OctoPrint auch bei jedem Systemstart geladen wird, muss noch das Startscript /etc/systemd/system/octoprint.service mit folgendem Inhalt erstellt werden.

[Unit]
Description=OctoPrint
After=network-online.target
Wants=network-online.target

[Service]
Environment="LC_ALL=C.UTF-8"
Environment="LANG=C.UTF-8"
Type=simple
User=octoprint
ExecStart=/srv/octoprint/bin/octoprint

[Install]
WantedBy=multi-user.target

Dieses script wird nun noch aktiviert und direkt gestartet:

sudo systemctl --system daemon-reload
sudo systemctl enable octoprint
sudo systemctl start octoprint

OctoPrint ist jetzt aktiv und kann auf port 5000 erreicht werden.
http://mei.ne.ip:5000/

bookmark_borderremote mySensors serial gateway

Das mySensors gateway ist bei mir als serielles gateway fest mit einem seriellen Port eines Orange Pi Zero verdrahtet. Früher lief Home Assistant selber auch auf diesem Rechner, so dass der Zugriff auf das gateway direkt erfolgen konnte.

Mit dem Umzug von Home Assistant auf einen performanteren NUC Server hätte ich eigentlich auch ein neues mySensors-gateway bauen müssen, entweder als USB-Variante oder als Ethernet- bzw Wifi-gateway.

Den Aufwand habe ich mir vorerst erspart, indem ich den seriellen Port des Orange Pi auf einen TCP-Port mappe.

Dazu erstellte ich eine Datei /usr/local/bin/mysensors-eth.sh mit folgendem Inhalt:


#!/bin/bash

port=5003
serial=/dev/ttyS1
baudrate=b38400

#stty $baudrate -F $serial
#ncat --listen --broker --keep-open 0.0.0.0 $port &
#socat $serial TCP:127.0.0.1:$port
socat TCP4-LISTEN:$port,reuseaddr,fork $serial,$baudrate,raw,echo=0

Diese Datei wird jetzt ausführbar gemacht mit
sudo chmod +x mysensors-eth.sh

Damit die „Umleitung“ bei jedem Systemstart neu gesetzt wird muss noch eine systemd-unit erstellt werden. Dazu wird eine neue Datei
/etc/systemd/system/mysensors-eth.service mit folgendem Inhalt angelegt:


[Unit]
Description=mysensors-gateway serial to ethernet bridge
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mysensors-eth.sh

[Install]
WantedBy=multi-user.target

Diese unit muss jetzt nur noch aktiviert und erstmalig gestartet werden.


sudo systemctl daemon-reload
sudo systemctl enable mysensors-eth.service
sudo systemctl start mysensors-eth.service

Fertig! Ab jetzt kann das serielle gateway auch von anderen Rechnern als ethernet-gateway genutzt werden.

In Home Assistant zB lautet der entsprechende Eintrag in der configuration.yaml in meinem Fall:


mysensors:
  gateways:
    - device: "192.168.2.30"
      tcp_port: 5003
  optimistic: false
  persistence: true
  version: "3.2"

bookmark_borderHome Assistant core händisch installieren

Voraussetzung ist eine Python3.8 Installation. Debian 10 bringt leider nur Python3.7 mit, welche auch installiert sein sollte. Home Assistant ist damit zwar scheinbar noch lauffähig, allerdings spuckt die Installation einige Fehler und Warnmeldungen aus.
Daher installieren wir zusätzlich zur 3.7 erstmal manuell die Version 3.8.

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install python3 python3-dev python3-venv python3-pip libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential libopenjp2-7 libtiff5

Eine detaillierte Anleitung zur Installation von Python 3.8, verfasst von Pascal Roeleven, der auch die Python 3.8 backports bereitstellt, findet sich unter folgendem link in der Home Assistant Community.
Daher hier nur eine schnelle Kurzzusammenfassung. Falls etwas nicht klappt, im obigen Link nachschauen.

Zuerst den PGP-key für APT bereitstellen

wget https://pascalroeleven.nl/deb-pascalroeleven.gpg
sudo apt-key add deb-pascalroeleven.gpg

Anschliessend die APT-Quellen aktualisieren, d.h. folgenden Eintrag zur /etc/apt/souces.list hinzufügen ..

deb http://deb.pascalroeleven.nl/python3.8 buster-backports main

… und direkt Python3.8 installieren

sudo apt update
sudo apt install python3.8 python3.8-venv python3.8-dev

Jetzt kann’s mit der Installation von Home Assistant losgehen.

Home Assistant wird als neuer Nutzer mit eigenem Homeverzeichnis installiert:

sudo useradd -rm homeassistant

Während die Konfigurationsdateien später im home landen, wird Home Assistant selber in einem virtuellen Python-Environment im Verzeichnis /srv/homeassistant/ installiert.

Dazu ersteinmal das Verzeichnis erstellen und die Rechte dem neuen Nutzer homeassistant zuweisen.

cd /srv
sudo mkdir homeassistant
sudo chown homeassistant:homeassistant homeassistant

Die Installation wird dann in dem virtuellen Python Environment als Nutzer homeassistant durchgeführt. Wir wechseln also den Nutzer, gehen in das Installationsverzeichnis, installieren die virtuelle Python3.8 Umgebung und wechseln dann in diese hinein.

sudo -u homeassistant -H -s
cd /srv/homeassistant
python3.8 -m venv .
source bin/activate

noch schnell ein notwendiges Python-Paket installieren mit

python3 -m pip install wheel

und im Anschluss

pip3 install homeassistant

et voilà! … naja, fast. Prinzipiell kann Home Assistant jetzt direkt über die Kommandozeile mittels Eingabe von hass gestartet werden. Aber wenn wir schonmal dabei sind, dann richtig.
Erstmal wechseln mit exit wieder zurück zu unserem eigenen Account.
Damit Home Assistant mit jedem Neustart des Rechners automatisch aktiviert wird, erstellen wir das System-Startscript /etc/systemd/system/homeassistant.service mit folgendem Inhalt:

[Unit]
Description=Home Assistant
After=network-online.target

[Service]
Type=simple
User=homeassistant
WorkingDirectory=/home/homeassistant/.homeassistant
ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Dieses script wird nun noch aktiviert und direkt gestartet:

sudo systemctl --system daemon-reload
sudo systemctl enable homeassistant
sudo systemctl start homeassistant

Home Assistant ist jetzt aktiv und lauscht auf port 8123.
http://mei.ne.ip:8123/
Der erste Start dauert allerdings ein wenig, es kann also sein, dass die Verbindung nicht auf Anhieb klappt.

Um Home Assistant später zu aktualisieren

sudo -u homeassistant -H -s
cd /srv/homeassistant
source bin/activate
pip install --upgrade homeassistant

bookmark_borderESPhome händisch installieren

Voraussetzung ist eine Python3 Installation

sudo apt-get install python3 python3-dev python3-venv python3-pip libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential libopenjp2-7 libtiff5

ESPhome wird als neuer Nutzer mit eigenem Homeverzeichnis installiert:

sudo useradd -rm esphome

Während die Konfigurationsdateien später im home landen, wird die ESPhome Installation selber in einem virtuellen Python-Environment im Verzeichnis /srv/esphome/ installiert.

Dazu ersteinmal das Verzeichnis erstellen und die Rechte dem neuen Nutzer esphome zuweisen.

cd /srv
sudo mkdir esphome
sudo chown esphome:esphome esphome

Die Installation wird dann in dem virtuellen Python Environment als Nutzer esphome durchgeführt. Wir wechseln also den Nutzer, gehen in das Installationsverzeichnis, installieren die virtuelle Umgebung und wechseln dann in diese hinein.

sudo -u esphome -H -s
cd /srv/esphome
python3 -m venv .
source bin/activate

noch schnell ein notwendiges Python-Paket installieren mit

python3 -m pip install wheel

und im Anschluss

pip3 install esphome

et voilà! … naja, fast. Prinzipiell kann ESPHome jetzt direkt über die commandline verwendet und gestartet werden. Aber wenn wir schonmal dabei sind, dann richtig.
Erstmal wechseln mit exit wieder zurück zu unserem eigenen Account.
Damit ESPHome mit jedem Neustart des Rechners automatisch aktiviert wird, erstellen wir das System-Startscript /etc/systemd/system/esphome.service mit folgendem Inhalt:

[Unit]
Description=ESPHome Dashboard
After=homeassistant.service
Requires=homeassistant.service

[Service]
Type=simple
User=esphome
Environment="PATH=/srv/esphome/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
WorkingDirectory=/srv/esphome/
ExecStart=/srv/esphome/bin/esphome /home/esphome/config/ dashboard --password GEHEIMESPASSWORT
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Dieses script wird nun noch aktiviert und direkt gestartet:

sudo systemctl --system daemon-reload
sudo systemctl enable esphome
sudo systemctl start esphome

ESPHome ist jetzt aktiv und lauscht mit dem Dashboard auf port 6052. http://mei.ne.ip:6052/

Um später ESPHome zu aktualisieren

sudo -u esphome -H -s
cd /srv/esphome
source bin/activate
pip install -U esphome

Möchte man die neuesten Funktionen nutzen, kann es Sinn machen, auch mal die Beta-Version auszuprobieren:

sudo -u esphome -H -s
cd /srv/esphome
source bin/activate
pip install --pre -U esphome