Hallo zusammen,
ich gehöre seit einigen Tagen auch zum illustren Kreis der ESPuino Besitzer. Nach dem Aufbau und 3D Druck des Gehäuses (hierzu bei Gelegenheit mal ein eigener Post) habe mich mich dran gesetzt um die Box in das Homeautomation System meiner Wahl - nymea - einzubinden.
Ich könnte mir vorstellen, dass das für den ein oder anderen interessant ist, daher hier eine kurze Projekt Vorstellung.
nymea
nymea hat aktuell nicht den Bekanntheitsgrad von Home Assistant, FHEM oder OpenHAB, daher zunächst ein paar Infos. Der große Vorteil von nymea liegt meines Erachtens darin, dass die Software recht Einsteiger freundlich ist. Während man bei anderen Lösungen vielfach Dinge in Konfigurationsdateien einrichten muss, läuft hier alles über die UI / App die es für alle möglichen Betriebssysteme kostenlos gibt. Beim Einrichten von Geräten macht sich nymea Netzwerk Discovery zunutze, so dass Geräte super einfach eingerichtet werden können. Ein MQTT Broker ist ebenfalls enthalten und man braucht keine zusätzliche Software wie Mosquitto.
Selbstredend ist nymea open source und kann recht einfach auf einem Raspberry PI installiert werden.
ESPuino Plugin
Ich habe mich nun dran gesetzt ein Plugin für nymea zu schreiben, welches einen ESPunio per MQTT verbindet. Man kann dann den aktuellen Status in der UI sehen, die Lautstärke ändern, die Buttons sperren, den Schlafmodus aktivieren, usw. Des weiteren macht sich das Plugin die REST API zunutze um den Inhalt der SD Karte anzuzeigen, so dass man auch direkt über die UI Dateien abspielen kann.
Ich habe ein kurzes Video aufgenommen um die Einrichtung und die aktuellen Funktionen zu zeigen:
Das Einrichten läuft hierbei wie folgt ab:
- nymea findet ESPuino über mDNS.
- Hat man den gefundenen ESPuino ausgewählt, dann erstellt nymea einen MQTT channel im internen broker (samt Benutzer Account für den ESPuino).
- Das Plugin nutzt nun die Websocket API um die MQTT Einstellungen (hostname, port, username, password) direkt auf dem ESPuino zu setzen.
- Danach startet das Plugin den ESPuino neu um die Einstellungen zu übernehmen.
- Damit ist die Einrichtung abgeschlossen. Von nun an verbindet sich der ESPuino nach dem Einschalten immer automatisch mit nymea.
Magie
Regel basierte Automatisierungen werden in nymea Magie genannt. Hier noch eine kleine Spielerei, um zu Zeigen was mit Homeautomation möglich ist. In diesem Video habe ich eine ‚Schlafen‘ Magie erstellt. Diese fährt die Rolläden runter, sobald Abends per Karte etwas abgespielt wird. Hat man Zigbee Lampen verbunden, dann könnte man jetzt auch noch das Nachtlicht einschalten.
Status und Code
Wie ihr sehen könnt funktioniert das ganze schon recht gut. Es gibt aber noch ein paar Kleinigkeiten, die ich noch beheben will, bevor ich einen Pull Request für nymea erstelle. Falls Interesse besteht: der Plugin code findet sich hier.
Zudem habe ich gesehen, dass ja auch gerade ein Refactoring des Webinterfaces stattfindet. Vermutlich macht es Sinn die Änderungen auch noch abzuwarten.
Feedback MQTT in ESPuino
Zu guter Letzt sind mir auch noch ein paar Kleinigkeiten in der ESPuino Software aufgefallen. Ich hoffe es ist ok diese hier zu erwähnen. Vielleicht kann @biologist mir ja sagen, welche der Änderungen akzeptabel sind? Einen Teil davon kann ich vermutlich selbst implementieren und einen PR stellen.
- [ ] mDNS: Aktuell fehlt ein Mechanismus um per mDNS zu erkennen, dass es sich auch wirklich um einen ESPuino handelt. Hier könnten zusätzliche Einträge (
addServiceTxt
) Abhilfe schaffen.- Also etwa:
app=espuino
. - Eine eindeutige ID wäre hier auch hilfreich, um mehrere Geräte auseinander zu halten (
id=<uuid>
). Aktuell nutze ich den hostnamen zur Identifizierung. Das führt jedoch dazu, dass man das Gerät aus nymea löschen und neu hinzufügen muss, wenn man den Hostnamen über das Webinterface ändert. UPDATE: Mit Arduino-ESP32 1.0.6 aktuell nicht möglich. Da ist leider ein deutliches Ruckeln zu hören. In 2.x ist das behoben.
- Also etwa:
- [x] ClientId:
MQTT Broker erwarten normalerweise eine eindeutige ClientId. Aktuell ist jedochDEVICE_HOSTNAME
aufESP32-ESPuino
gesetzt. Würde es nicht Sinn machen, hier einfach den WLAN hostnamen zu nehmen? Oder auch die generierte Id?
Seit Version20221014-2
kann man die ClientId in der WebUI konfigurieren. - [ ] Es gibt keine MQTT State Nachricht für den Play/Pause.
- [x] Cover:
Es gibt keine MQTT Nachricht für eine Änderung vom Coverbild. Aktuell aktualisiere ich das Coverbild nur wenn sich die abgespielte Datei ändert. Das klappt aber leider nicht zuverlässig, ich habe den Eindruck das Coverbild ist da oft noch nicht fertig geladen. Über das Websocket gibt es so ein „coverimg“ event, welches an allen möglichen Stellen verschickt wird. Das wäre für MQTT auch schön zu haben.
Seit Version20221019-1
wird eine leere NachrichttopicStateCoverChanged
verschickt. - [x] Restart:
Wenn man den MQTT broker neustartet und sich ESPuino verbindet, dann sind erst mal Dinge wie der aktuelle Track auf initiale Werte (hier „—“) gesetzt. Erst wenn die nächste Datei abgespielt wird versendet ESPuino ein Update über MQTT mit den korrekten neuen Werten. Klar, das ist keine große Sache, normalerweise läuft der MQTT broker ja dauerhaft.
Seit Version20221019-1
wird der Status richtig initialisiert.
Freue mich auf euer Feedback,
Viele Grüße Christian