Klawiatura albo kontroler padowy z Bluetooth MIDI ma rząd klawiszy, pokręteł i padów, które równie dobrze mogłyby włączać światło albo uruchamiać sceny. Nowy komponent ble_midi w ESPHome sprawia, że nie trzeba do tego komputera. ESP32 łączy się z urządzeniem MIDI jako klient BLE, zamienia przychodzące nuty i zmiany kontrolerów w wyzwalacze automatyzacji, a do tego potrafi wysyłać MIDI z powrotem. Zmiana autorstwa bogdanr trafiła do gałęzi rozwojowej 25 października 2026, więc powinna pojawić się w ESPHome 2026.11.

Cztery miesiące na prawdziwym sprzęcie

Autor od mniej więcej czterech miesięcy używa tego kodu jako własnego komponentu zewnętrznego, z kontrolerem M-Vave SMC-PAD i klawiaturą Korg microKEY Air. Do głównego repozytorium trafiła tylko część ogólna. Komponent sam nie tworzy żadnych encji i nie zawiera ustawień dla konkretnych urządzeń. Profile pod konkretne kontrolery i przypisywanie nut do świateł zostają w zewnętrznym repozytorium autora i korzystają z wyzwalaczy, które są już w ESPHome.

Co potrafi

Komponent działa jako koncentrator nad ble_client. Udostępnia takie wyzwalacze:

  • on_note_on i on_note_off,
  • on_control_change, on_program_change i on_pitch_bend,
  • on_sysex i on_message,
  • on_connect i on_disconnect.

Do wysyłania MIDI służą akcje ble_midi.send_note_on, send_note_off, send_control_change, send_program_change, send_pitch_bend, send_sysex i send_raw, a do tego warunek ble_midi.connected. Tak wygląda przykład z opisu zmiany:

esp32_ble_tracker:

ble_client:
  - mac_address: 01:02:03:04:05:06
    id: pad_client

ble_midi:
  id: pad
  ble_client_id: pad_client
  on_note_on:
    - logger.log:
        format: "Note %u on, velocity %u, channel %u"
        args: [note, velocity, channel]
  on_control_change:
    - logger.log:
        format: "CC %u = %u"
        args: [control_number, value]

button:
  - platform: template
    name: "Send a note"
    on_press:
      - ble_midi.send_note_on:
          id: pad
          note: 60
          velocity: 100

W prawdziwej konfiguracji zamiast logger.log wstawisz na przykład przełączenie światła albo wywołanie akcji Home Assistanta.

Co warto wiedzieć

  • Kanały mają numery od 0 do 15, zarówno w wyzwalaczach, jak i w akcjach, tak jak w samym protokole. Wiele programów muzycznych pokazuje je jako 1-16. Autor zrezygnował z przeliczania, bo nie dałoby się go zastosować do kanału ustawianego wyrażeniem lambda.
  • on_sysex przekazuje dane bez bajtów 0xF0 i 0xF7, a send_sysex dokłada je, jeśli ich brakuje.
  • on_message udostępnia surowe bajty każdej wiadomości, także docisku klawisza i wiadomości systemowych, które nie mają własnego wyzwalacza.
  • Dane w on_message i on_sysex są ważne tylko w trakcie działania automatyzacji, dlatego te dwa wyzwalacze nie przyjmują akcji, które czekają, takich jak delay i wait_until.
  • max_sysex_size ustala rozmiar bufora rezerwowanego przy kompilacji, więc w trakcie działania nic nie jest przydzielane. Dłuższa wiadomość SysEx zostaje odrzucona z ostrzeżeniem.

Zmianę testowano na ESP32 z ESP-IDF. Dokumentacja wciąż czeka na scalenie (esphome.io #7219).