Espuino und Home Assistant

Ich bin gerade dabei meinen Espuino via MQTT in Home Assistant zu integrieren.
Das funktioniert im Prinzip wie auch bei openHAB - Dabei ist mir allerdings noch eine Idee gekommen, Home Assistant hat eine schöne NFC-Schnittstelle mit der sich Dinge einfach automatisieren lassen.

Dann kann man mit der gleichen Karte die auf dem Espuino ein Hörbuch startet dieses ebenso zB auf einem Sonos, Echo oder sonst was starten und wenn man möchte gleich noch das Licht dimmen :wink:

Sobald MQTT sauber läuft werde ich das mal testen.
Hapert momentan noch an meinem Wifi, aber das sollte bis nächste Woche laufen.

Hat schon jemand etwas ähnliches gemacht?

1 „Gefällt mir“

Das passt jetzt nicht so ganz, aber um die Weihnachtszeit hat mich jmd. angeschrieben und mich im MQTT-Bereich noch auf einen Bug hingewiesen und um ein Feature gebeten. Na jedenfalls wird, wenn man eine Karte auflegt, deren ID ja per MQTT gepusht. Also es ging darum, dass der Nachwuchs Farben lernt. Jedenfalls hatte der Weihnachtsbaum eine LED-Lichterkette, deren Farbe steuerbar ist. Er hat extern die Karten-IDs dann mit Farben verknüpft und je nachdem, welche Karte man aufgelegt hat, hat sich der Weihnachtsbaum entsprechend eingefärbt.

Ich denke der Phantasie sind da keine Grenzen gesetzt, hehe.

1 „Gefällt mir“

Coole Idee! Ich dachte auch schon an „Überraschungen“ wie zB bei einem bestimmten Track flackern die Lampen :smiley: Graf Zahl-mäßig

Ist es eigentlich möglich Infos aus dem ID3-Tag als weitere Topics zu senden?
zB. Artist, Album, Titel, Track und vielleicht sogar das Cover?

Ansonsten würde ich mir noch den Command Volume up und down wünschen sowie ein Topic mit dem Status „Play, Pause, Idle, oder Off“

Das gibt’s doch :thinking:

Grundsätzlich gehen tut das schon. Ganz am Ende von main.cpp sind die Methoden dafür. Das Doofe ist nur: Du kommst da quasi nicht jederzeit dran. Also die Lib ruft die Funktion auf, die dann extern (in meinem Code) implementiert ist. Aber der eigentliche Inhalt ist dann wieder weg. Das müsste man dann quasi zwischenspeichern.

In welchem Topic kann ich denn den sehen ob gerade Play oder Pause ist?

Bzgl Vol UP und Down kann ich wenn ich es richtig verstehe nur einen Wert setzen, aber nicht als Payload zb „VolUP“ senden und dann wird der Wert um zB 1 erhöht. Oder gibt es das schon?

Die Sachen aus dem ID Tag sind nicht der Arbeit wert, das ist nur optisch. Siehe hier:

Hast Recht. Gibt’s noch nicht.

Ist aus meiner Sicht nicht notwendig. Ein MQTT-Client empfängt ja die zuletzt eingestellte Lautstärke. Also wenn ich in OH sage „+“, dann weiß er, was er hinzuschicken hat.

Für den Anfang sieht es nun so aus in Home Assistant:
HA

1 „Gefällt mir“

Kann man mehr über deine Integration in HA erfahren?

