Nanoleaf Lines | Protokoll Reverse Engineering

Es war Anfang 2022, Pandemie und ich hatte nichts zu tun. Daher habe ich mir zu dem Zeitpunkt die noch relativ neuen Nanoleaf Lines gekauft. Nicht um sie an die Wand zu hängen, sondern um herauszufinden wie diese untereinander kommunizieren.

Die Lines bestehen aus Modulen, die immer gleich sind und an einander gereiht werden um verschiedene Formen zu bilden. Dabei gibt es verschiedene Typen von Modulen. LED Module, Verbinder und Taster. Prinzipiell kann jedes Modul an jeder Stelle verbaut werden.

2022 habe ich angefangen und bin schon relativ weit gekommen. Ich hatte das Ziel eigene kompatible Module zu bauen. Dies hat auch gut geklappt. Allerdings gab Chipmangel und ein Wechsel auf einen anderen Chip war auch keine Option.

Nun ist es 2024, Chips sind wieder verfügbar und das eingestaubte Projekt muss fortgeführt werden.

Systemdaten

  • 42V Netzteil – Spannungs wird durch alle Module durchgeschleift
  • Wlan Controller – kommuniziert mit der App bzw. offene API
  • Modulkommunikation: 3.3V UART, 1M BAUD, 8N1 Single Wire Half Duplex

LED Modul

Das LED Modul hat 2 Anschlüsse mit je 3 Pins (42V, GND, UART). Es besitzt 2x 12 RGB LED und 2x 12 White LED. Diese beiden Gruppen sind jeweils in Reihe geschaltet und können vom Controller unterschiedlich angesteuert werden. Das Modul besitzt des weiteren eine Touchfläche auf der Oberseite. Damit können Gesten erkannt werden.

Das Modul kann in beiden Richtungen eingebaut werden, die Einbaurichtung wird bei der Initialisierung automatisch erkannt.

An ein LED Modul kann immer nur ein 6-eckiger Verbinder angesteckt werden.

Verbinder (Connector/ Puck)

Die Verbinder haben 6 äußere Anschlüsse, jeder Anschluss hat die gleichen 3 Pins (42V, GND, UART). Außerdem gibt es Anschlüsse für ein Tasterbedienteil, dies wird auf den Verbinder geclipst. An jeden der 6 Anschlüsse kann ein LED Modul angeschlossen werden und somit der Aufbau erweitert werden. So können verschiedene Formen entstehen.

Der Verbinder hat keine Richtungsvorgabe, jeder Anschluss kann in jeder Richtung verbaut werden. Eine Erkennung der Ausrichtung passiert während der Initialisierung.

Kommunikation

Reset

Mit einem Reset Befehl werden alle Module resettet und sind dann „unkonfiguriert“.

Initialisierung
  • Struktur erkennen: Dafür wird ein Befehl vom Modul empfangen und an die anderen Module weitergeleitet. Jedes Modul antwortet darauf und gibt seinen Anschluss Pin zurück sowie welche Module an anderen Pins angeschlossen sind. Der Controller kann aus der Struktur der Antwort erkennen wie die Module zusammengesteckt sind.
  • Version: Sobald die Struktur des Netzwerkes bekannt ist fragt der Controller jedes Modul an welche Version es hat. Durch einen „Header“ weiß das jeweilige Modul ob es angesprochen ist. Ansonsten wird es durchgeleitet. Eine Antwort erhält 2 Versionsnummern in ASCII und einen CRC.
  • Seriennummer: Ähnlich wie bei der Version liefert hier jedes Modul seine Seriennummer + CRC zurück. Die Seriennummer ist die UID vom Mikrocontroller.

Mit diesen 3 Schritten ist die Initialisierung abgeschlossen. Der Controller weiß wie die Struktur aussieht und kennt alle Modul Versionen. Daraufhin kann der Controller entscheiden Updates durchzuführen oder den Normalbetrieb aufzunehmen.

Zyklische Abfrage

Bei der zyklischen Abfrage liefern LED Module den Wert der Touchfläche, und die Verbinder den Wert der eventuell aufgesteckten Taster zurück. Mit einem dritten Wert können Module sich „neu“ anmelden, falls sie neu angesteckt wurden. Daraufhin wird die Initialisierung erneut durchgeführt. Jede Modul antwortet mit 2 Bytes.

Farbbefehle

Es gibt unterschiedliche Farbbefehle. Zum einen spezifisch auf ein Modul zugeschnittene Befehle als auch „globale“ Befehle, wie z.b. Helligkeit.

  • Helligkeit: Hier wird die Helligkeit für das ganze Netzwerk gesetzt
  • Farbe: Beim Farb-Command wird die Einstellung für jedes Modul übertragen. Jeder Farb-Command besteht aus einem Längenbyte und dem Payload. Es wird immer das ganze Netzwerk übertragen. Es gibt verschiedene Commands. Diese Werden in umgekehrter Reihenfolge gesendet. Die letzten Daten gehören zum ersten Modul. Dadurch werden die Daten bis zum letzten Modul immer kürzer. Für die Verbinder gibt es immer ein 2 Byte (Länge + Payload) langen „Platzhalter“. Für LED Module, die die Farbe nicht ändern sollen gibt es einem Dummy Command mit 3 Bytes (Länge + Dummy links + Dummy rechts).

Weiteres Vorgehen

Der aktuelle Stand ist. Der Code für die Kommunikation ist komplett fertig. Sowohl meine selbst gebauten Verbinder sowie LED-Module funktionieren und verhalten sich wie originale Module. Erkennung von neu angesteckten Modulen funktioniert noch nicht vollständig. Dies ist aber ein eher kleines Problem, da dies für den Normalbetrieb nicht benötigt wird.

Der nächste Schritt ist das decodieren der Farbbefehle und der Farbabgleich der LEDs.