Last active
January 22, 2026 14:05
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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