Also grundsätzlich sollte an der Stelle vielleicht erwähnt werden, dass wir im Datenaustausch zwischen HA und ESPuino von MQTT reden. D.h. welches HA man da jetzt einsetzt, um MQTT zu reden, ist eigentlich gar nicht sooo relevant. Dokumentiert ist die MQTT-Schnittstelle von ESPuino hier: 📗 ESPuino und MQTT. Man muss dann halt schauen, wie die MQTT-Implementierung im gewählten HA funktioniert und man muss sich damit vertraut machen, welche Möglichkeiten das HA GUI-technisch besitzt. Beispiel: Nehmen wir an, du willst die Helligkeit des Neopixels steuern. Dann musst dir halt überlegen, ob das ein Schieberegler ist oder z.B. ein Hoch/Runter-Taster. Also grundsätzlich ist es halt gut zu wissen, was einem sein HA so bietet, damit man sich überlegen kann, was für einen selbst Sinn macht. Und das Ganze muss man dann natürlich noch mit Gültigkeitsbereichen flankieren. Also dass die Lautstärke z.B. nur zwischen 0 und 21 einstellbar ist.
On top kommen dann noch Regeln (,die ich für openHAB2 in meinem Repository leider gar nicht online habe, wie ich gerade gesehen habe). Beispiel: Schaltest du den ESP32 „geordnet“ aus, dann sendet er ein ich glaube „Offline“ per MQTT raus. Das kriegt dein HA mit und du kannst die Bedienelemente in der GUI deaktivieren. Weil macht ja keinen Sinn was bedienen zu wollen, was nicht online ist. Gut. Kappst du dem ESP32 jedoch einfach die Spannung oder er verliert die WLAN-Konnektivität, dann kann er das nicht und dein HA kriegt davon nix mit, dass der ESPuino offline ist. ESPuino schickt jedoch jede Minute sowas wie „still alive“ und dann kannst du eine Regel hernehmen und sagen: „Wenn das Feld xyz für mindestens zwei Minuten nicht aktualisiert wurde, dann gehe davon aus, dass er offline ist.“. Und dann tritt eine bestimmte Aktion ein, die du möchtest

Unabhängig davon ist dein Ansinnen „Zeig’ mal her, weil dann muss ich das Rad nicht selbst erfinden“ natürlich völlig ok. Ich wollte nur mal zeigen, wie man das Thema selbst gedanklich angeht.

Habe das wie auf dem Bild zu sehen bisher eher rudimentär eingerichtet.
Kann mich kaum noch an die Einrichtung erinnern.
Aber ich nutze diese custom Integration (kann man via HACS installieren): GitHub - TroyFernandes/hass-mqtt-mediaplayer: Fill out your Media Player Entity with MQTT Topics

Hier meine config:`media_player:

  • platform: mqtt-mediaplayer
    name: „ESPuino“
    topic:
    song_title: „{{ states(‚sensor.espuino_track‘) }}“
    player_status: „State/ESPuino/State“
    status_keyword: „Online“
    vol_down:
    service: mqtt.publish
    data:
    topic: „Cmnd/ESPuino/Loudness“
    payload: „-“
    vol_up:
    service: mqtt.publish
    data:
    topic: „Cmnd/ESPuino/Loudness“
    payload: „+“
    next:
    service: mqtt.publish
    data:
    topic: „Cmnd/ESPuino/TrackControl“
    payload: „4“
    previous:
    service: mqtt.publish
    data:
    topic: „Cmnd/ESPuino/TrackControl“
    payload: „5“
    play:
    service: mqtt.publish
    data:
    topic: „Cmnd/ESPuino/TrackControl“
    payload: „3“
    pause:
    service: mqtt.publish
    data:
    topic: „Cmnd/ESPuino/TrackControl“
    payload: „3“

sensor:

  • platform: mqtt
    name: Espuino-Status
    state_topic: „State/ESPuino/State“

  • platform: mqtt
    name: Espuino-Track
    state_topic: „State/ESPuino/Track“

switch:

  • platform: mqtt
    name: Espuino-Lock
    state_topic: „State/ESPuino/LockControls“
    command_topic: „Cmnd/ESPuino/LockControls“
    payload_on: „15“
    payload_off: „0“

  • platform: mqtt
    name: Espuino-Sleep
    state_topic: „State/ESPuino/SleepTimer“
    command_topic: „Cmnd/ESPuino/SleepTimer“
    payload_on: „ON“
    payload_off: „OFF“
    `
    @biologist Sag mal hattest du die Album-Grafik auch über MQTT verfügbar gemacht?

1 „Gefällt mir“

Nein. Ich bin ja nicht so der ID3-Tag-Held, hehe.
Der neuerliche Cover-Vorstoß in der WebGUI kam deswegen auch von @tueddy und nicht von mir, hehe.

Sch…ade :smiley:
Das würde in der GUI gleich doppelt so gut aussehen.
Aber so oft guckt man ja auch nicht drauf.

@Jotra-bischau
Spannend finde ich noch den Tag-Reader von Home Assistant. Damit probiere ich gerade herum.
Dann könnten die Kinder mit der selben Karte an ihrem Espuino Musik starten oder einen Cast auf die Nest Audio oder Sonos Speaker starten. Dazu vielleicht noch mit Fancy Lichteffekten :smiley:
Bisher scheitere ich jedoch am casten von Playlisten. Mit einer einzelnen Datei klappt es aber wunderbar.

