Raspberry Pi Node.js Webserver installieren und GPIOs schalten

Node.JS ist eine Server Platform, welche Javascript verwendet. Ursprünglich für Googles Chrome Browser entwickelt, ist es sehr resourcensparend, was vor allem den EInsatz eines Raspberry Pi Node.JS Webservers interessant werden lässt. Zusätzlich zu den Vorteilen asynchroner Anwendungen bietet Node mit dem internen Paketmanager „npm“ eine sehr einfache aber mächtige Methode, um verschiedene Plugins bzw. Bibliotheken zu installieren und zu verwenden.

In diesem Tutorial wird das Aufsetzen und Konfigurieren eines Raspberry Pi NodeJS Servers gezeigt. Zusätzlich habe ich ein kleines Programm für Node geschrieben, womit die GPIOs des Raspberry Pi’s geschaltet werden können.

Ein NodeJS Server ist Voraussetzung für viele verschiedene Anwendungen, wie bspw. HomeBridge. Auch viele andere Projekte, wofür ein Server benötigt wird, können mit einem Raspberry Pi und NodeJS realisiert werden.

 

Benötigte Hardware

Aufgrund der besseren Leistung im Vergleich zu den Vorgängern und insbesonders wegen der ARMv8 Architektur empfehle ich einen Raspberry Pi 4. Daneben muss dein Router Portforwarding unterstützen, falls du die Anwendungen auch außerhalb deines Heimnetzwerks aufrufen willst. Ich empfehle hierfür eine FRITZ!Box o.ä.

Um das kleine Beispiel am Ende nachbauen zu können, wird zusätzlich noch benötigt:

Um das kleine Beispiel am Ende nachbauen zu können, wird zusätzlich noch benötigt:

Sofern du deinen Raspberry Pi nicht per Netzwerkkabel angeschlossen hast und das WLAN noch nicht konfiguriert ist, kannst du diesen Tutorials folgen, um es einzurichten (hier für Raspberry Pi 4, hier für vorherige Modelle).

Zusätzlich empfehle ich die Verwendung des SSH Zugriffs, sowie optimal von einem FTP Service, um einfach Dateien auf den Raspberry Pi zu übertragen.

 

Installation von Node.JS auf dem Raspberry Pi

Bevor wir Node installieren, updaten wir die Pakete und Paketquellen, um alles benötigte auf dem aktuellen Stand zu haben:

sudo apt-get update
sudo apt-get full-upgrade

Der Vorgang kann etwas dauern. Da Node.JS nicht in den vordefinierten Paketquellen ist, müssen wir es zuerst hinzufügen. Die aktuellste LTS Version kannst du auf der Node.JS Website einsehen und dementsprechend anpassen.

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

Nun können wir Node ganz einfach über den internen Paketmanaager installieren, wobei dies ein wenig dauern kann:

sudo apt-get install -y nodejs

 

Erster Test

Wenn die Installation soweit ohne Probleme durchgelaufen ist, können wir in der Konsole einfach folgendes ausführen, um zu sehen, ob alles geklappt hat:

node --version

Es sollte nun die aktuellste Version angezeigt werden.

Nun wollen wir mit einem kleinen Hello-World! Programm starten. Wir erstellen eine neue Datei.

sudo nano hello-world.js

Darin fügen wir folgenden Inhalt ein:

// Load the http module to create an http server.
var http = require('http');

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello World\n");
});

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");

Anschließend speichern und beenden wir den Editor (STRG+O, STRG+X). Du kannst den Server nun einfach starten, indem du im Terminal folgendes eingibst:

node hello-world.js

Im Webbrowser kann die Seite nun bereits im Browser aufgerufen werden. Dazu gibst du entweder die IP deines Pi’s im Netzwerk inkl. Port an (z.B. 192.168.1.68:8000) oder (sofern dein Router das unterstützt) einfach den Namen des Hosts inkl. Port. Bei mir ist dies http://raspberrypi:8000/

PS: Wir nutzen in diesem Beispiel Port 8000. Der Standardport für Webserver ist 80. Allerdings benötigt Node.js für Ports, welche unter 1000 liegen, Rootrechte.

Falls du dauerhaft von außerhalb deines Heimnetzwerks auf den Server zugreifen willst, macht es Sinn einen DNS Server zu installieren. Natürlich müssen die ausgewählten Ports auch in deinem Router per Port-Forwarding / Weiterleitung für die interne IP Adresse deines Raspberry Pi’s ausgewählt und freigeschaltet werden.

 

NPM – NodeJS Package Manager

Mit Hilfe des NPM (Node.js Package Manager) können sehr einfach zusätzliche Bibliotheken installiert werden und diese in einem Node Projekt verwendet werden. Üblicherweise hat ein erstelltes Projekt im Basisverzeichnis eine Datei namens „package.json“. In dieser Datei werden unter „dependencies“ jene verwendeten Pakete inkl. (minimal geforderter) Version eingetragen. Wenn bspw. ein Projekt später weitergegeben wird, müssen die erforderlichen Pakete erst installiert werden. Dazu wechselt man in das Verzeichnis, worin sich die package.json befindet und gibt ein:

npm install

