Node-Blue Title

Erst mal möchte ich mich für die lange Funkstille entschuldigen. Berufliches und der eigene Hausumbau fordern leider ihren zeitlichen Tribut. Dafür sind dadurch aber viele neue Themen auf den Tisch gekommen die ich verbloggen will und die euch hoffentlich interessieren.

Wie ihr ja wisst, bin ich großer Fan von Homegear. Einerseits weil ich denke, dass Sathya ein wirklich geniales und performantes Stück Software geschaffen hat und andererseits weil ich mit Homegear Geräte transparent in ein anderes Protokoll schieben kann. Dies habe ich mit MQTT in Verbindung mit node-red ja schon mehrfach genutzt.

Also, was ist node-blue?

node-blue ist wie node-red nur anders!

Node-blue ist die Logikengine von Homegear. Von „vorne“ sieht sie aus wie node-red (Editor), im Hintergrund läuft aber eine komplett neu entwickelte C++-Runtime.
Der Vorteil? Man ist nicht an die Begrenzungen gebunden die node.js mitbringt. Unter anderem ist die Verarbeitungsgeschwindigkeit massiv höher und es können mehrere Threads, also auch mehrere CPU-Kerne, verwendet werden.
Die aus node-red bekannten function-nodes werden bei node-blue mit PHP (nativ) oder Python (externer Prozess) programmiert anstatt mit JavaScript. Durch das Multithreading können hängende Nodes node-blue nicht lahmlegen.

Node-red erlaubt immer nur einen „Eingang“ pro Node und sieht auf direktem Weg keine boolschen Verknüpfungen (AND, OR, etc.) vor. Node-blue bringt eigene Nodes für diese Funktion mit – man kann damit also aus der SPS-Programmierung bekannte Logiken aufbauen ohne auf den eventbasierten Ansatz verzichten zu müssen.
Zusätzlich wurden die Debuginformationen an den Nodes im Editor gegenüber node-red erweitert.

Alle in Homegear bekannten Geräte und deren Variablen lassen sich einfach über einen node (variable-in) in den Flow übernehmen und werden bei Auftreten verarbeitet – also genauso wie bei node-red, nur dass hier nicht der Umweg über eine Schnittstelle (MQTT, WebSocket, etc.) oder einen zusätzlichen Node (Hue, API-x, etc.) genutzt werden muss.
Gleiches gilt für die Ausgabe von Werten über den variable-out-node.

But wait, there’s more!

Homegear Admin-UI

