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_onion_note_off,on_control_change,on_program_changeion_pitch_bend,on_sysexion_message,on_connection_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_sysexprzekazuje dane bez bajtów0xF0i0xF7, asend_sysexdokłada je, jeśli ich brakuje.on_messageudostę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_messageion_sysexsą ważne tylko w trakcie działania automatyzacji, dlatego te dwa wyzwalacze nie przyjmują akcji, które czekają, takich jakdelayiwait_until. max_sysex_sizeustala 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).