Alle notwendigen Pakete werden installiert. Es ist allerdings nicht unbedingt notwendig, dass man seine verwendeten Pakete per Hand einträgt. Möchte man ein neues Paket verwenden (in unserem Fall sei es rpio) kann man den Parameter --save mit angeben und das Paket wird automatisch der package.json Datei hinzugefügt:

npm install rpio --save

Für weitere Befehle und Erläuterungen kannst du einen Blick in die NPM Dokumentation werfen.

 

NPM – NodeJS Package Manager

Sollte deine Beispieldatei noch laufen, kannst du sie mittels STRG+C beenden.

Ich habe eine kleine Anwendung geschrieben, mit der man seine GPIOs per Weboberfläche (Desktop PC Browser, Smartphone, Tablet) steuern kann. Da dies nur als kleines Beispiel dienen soll, ist damit lediglich der Output steuerbar. Allerdings ist es recht einfach auch GPIOs als Input zu definieren und diese auszulesen. Als Grundlage habe ich das NPM Package rpio genommen.

Für einen einfachen Test kannst du das Paket von Github klonen:

git clone https://github.com/tutRPi/Raspberry-Pi-Simple-Web-GPIO-GUI
cd Raspberry-Pi-Simple-Web-GPIO-GUI

Bevor wir den Server starten, müssen die weiteren Pakete installiert werden:

npm install

Anschließend kann der Raspberry Pi Node.JS Server gestartet werden. Da wir die GPIOs nutzen ist zwingender maßen der Aufruf per sudo nötig. Daher habe ich mich zusätzlich entschieden, den Server auf Port 80 laufen zu lassen, da wir so einfach über den Hostnamen bzw. interner IP des Pi’s darauf zugreifen können, ohne den Port anzugeben. Voraussetzung dafür ist, dass nichts anderes auf diesem Port läuft (wie bspw. Apache2). Wir starten also nun:

sudo npm start

Zurück im Browser erscheint das User Interface zum Steuern der GPIOs (keine Portangabe nötig). Dazu muss gesagt werden, dass die GPIOs anfänglich alle als „OFF“ angezeigt werden, auch wenn eine andere Anwendung davor einen der Pins angeschaltet hat. Das kommt daher, dass die Bibliothek leider nicht den Output Zustand der GPIOs auslesen kann. Zwar könnte man beim Starten der Web-App alle GPIOs auf den niedrigen Pegel setzen, aber darauf habe ich verzichtet. Wen dies stört, dem steht es natürlich frei das anzupassen.

node-js RaspberryPi configuration

Weiterhin habe ich das ganze mal aufgezeichnet, um zu zeigen, wie die Steuerung per Weboberfläche aussehen würde. Wer den Aufbau der Beispielsschaltung sehen möchte, kann dies hier tun. Im Grunde ist es aber recht simpel, da einfach nur an die einzelnen (steuerbare) GPIOs eine LED mit Vorwiderstand gehängt wurde.

 

Autostart des Raspberry Pi Node.js Servers

Als letztes wollen wir den Server noch automatisch nach dem Boot des Raspberry Pi’s starten lassen. Ansonsten würde sich der Server beim Herunterfahren beenden und müsste erneut per Hand aktiviert werden.

Bevor wir den Eintrag zum automatischen Starten von unserer Server Applikation erstellen können, müssen wir den Pfad, in dem sich Node befindet herausfinden (Standardmäßig ist dies /usr/bin/node).

pi@raspberrypi:~ $ which node
/usr/bin/node

Nun brauchen wir noch den kompletten Pfad, in dem sich unsere Javascript Datei (app.js) befindet. Mittels ls können wir uns die Dateien anzeigen lassen, die im Ordner vorhanden sind und mittels pwd den Pfad.

Diese beiden Werte kopieren wir, um gleich einen Eintrag erstellen zu können:

sudo crontab -e

Am Ende dieser Datei können Einträge hinzugefügt werden, welche z.B. nach einem Neustart oder zu einem gewissen Zeitpunkt ausgeführt werden sollen. Um unsere Anwendung nach dem Neustart automatisch starten zu lassen, fügen wir ans Ende der Datei folgende Zeile hinzu (ggf. Pfade anpassen):

@reboot sudo /usr/bin/node /home/pi/Raspberry-Pi-Simple-Web-GPIO-GUI/app.js &

Gespeichert wird mit STRG+O und beendet mit STRG+X (Nano Editor). Um zu überprüfen, ob alles funktioniert hat, kannst du den Raspberry Pi neustarten (sudo reboot) und danach noch einmal die URL aufrufen. Sollte die Seite angezeigt werden, hat alles geklappt.

Die Anwendungen, die du im Endeffekt auf deinem Raspberry Pi Node.JS Server laufen lassen kannst, sind fast unbegrenzt. Von der reinen GPIO Steuerung, über eine Oberfläche zur Hausautomatisierung hin zum Überwachungsserver für einzelne Dienste oder Sensoren. Durch den geringen Stromverbrauch des Raspberry Pi’s und dennoch vergleichsweise hohen Leistungsfähigkeit ist der Raspberry Pi ein idealer Server für kleine (Hobby-)Projekte.