In diesem Artikel beschreibe ich ein eher nerdiges Thema, welches mir Anfang April 2022 in den Sinn kam. Damals hatte ich auf Facebook einen Artikel in der Waterrower Community gepostet, welcher durch die Moderatoren wenigen Minuten später gelöscht wurde.
Ich hatte gegen die Community Guidelines verstoßen und über ein Rudergerät geschrieben, welches kein Original Waterrower ist 😬🤯
Daraufhin habe ich meine Frage erneut eingestellt, aber wie das so ist – ohne Fotos oder Bilder kann sich so gut wie niemand etwas darunter vorstellen. Nun habe ich mein Projekt „Glow Row“ also umgesetzt und beschreibe in diesem Artikel wie ich LEDs mit dem Waterrower verbunden habe.
Inhalt
Farbige LEDs und Rudergeräte
Ehre wem Ehre gebührt. Die Idee mit den LEDs ist ursprünglich nicht von mir, zunächst hatte ich es bei dem Miweba Rudergerät gesehen, anschließend hat ein findiger Produktmanager die Idee mit dem WRX 1000 bei Sportstech weiterentwickelt. Das hat mir gut gefallen, jedoch fand ich die Umsetzung nicht 100% optimal.
Nachdem Smartrow das FTMS Broadcasting Update herausgebracht hat, war mein Interesse geweckt wie man an die Daten aus dem Rudergerät herankommen könnte, um diese für ein Hobbyprojekt zu nutzen.
Und dann wollte ich mich schon seit 2 Jahren mit smarter Weihnachtsbeleuchtung beschäftigen, habe dies jedoch kurz vor Weihnachten nie rechtzeitig geschafft. Meine Kinder finden sowas bspw. super, ob meine Nachbarn auch so denken?
Diese Faktoren haben also letztendlich zu dem Projekt geführt, den Waterrower mit farbigen LEDs zu beleuchten, angepasst an die Herzfrequenz und die generierte Kraft.
Wie habe ich die LEDs mit dem Waterrower verbunden?
Ich nutze einen Waterrower in der Ausführung Performance Ergometer. In diesem ist die Smartrow Rolle bereits integriert, diese kann aber auch in manche Holzrudergeräte nachgerüstet werden. Mit der Smartrow Rolle gibt es eine Smartrow App, welche bei mir auf einem iOS Gerät läuft.
Edles Design gepaart mit Hightech-Messung auf Goldstandard-Niveau: Der Waterrower Performance Ergometer passt in das Wohnzimmer, zeitloses Design in vollendeter Form.
1.599€ inkl. Versand | Bei Nohrd kaufen |
Früher habe ich auch das ein oder andere Mal gelötet, meinen ersten Lötkolben habe ich als Teenager von meinem Patenonkel erhalten. Rückblickend muss ich sagen, dass er es genau richtig gemacht hat: Lötzinn, Krokodil-klemmen, Draht, ein 9V Block, eine Platine und eine kleine Glühbirne und los ging es.
Allerdings hat sich mein Interesse dann doch eher auf die Software als die Hardware gerichtet, und so war mein erster Gedanke bei dem Projekt ob ich LEDs finde, die man mit einer REST API ansprechen kann. Philips Hue bietet sowas bspw. an, jedoch war ich etwas davon abgeschreckt mir zunächst einen Gateway zu kaufen, um anschließend die LEDs zu steuern. Die Lightstrips fangen bei 60€ für 2m an, zusätzlich braucht man dann noch die Hue Bridge für 40€, um die LEDs über die API anzusprechen.
Ich habe nach Alternativen gesucht und bin dann beim WLED Projekt gelandet. Davon hatte ich bereits etwas gelesen, als ich mich mit der zuvor erwähnten Weihnachtsbeleuchtung beschäftigt hatte. Bei Aliexpress konnte ich die dafür erforderlichen Komponenten dann einzeln kaufen, insgesamt kam ich auch auf ca. 82€, jedoch für mehr LEDs (verglichen mit Philips) und der Option die LEDs besser anzusprechen. Löten musste man dafür auch nicht unbedingt.
Die Idee des Projektes ist einfach erklärt:
- Die Smartrow App erhält die Daten vom Rudergerät bzw. der Smartrow Rolle und schickt diese über den Bluetooth Broadcast
- Ich lese diese Daten auf meinem MacBook oder RaspberryPi über einen Bluetooth Adapter aus
- Es gibt eine REST-API um LEDs zu steuern, in meinem Fall von WLED
- Passend zur Herzfrequenz oder der Intensität des Zuges leuchten die LEDs. Hierfür nutze ich den Polar H10 Sensor.
- Optional: Ein Webinterface um Einstellungen für die LEDs oder die maximale Herzfrequenz anzupassen
Hier die schematische Zeichnung:
Welche Teile nutze ich für die Beleuchtung?
Mein Einstieg in die WLED Welt wurde maßgeblich durch Tutorials und Getting Started Artikel erleichtert. Ich habe dadurch sehr viel gelernt. Danke dafür!
Die schwierigste Frage für mich war, welches Board ich nutze, um die LEDs anzusprechen. Zuerst hatte ich mich für ein NodeMCU CH340 Board entschieden, dann jedoch festgestellt dass es auch Boards mit Batterie gibt, da ich jedoch sowieso für die LEDs eine Stromquelle benötige, wurde diese Idee wieder verworfen. Überlegt, ob ein ESP32 Board mit Bluetooth ggf. einen Vorteil bringen könnte und schlussendlich dann doch das sehr günstige NodeMCU CH340 Board bestellt 😀
Bzgl. der LEDs habe ich mich für 3 Bereiche entschieden:
- 1 Ring mit 45 LEDs, 12cm Durchmesser, leider gab es keinen größeren, eigentlich hat man Platz unter dem Wassertank für insgesamt 26 cm Durchmesser
- 2 x 2m mit 60 LEDs unter den Schienen
- 2 x 1m LEDs mit 30 LEDs unter dem Fußboard
Ich möchte die LEDs so „unsichtbar“ wie möglich machen, wenn diese nicht in Aktion sind, so habe ich diese jeweils nur unter dem Waterrower positioniert.
Neben den eigentlichen WS2812B LEDs habe ich außerdem noch folgende Produkte bestellt:
- Ein 5V, 20A Netzteil – laut diesem Artikel von Stefan Kröll benötigt eine LED 0,06A bei voller Farbe (weiß). Insgesamt habe ich 225 LEDs, also 13,5 Ampere, somit müsste das Netzteil großzügig dimensioniert sein
- Eine große Packung Schrumpfschlauch, die kann man eigentlich immer gebrauchen 😀
- Etwas Verbindungsdraht um die LEDs, den Controller und das Netzteil zu verbinden
- Ein besonderes Klebeband, welches sich auch wieder einfach entfernen lässt. Hier habe ich lange überlegt, wie ich die LEDs am Waterrower möglichst rückstandslos etwas befestigen kann. Letztendlich habe ich dieses hier bestellt, das Produktvideo sah überzeugend aus. Ähnlich wie Tesa Powerstrips, allerdings günstiger und in der 2m Rolle.
- Ein paar Jumper, zum Testen und verbinden der LEDs mit dem Mikrocontroller
Inklusive Versand kam ich auf 81,59€ – das ist aus meiner Perspektive vergleichsweise günstig für ein Hobbyprojekt, zumal die Komponenten wiederverwendbar sind.
Ein Anschlusskabel für das Netzteil an die Schuko-Steckdose hatte ich noch zu Hause. Ebenfalls ein paar Klemmen bzw. Lötzinn zum Verbinden der Kabel.
0x2AD1 – Rower Data!
Wie komme ich an die Daten? Zunächst war mein Ansatz frustrierend. Ich wollte das „mal eben nebenbei“ in NodeJS schreiben, mit Fullstack Javascript beschäftige ich mich bereits eine Weile und dachte mir, wenn es NPM Pakete wie node-bluetooth gibt, dann dürfte das doch relativ einfach und schnell möglich sein, meinen Herzfrequenzgurt Polar H10 auszulesen. Weit gefehlt – entweder hatte ich die falschen Suchbegriffe, oder schlicht den falschen Ansatz. Weder auf dem Macbook noch auf dem Raspberry Pi konnte ich das Bluetooth Modul dazu bewegen Daten auszugeben.
Ich hatte zuvor noch nie mit Bluetooth gearbeitet, meine Vermutung war dass es schwierig sei mit einer hardware-fernen Sprache wie NodeJS damit zu kommunizieren. Mit homebrew hatte ich noch blueutil ausprobiert, um zumindest im Terminal Herzfrequenzdaten zu sehen, allerdings kam ich damit auch nicht wirklich voran.
Standing on the shoulders of giants
Somit hatte das Projekt erst einmal abgehakt und mich auf andere Dinge konzentriert. Dann bin ich nach ein paar Wochen mit einem frischen Kopf an die Sache heran gegangen und wurde hier bei Jake Lear fündig. Er hatte noble verwendet, welches auch bereits ein paar Jahre alt ist. Mittlerweile ist das Paket @abandonware/noble zu empfehlen, um Patches und Updates zu erhalten. Dieses hat bei mir auf MacOS auf jeden Fall auf Anhieb funktioniert, so wie ich es Anfangs gehofft hatte. Bluetooth scheint ja doch einfach zu sein 😀 Vermutlich jedoch nur weil es so viele Open Source Entwickler gibt und sowas wie Abandonware. Kudos!
Der erste Schritt war somit geschafft, ich habe Daten aus dem Herzfrequenzgurt erhalten. Dank Jake war das recht einfach, der H10 kommuniziert genauso wie der H7. Also habe ich mir noble angeschaut. Wenn ich damit die Herzfrequenz auslesen kann, dann dürfte es mit dem FTMS Broadcast auch funktionieren.
Dabei habe ich gelernt, dass es 16bit Service UUIDs gibt und da Smartrow etwas von FTMS geschrieben hatte, nahm ich an, dass es der Bluetooth Service 1826 für Fitness Machine sein müsste. Ebenfalls gibt es dann einen „GATT Characteristic and Object Type“, die habe ich mir alle angeschaut und 2AD1 übermittelt „Rower Data„, meine Vermutung war, dass dort etwas ankommen müsste, wenn ich am Rudergerät ziehe.
Und so war es, ich habe zunächst alle 18 Werte des Arrays durchprobiert und mit der Smartrow App verglichen, woraufhin ich bereits ein paar Werte zuweisen konnte.
Um es mir einfacher zu machen, habe ich schließlich noch bei Smartrow selber nachgefragt, was dort eigentlich übermittelt wird. Folgende Rückmeldung habe ich nach kurzer Zeit vom Entwickler erhalten:
0-1: FTMS flags field
2: Stroke rate in SPM*2
3-4: Stroke count
5-7: Distance in meters
8-9: Actual split time in seconds
10-11: Average split time in seconds
12-13: Actual power in watts
14-15: Average power in watts
16 (optional): Current heartrate in BPM
17-18: Current workout time in seconds
Erst danach kam ich auf die Idee einmal in die Spezifikation für Rudergeräte zu gucken (Seite 199). Dort sind nicht nur die Datentypen beschrieben, sondern auch an welchen Bit Nummern diese übermittelt werden. Das Flag Field hatte mich zunächst irritiert, die Spezifikation beschreibt es jedoch in allen Details.
Eine Sache, welche mir bereits bei der Nutzung von Kinomap aufgefallen war, ist dass mit dem FTMS Broadcast ebenfalls die Herzfrequenz übergeben wird. Das wurde durch die Rückmeldung von Smartrow dann nochmal bestätigt. Durch das Abrufen der Smartrow Daten, kann ich mir demnach sparen ebenfalls mit dem Brustgurt direkt zu verbinden, da die Daten „durchgeschleust“ werden, sofern die Herzfrequenz von der Smartrow App ausgelesen wird. Folgende Werte habe ich Anfangs ausgelesen:
- 3 = Stroke count
- 5 = Distance
- 12 = Current Power in W
- 16 = Heartrate
Diese Daten mussten somit nur noch verarbeitet werden, um anschließen die JSON API entsprechend anzusprechen.
WLED JSON API
Insgesamt waren es 3 Pakete, die mit der Post kamen. Die letzte Hardwarelieferung aus China kam nach 14 Tagen an und enthielt den Mikrocontroller. Der Chip konnte einfach per USB geflashed werden und war anschließend nach kurzer Konfiguration im Netzwerk verfügbar. Ich hatte mit diesem Problem des Bootens kurz zu tun, das hat etwas gebraucht, bis ich es als Solches erkannt hatte. Ein kurzer Test der LEDs hat gezeigt, dass diese funktionieren und angesprochen werden können:
Der zweite Schritt in der Entwicklung war nun also die LEDs über die JSON API anzusprechen. Das Webinterface des WLED Controllers habe ich Anfangs benutzt, um die verschiedenen Effekte und Farbeinstellungen sowie Segmente kennen zu lernen. die API habe ich dann über curl getestet, das hat mich etwas ernüchtert:
curl -X POST "http://glow-row.local/json/state" -d '{"on":"t","v":true}' -H "Content-Type: application/json"
Das Absenden des Befehls hat für mich gefühlt zu lange bis zur tatsächlichen Änderung gedauert. Ein Nachmessen hat es bestätigt:
time_namelookup: 5.013418s
time_connect: 5.113758s
time_appconnect: 0.000000s
time_pretransfer: 5.113976s
time_redirect: 0.000000s
time_starttransfer: 5.129002s
———-
time_total: 5.129278s
mDNS funktioniert nur auf dem Mac und ist nicht sehr performant. Die optimierte Version mit der IP Adresse war damit dann jedoch schnell gefunden:
curl -X POST "http://192.168.1.47/json/state" -d '{"on":"t","v":true}' -H "Content-Type: application/json"
time_namelookup: 0.007014s
time_connect: 0.106345s
time_appconnect: 0.000000s
time_pretransfer: 0.106541s
time_redirect: 0.000000s
time_starttransfer: 0.120509s
———-
time_total: 0.120677s
0,12 Sekunden für den Farbwechsel müssten funktionieren.
Nun galt es lediglich noch die Daten aus Smartrow mit der API zu verbinden, also in Echtzeit die Befehle an die API zu schicken.
Ich habe es einfach mal getestet, in Echtzeit die Daten an WLED weiterzureichen und das hat funktioniert. Tatsächlich war ich mir Anfangs nicht sicher, ob das häufige Schicken an die API ggf. zu viel Last bringen könnte und ein Throttling nötig wäre, ich habe dies schlicht so gelöst, dass nur bei einem Zug am Rudergerät die Daten an WLED weitergegeben werden.
Wie sollen die LEDs leuchten?
Bei dem Sportstech WRX 1000 gibt es folgende Einstellungen:
- Herzfrequenz: Blau = 1 – 50 %, Aqua = 50 – 57 %, Grün = 58 – 65 %, Gelb = 66 – 73 %, Orange = 74 – 81 %, Rot = 82 – 89 %, Magenta/Violett = 90+ %
- Leistung: Blau = 1 – 100, Aqua = 101 – 150, Grün = 151 – 200, Gelb = 201 – 250, Orange = 251 – 300, Rot = 301 – 350, Magenta/Violett = 350+
Mir hat diese Einstellung nicht wirklich zugesagt, wenn es schon Farben für die Herzfrequenzzonen gibt, so sollten diese auch meiner Meinung nach genutzt werden:
So habe ich die Zonen und Werte von Polar übernommen und die LEDs anhand dieser Zonen leuchten lassen. Das ist quasi der „Quite Mode“, denn die Zone ändert sich nicht all zu schnell. Vielleicht 5 bis 10 mal bei einem Training. Je nachdem, was für eine Art von Training gewählt wird. Bei einem HIIT Workout passiert es häufiger als bei Steady State.
Durch die übergebene Leistung in Watt kann zusätzlich noch eine Intensität für die LEDs übergeben werden. Oder aber die LEDs bewegen sich anhand der Zuglänge und Intensität von vorne nach hinten und zurück.
Außerdem bietet WLED noch eine Reihe von Effekten an. Wie das aussieht kann man am Besten im Video sehen 🙂
Glow Row
Am Besten wird es sichtbar, wenn der Raum etwas abgedunkelt ist. Without further Ado: Hier sieht man das Ganze nun in Aktion.
Take it from here
Wow, das war ein langer Artikel, so war das eigentlich nicht geplant. Respekt, wer bis hier durchgehalten hat. ✊
Hier gibt es den Code bei Github. Die Liste der Dinge, die man für WLED benötigt ist oben aufgelistet. Unter den Smartrow Nutzern gibt es ggf. den ein oder anderen Menschen, der das Ganze nachbauen und erweitern oder verändern möchte.
Ein LED Panel, um die aktuelle Kraft auszugeben? Die verbleibenden Meter oder Zeit mit LEDs darstellen oder die LEDs auf Basis anderer Werte aus Smartrow leuchten lassen?
Für mich war es ein nettes Projekt, ich habe etwas über Bluetooth und Weihnachtsbeleuchtung gelernt und das Ganze noch mit meiner Freude am Rudern verbunden. Feedback natürlich immer willkommen!
Folge mir bei Strava
4 Antworten auf „Waterrower Smartrow mit Herzfrequenz LEDs – Glow Row“
Great job, thanks for sharing!
Thanks, Mike!
spannend – müsste eigentlich auch mit iobroker gehen (es gibt ein REST-API Modul), von da aus in die zigbee-Welt oder wohin auch immer. Dann kann man die Jalousie aufmachen, die Heizung runter drehen oder was auch immer 😀
Besten Dank für Deinen Kommentar, Thomas! iobroker habe ich schon länger im Blick gehabt, bisher nie die Zeit dafür genommen. Werde ich demnächst einmal ausprobieren.