Seit Version 0.7.30 bringt Homegear ein eigenes Admininterface mit (http://<ip-host-homegear>:2001/admin/). Darüber lassen sich Geräte nun endlich logisch ordnen – also in Räume, Gruppen und Stockwerke einteilen, neue Geräte anlernen und verschiedene Wartungs- und Einstellungsaufgaben ausführen.
Über den Menüpunkt „Programmierung“ landet man dann auch schon direkt im node-blue Editor (http://<ip-host-homegear>:2001/node-blue/).

Homegear UI
Homegear UI

Außerdem ist ein Userinterface zur Bedienung in der Entwicklung, das man schon unter https://test.homegear.eu ausprobieren kann.
Eine erste Version kann über das Paket homegear-ui bereits installiert werden.

Die Oberfäche wurde zusammen mit der Hochschule Furtwangen entwickelt und macht einen sehr guten Eindruck. Ich bin gespannt wie die vielen Gerätetypen abgebildet und bedient werden.

Ein Programmierbeispiel

Um mal ein bisschen in node-blue einzusteigen, habe ich eine simple Musiksteuerung für meinen Logitechmediaserver programmiert. Unser WLan-Radio im Bad hatte sowieso gerade den Geist aufgegeben und so kam mein portabler Squeezebox-Player zum Einsatz.
Als Grundlage habe ich mir ein Beispiel von Job aus dem Homegear-Forum genommen und ein wenig erweitert. Der Flow sendet nach entsprechender Verarbeitung einfach die gewollten Kommandos per HTTP an den Server.

4-fach EnOcean Taster mit provisorischer Beschriftung

Zur Steuerung wird ein 4-fach EnOcean-Taster genutzt, der über einen USB300-USB-Stick an meine RaspberryPi hängt auf dem Homegear läuft. Die Taster benötigen keine Batterien und passen sich recht gut ins vorhandene Schalterprogramm ein.
Das Anlernen erfolgt als Rocker-Switch und ist mit der richtigen EEP kein Problem. Danach stehen unter der entsprechenden Geräte-ID die Kanäle des Schalters in Homegear/node-blue zur Verfügung.

Ein Taster liefert true solange er gedrückt ist, sowie man ihn loslässt wird ein false gesendet. Mit den entsprechenden node-blue nodes kann man so eine einfache Steuerung realisieren und auch das Halten der Taste auswerten.
Die Programmierung in den function-nodes ist eher simpel. Es werden nur ein paar Variablen gesetzt, die dann im unteren Teil des Flows in eine URL umgewandelt und gesendet werden.

Mit dem Playlist-Button (oben rechts) kann man durch die im cycle-playlist-node hinterlegte Liste von Streaming-URL’s schalten.
Eine Verbesserung die ich noch plane ist, dass man bei Doppelklick auf diesen Taster zum ersten Eintrag in der Playlist springt. Node-blue bringt für solch eine Funktion schon einen eigenen Node mit.
Es ist nicht immer leicht den Sender zu „erraten“ den man gerade hört und eine visuelle Ausgabe fehlt mir gerade 😉

Komplette Programmierung einer Squeezeboxsteuerung in node-blue

Der komplette Flow ist im oben verlinkten Homegear-Forum-Thread zu bekommen.

Wichtig: Leßt bitte in jedem Fall die Info der einzelnen nodes. Die Doku ist zugegebenermaßen noch etwas dünn, das Wichtigste was man zum Verständnis braucht, steht aber dort.

Fazit

Node-blue ist unheimlich schnell und die Programmierung geht – nach etwas Eingewöhnung – fast schneller von der Hand als bei node-red. Das ist vor allem der vorhandenen boolschen Logik-Engine zu verdanken. Man muss, wie bei allem was man neu anfängt, erst mal seinen Kopf dazu bekommen in den neuen Strukturen zu denken.

Nachteil an node-blue ist die aktuell dünne Dokumentation und die nicht wie von node-red gewohnte node-Vielfalt. Mit homegear-nodes-optional gibt es schon ein paar Erweiterungen, diese kommen an Vielfalt aber natürlich nicht an die schiere Masse bei node-red ran.
Hier gilt auch wieder der Open-Source-Gedanke: Wer mitmacht und vielleicht sogar eigene Nodes oder Dokumentation erzeugt, hilft allen die node-blue benutzen.

Homegear wird aktuell an allen Stellen weiterentwickelt und wird immer mehr zu dem, was man auch als nicht so technisch versierter Anwender gebrauchen kann. Die Einstiegshürde – auch zur Programmierung – wird immer niedriger.


Update

Die Weiterentwicklung des Flows zur Logitech-Mediaserver-Steuerung könnt ihr im Homegear-Forum verfolgen: https://forum.homegear.eu/t/flow-squeezebox/2664/7

Im Herbst letzten Jahres habe ich mir zu Hause eine Multiroom Audio Lösung mit dem Logitech Media Server in Verbindung mit node-red zur Automation gebaut. Der Artikel ist aus einem älteren Forenbeitrag entstanden.

Ich habe verschiedene Hardwarelösungen (nanoPi, nanoPiAir und RaspberryPi Zero) qualitäts- und kostentechnisch gegenüber gestellt. Den RasperryPi ZeroW gab es damals noch nicht.

Folgendes Funktionen sind bis jetzt umgesetzt:

  • Abspielen verschiedener Inhalte in verschiedenen Räumen
  • Synchrones Abspielen von einem Inhalt in mehrere Räumen
  • Jeden Player als Airplay-Empfänger nutzen
  • beliebiges ARM-Board/Linux als Squeeze-Player nutzen (RPi, RPi Zero, NanoPiNeo, NanoPiNeoAir jeweils mit USB Soundkarte)
  • Airplay-Geräte als Squeeze-Player nutzen (ginge auch mit Chromecast)
  • DLNA-Geräte als Squeeze-Player nutzen, leider dann nicht synchron möglich wegen Umwandlung
  • Abspielen MP3’s, Webradio, Youtube (Spotify geht, braucht aber einen kostenpflichtigen Account)
  • Anbindung an node-red um Lautsprecher ein/aus zu schalten wenn Musik läuft
  • Anzeige aktueller Titel, Steuerung Player per node-red
  • …more to come

Server

Der Logitech Media Server (Suqeezebox) läuft bei mir auf meinem x86/64 Server, den ich sowieso zu Hause habe. Auf diesem Server liegen auch meine über die Jahre gesammelten MP3’s. Es läuft Ubuntu 16.04.2 und installiert habe ich dann einfach die Debian-Pakete des LMS: http://wiki.slimdevices.com/index.php/Debian_Package
Das Ganze sollte aber genauso auf einem RPi mit einer USB-Festplatte funktionieren.

Der LMS hat ein Webinterface, das sich per http://<ip/host>:9000/ aufrufen lässt. Zugegeben, das ist ziemlich altbacken aber reicht für rudimentäre Bedienung und Konfiguration. Dort wird dann auch das Musikverzeichnis konfiguriert und das Durchsuchen angestoßen. Der LMS ließt die ID3-Tags und kategorisiert die Musik und macht sie durchsuchbar.

LMS selbst lässt sich per Plugins erweitern, auch aus Drittquellen. Dafür gibt es auch eine recht aktive Community. Wichtig waren für mich diese hier: https://github.com/philippe44
Ich betreibe den LMS ohne jeglichen Account (myqueezebox, etc.) – einzig einen Youtube-API Key musst ich bei Google erzeugen um die Youtube-Funktionalität zu nutzen.

Player

Als Player setze ich aktuell einen NanoPiNeo, einen RaspberryPi Zero, ein AppleTV und ein altes Noxon iRadio per DLNA ein. Als tragbaren Player nutze ich den NanoPiNeo Air:

Den NanoPiNeoAir kann ich nur eingeschränkt empfehlen, da mit ihm nur noch sehr schwer SSH-Kommunikation per WLAN möglich ist, wenn per USB Sound ausgegeben wird. Hatte dazu auch ne längere Diskussion im Armbian Forum https://forum.armbian.com/index.php/topic/3269-nano-pi-neo-air-unstable-wi-fi/
Aktuell läuft Ubuntu 16.04.1 bzw Debian Jessie auf den kleinen Dingern. Als Software nutze ich Squeezelite, das ich anhand dieser Anleitung installiert habe: http://www.gerrelt.nl/RaspberryPi/wordpress/tutorial-installing-squeezelite-player-on-raspbian/

Update 2017: Mit dem aktuellen Armbian kommt es kaum noch zu Problemen beim nanoPiAir.

Theoretisch lässt sich als Squeeze-Player auch ein altes Android Telefon nutzen oder ein RPi-1. Jeder Windows PC sollte genauso funktionieren. Ob ein Linux-Sat-Receiver auch geht, hab ich noch nicht geschaut.

Steuerung

Gesteuert werden kann der LMS natürlich durch das bereits erwähnte Webinterface. Richtig Spaß macht es aber erst mit einer passenden App auf dem Handy/Tablet. Unter Android habe ich Squeezer ausprobiert, was seinen Dienst tadellos erfüllt. Allerdings hab ich nur ein sehr sehr sehr sehr günstiges Android-Tablet zum probieren gehabt und ich glaube dadurch alleine blieb der Spaß auf der Strecke.

Schlussendlich habe ich iPeng 9 für iPad/iPhone gekauft. Mit 8,99€ wirklich happig, aber es lohnt sich in jedem Fall. Die App ist ordentlich geschrieben und bedient alle Möglichkeiten des LMS:

iPad

iPhone

node-red

Hier hab ich noch nicht so viel gemacht und nur den Player in der Küche angebunden. Ich prüfe jede Sekunde den mode des players und schalte bei play die Steckdose der Aktivboxen ein. Wenn auf pause gewechselt wird, wird 2 Minuten gewartet und dann die Steckdose wieder aus geschaltet.

Zusätzlich lasse ich noch im Dashboard anzeigen was gerade läuft. Da bin ich aber noch nicht ganz fertig.

(für „only when changed“ kann man natürlich auch den rbe-node nehmen)

Kosten

Kommen wir zum spannenden Teil, wo liegen die Kosten pro Player?

Die nanoPi’s habe ich direkt bei FriendlyElec bestellt, Lieferzeit ca. 3,5 Wochen. Mittlerweilse sind diese aber auch schon in DE bestellbar.

NanoPiNeo (Ethernet)
Board: 10€ (512MB)
SD-Karte 7€ (Sandisk 16GB)
GooBay 5V/2A Netzteil 7€
Generic C-Media USB Sound 3€
—–
28,-€

NanoPiNeoAir (WLan)
Board: 20€
IPEX Antenne ca. 5€
GooBay 5V/2A Netzteil 7€
Generic C-Media USB Sound 3€
(keine SD-Karte notwendig, da internes 8GB eMMC)
—–
35,-€

Präferierte Hardware

Empfehlen mag ich einen Raspberry Pi Zero mit PhatDAC. Der PhatDac ist eine „echte“ Soundkarte für den Rapsberry Pi Zero. Klanglich ist man dabei einfach in einer anderen Welt gegenüber den China-C-Media-USB-Soundkarten, das hört  sogar das ungeübte Ohr.

Raspberry Pi mit PhatDAC und WLan-Stick

Raspberry Pi Zero von thepihut (WLan)
Board: 4,50€ (4£)
PhatDAC 13,70€ (12£)
WiFi USB mini + OTG Adapter 8,50€
SD-Karte 7€ (Sandisk 16GB)
GooBay 5V/2A Netzteil 7€
—–
40,70€

Natürlich kommt da dann immer noch die gewünschte Aktivbox dazu. Für etwas qualitativ hochwertiges, sollte man schon um die 70-80€ ausgeben. Ein Sonos Play 1 ist also Preislich nicht ganz soweit davon entfernt.
Man muss für sich entscheiden ob der Bastellaufwand die Vorteile gegenüber dem Sonos aufwiegt.

Hier eine weitere Idee, wie man den Player schick in einer Regalbox verbauen kann: http://indibit.de/multiroom-audio-wlan-lautsprecher-selber-bauen/ – die Lösung mit den zwei Netzteilen hat mir nicht ganz so gut gefallen.

Update 2017: Durch den RaspberyPi ZeroW kann man die Kosten für den bevorzugten Player noch mal um 2,- € senken. Der ZeroW liegt bei 10,-£ und man benötigt dann eben keinen separaten WLan-Stick mehr.