Danke.
Ja den MQTT- Mediaplayer unter HACS habe ich auch gefunden.
Funktioniert auch soweit ganz gut.
Probleme habe ich mit Titel, bei denen ein Umlaut vorkommt.
Diese werden gar nicht angezeit.
Im MQTT-Explorer weden die Titel angezeigt, die Umlaute allerdings als nicht darstellbare Zeichen.
(so in etwa: (15/24) /Lieder/Lilipuz/Lieblingslieder/15-H�ngemazien.mp3)

Was man halt auf jeden Fall machen kann, ist eine RFID-Tag-ID per MQTT zu injizieren und das löst dann die gleiche Aktion aus, die auch das Auflegen einer Karte auslösen würde. So kannst dann per MQTT beliebige Sachen starten (wenn man die ID kennt). Es skaliert nur einfach nicht gut. Weil in openHAB z.B. kriege ich damit ein riesiges PullDown-Menü wenn ich viele Karten habe und zusätzlich habe auch noch doppelte Verwaltung der RFID-Zuweisungen (in ESPuino und in der HA nochmal). Das kann man natürlich alles irgendwie synchronisieren und fancy machen, aber schlussendlich muss man auch überlegen, ob das ab nem gewissen Punkt noch Sinn macht. So sehe ich das zumindest.

Für mich ging es initial darum, dass ich openHAB mit MQTT eh laufen habe und wenn wir unsere Kinder ins Bett bringen, dann legen wir uns idR dazu. Ja und dann ist es praktisch, wenn ich die Lautstärke ändern kann oder auch den Neopixel dimmen. Manches davon geht inzwischen ja auch via WebGUI - das war damals nicht der Fall.

Auf das Problem bin ich bisher noch nicht gestoßen, da ich eigentlich nie Umlaute in den Titeln habe :smiley:

Ja das wollte ich auch noch einbauen. War bisher aber nicht nötig, da die Kinder noch klein sind und bisher eher konfus irgendwas laufen lassen als wirklich einem Buch zuhören.

Die Webgui ist super, aber an HA bzw. openHAB ist es halt so schön, dass man eine Zentrale für alles hat. Keine weitere App, keine Webseite - zumindest für die gewöhnlichen Dinge.

Das ist korrekt, da habe ich mich noch nicht drum gekümmert. Das müsste eigentlich mittels convertAsciiToUtf8() in den Griff zu bekommen sein. Ich nehme den Punkt mal auf.

So, ich habe das UTF8-Thema eben gefixt:

Schaut bitte mal, ob das mit den Umlauten jetzt passt.

Super. Sieht sehr gut aus, die Umlaute werden korrekt per MQTT- Topic übertragen.
:+1: gute Arbeit
Danke.

1 „Gefällt mir“

Man kann tatsächlich auch den ganz normalen volume-slider verwenden bei Home Assisten. Du musst dazu die Lautstärke des ESPuino als Sensor einbinden. Mit ein wenig templating geht das ganze dann so (volume up und down entfernen):

  - platform: mqtt-mediaplayer
    name: "ESPuino"
    topic:
      song_title: "{{ states('sensor.espuino_track') }}"
      player_status: "State/ESPuino/State"
      song_volume: "{{ (states('sensor.espuino_volume') | int / 21 * 100) | round()}}"
      volume:
        service: mqtt.publish
        data:
          topic: "Cmnd/ESPuino/Loudness"
          payload: >
             {%- if volume < 1 %}
               {%- set volume= volume * 100 %}
               {{- ((volume * 21) / 100) | round() }}
             {%- else %}
               {{- ((volume * 21) / 100) | round() }}
             {%- endif %}
    status_keyword: "Online"
    next:
      service: mqtt.publish
      data:
        topic: "Cmnd/ESPuino/TrackControl"
        payload: "4"
    previous:
      service: mqtt.publish
      data:
        topic: "Cmnd/ESPuino/TrackControl"
        payload: "5"
    play:
      service: mqtt.publish
      data:
        topic: "Cmnd/ESPuino/TrackControl"
        payload: "3"
    pause:
      service: mqtt.publish
      data:
        topic: "Cmnd/ESPuino/TrackControl"
        payload: "3"
2 „Gefällt mir“