Espuino und Home Assistant

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“

Hallo,

vielen Dank für die Hinweise, die ich hier gefunden habe. Hier meine aktuelle Konfiguration für Home Assistant, um ESPuino per MQTT anzubinden.

mqtt:
  sensor:
    - name: "Battery"
      state_topic: "State/ESPuino/Battery"
      unique_id: espuino_battery
      device_class: battery
      suggested_display_precision: 2
      unit_of_measurement: "%"
      device:
        configuration_url: http://espuino.local/
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]
        manufacturer: DIY
        model: ESPuino
        name: ESPuino
    - name: "Loudness"
      state_topic: "State/ESPuino/Loudness"
      unique_id: espuino_loudness
      device_class: sound_pressure
      suggested_display_precision: 0
      unit_of_measurement: "%"
      value_template: "{{ ((value | int - 1) / 20 * 100) | round }}"
      device:
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]
    - name: "LED Brightness"
      state_topic: "State/ESPuino/LedBrightness"
      unique_id: espuino_led_brightness
      device_class: illuminance
      suggested_display_precision: 0
      unit_of_measurement: "%"
      value_template: "{{ ((value | int) / 254 * 100) | round }}"
      device:
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]
    - name: "Software Revision"
      state_topic: "State/ESPuino/SoftwareRevision"
      unique_id: espuino_software_revision
      device:
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]
    - name: "Track"
      state_topic: "State/ESPuino/Track"
      unique_id: espuino_track
      device:
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]
    - name: "WiFi RSSI"
      state_topic: "State/ESPuino/WifiRssi"
      unique_id: espuino_wifi_rssi
      device_class: signal_strength
      suggested_display_precision: 0
      unit_of_measurement: "dBm"
      device:
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]
    - name: "Voltage"
      state_topic: "State/ESPuino/Voltage"
      unique_id: espuino_voltage
      device_class: voltage
      suggested_display_precision: 2
      unit_of_measurement: "V"
      device:
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]
  binary_sensor:
    - name: "Lock Controls"
      state_topic: "State/ESPuino/LockControls"
      unique_id: espuino_lock_controls
      device_class: lock
      payload_on: "OFF"
      payload_off: "ON"
      device:
        connections:
          - ["mac", "AA:BB:CC:DD:EE:FF"]

media_player:
- platform: mqtt-mediaplayer
  name: "ESPuino"
  topic:
    song_title: "{{ states('sensor.espuino_track') }}"
    player_status: "State/ESPuino/State"
    song_volume: "{{ states('sensor.espuino_loudness') }}"
    volume:
      service: mqtt.publish
      data:
        topic: "Cmnd/ESPuino/Loudness"
        payload: >
          {%- if volume < 1 %}
            {{- (volume * 20) | round + 1 }}
          {%- else %}
            {{- ((volume * 20) / 100) | round + 1 }}
          {%- 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"
  turn_off:
    service: mqtt.publish
    data:
      topic: "Cmnd/ESPuino/Sleep"
      payload: "OFF"
  • Ich habe noch ein paar zusätzliche Sensoren definiert.
  • Ich habe ein Device angelegt, an dem alle Sensoren hängen.
  • Ich habe die Lautstärkeberechnung etwas angepasst, damit 5 % in Home Assistant einem Schritt in ESPuino entspricht.
  • turn_off zusätzlich im Media-Player.
4 „Gefällt mir“

Hi, besten Dank für deine Arbeit.
Welches Add-In nutzt du für „mqtt-mediaplayer“?

sorry… my fault.
GitHub - TroyFernandes/hass-mqtt-mediaplayer: Fill out your Media Player Entity with MQTT Topics