Skip to content

Instantly share code, notes, and snippets.

@formatBCE
Last active January 22, 2026 14:05
Show Gist options
  • Select an option

  • Save formatBCE/a1eef482c2a5ed36dfbb22e273ee3d94 to your computer and use it in GitHub Desktop.

Select an option

Save formatBCE/a1eef482c2a5ed36dfbb22e273ee3d94 to your computer and use it in GitHub Desktop.
Sendspin example for ESP32S3 with 2 or 8 MB of PSRAM and DAC (like MAX98357 or UDA1334)
esphome:
name: sendspin-player-1
friendly_name: sendspin-player-1
min_version: 2026.1.0
esp32:
board: esp32-s3-devkitc-1
cpu_frequency: 240MHz
variant: esp32s3
flash_size: 16MB # for N16R8. Put yours.
framework:
type: esp-idf
version: recommended
sdkconfig_options:
CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB: "y"
CONFIG_SPIRAM_RODATA: "y"
CONFIG_SPIRAM_FETCH_INSTRUCTIONS: "y"
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST: "y"
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY: "y"
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC: "y"
CONFIG_MBEDTLS_SSL_PROTO_TLS1_3: "y"
psram:
mode: octal # for 8MB PSRAM. Sewt "quad" for 2MB chip like in N8R2 variant
speed: 80MHz
ignore_not_found: false
api:
reboot_timeout: 0s # to avoid rebooting without HA
ota:
- platform: esphome
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Sendspin-Player-1"
password: "1234567"
captive_portal:
network:
enable_ipv6: true
http_request:
light:
- platform: esp32_rmt_led_strip
id: led_esp_onboard
name: LED onboard
disabled_by_default: true
internal: false
rgb_order: GRB
pin: GPIO48
num_leds: 1
rmt_symbols: 192
chipset: ws2812
entity_category: config
default_transition_length: 0s
logger:
level: debug
logs:
wifi: info
api: info
mdns: info
i2s_audio:
- id: i2s_output
i2s_lrclk_pin:
number: 13
allow_other_uses: false
i2s_bclk_pin:
number: 11
allow_other_uses: false
speaker:
# Hardware speaker output
- platform: i2s_audio
id: i2s_audio_speaker
sample_rate: 48000
i2s_mode: primary
i2s_dout_pin: 12
bits_per_sample: 32bit
i2s_audio_id: i2s_output
dac_type: external
channel: stereo
timeout: never
buffer_duration: 100ms
# Virtual speakers to combine the announcement and media streams together into one output
- platform: mixer
id: mixing_speaker
output_speaker: i2s_audio_speaker
num_channels: 2
task_stack_in_psram: true
source_speakers:
- id: announcement_mixing_input
timeout: never
- id: media_mixing_input
timeout: never
# Virtual speakers to resample each pipelines' audio, if necessary, as the mixer speaker requires the same sample rate
- platform: resampler
id: announcement_resampling_speaker
output_speaker: announcement_mixing_input
sample_rate: 48000
bits_per_sample: 16
- platform: resampler
id: media_resampling_speaker
output_speaker: media_mixing_input
sample_rate: 48000
bits_per_sample: 16
sendspin:
id: sendspin_hub
task_stack_in_psram: true
kalman_process_error: 0.01
media_source:
- platform: sendspin
id: sendspin_source
- platform: http_request
id: http_source
buffer_size: 500000
media_player:
- platform: sendspin
id: sendspin_group_media_player
- platform: speaker_source
id: external_media_player
name: Media Player
announcement_speaker: announcement_resampling_speaker
media_speaker: media_resampling_speaker
announcement_pipeline:
format: FLAC # FLAC is the least processor intensive codec
num_channels: 1 # Stereo audio is unnecessary for announcements
sample_rate: 48000
media_pipeline:
format: FLAC
num_channels: 2
sample_rate: 48000
volume_increment: 0.05
volume_min: 0.4
volume_max: 0.85
sources:
- http_source
- sendspin_source
external_components:
- source:
# https://github.com/esphome/esphome/pull/12253
type: git
url: https://github.com/esphome/esphome
ref: 7f34908569650e5a8b8c83e6bf89fea561218880
components: [mixer]
- source:
# https://github.com/esphome/esphome/pull/12254
type: git
url: https://github.com/esphome/esphome
ref: 6006b896a691ad38d8045ac67564c168973d1a1d
components: [resampler]
- source:
# https://github.com/esphome/esphome/pull/12256
type: git
url: https://github.com/esphome/esphome
ref: 9148832ea4e54907bad71a24d4ced1ce6c862433
components: [audio]
- source:
# https://github.com/esphome/esphome/pull/12258
type: git
url: https://github.com/esphome/esphome
ref: bff22983a390352360796f8e1363127e0cd1f898
components: [media_player]
- source:
# https://github.com/esphome/esphome/pull/12284
type: git
url: https://github.com/esphome/esphome
ref: a6c0a861a014e64c67d46115eba8e5370777b80a
components: [mdns, sendspin]
- source:
# https://github.com/esphome/esphome/pull/12429
type: git
url: https://github.com/esphome/esphome
ref: 928204066ce0082404573ea1c6a0b58aeebbd7c6
refresh: 0s
components: [file, http_request, media_source, speaker_source]
- source:
type: git
url: https://github.com/kahrendt/esphome
ref: wifi-power-save-wake-loop
refresh: 0s
components: [wifi]
button:
- platform: restart
id: restart_button
name: "Restart"
entity_category: config
disabled_by_default: true
icon: "mdi:restart"
debug:
update_interval: 5s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment