#################################################################################################### ##### TX Ultimate Easy for ESPHome ##### ##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### #################################################################################################### ##### Purpose: ESPHome - Standard - Speaker ##### #################################################################################################### ##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo ##### #################################################################################################### ##### NOTE: ##### ##### - Make changes ONLY if absolutely necessary and you have the required knowledge. ##### ##### - For normal system use, modifications to this file are NOT required. ##### #################################################################################################### --- substitutions: # RTTTL format: name:d=duration,o=octave,b=tempo:notes # d=32 (32nd note), o=5 (octave 5), b=100 (tempo 100) tone_volume_change: "scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b" # Use "none" to disable sound packages: standard_hw_audio: !include TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml api: actions: - action: rtttl_play variables: # The RTTTL string for the melody to be played. # It should follow the RTTTL format, including the melody's name, # default settings, and a sequence of notes. tone: string then: - lambda: |- rtttl_speaker->stop(); if (speaker_volume->state > 0) { ESP_LOGI("standard_speaker", "Play tone: '%s'", tone.c_str()); rtttl_speaker->play(tone.c_str()); } esphome: platformio_options: build_flags: - -D TX_ULTIMATE_EASY_STANDARD_SPEAKER number: - id: speaker_volume name: Sound - Volume platform: template max_value: 100 min_value: 0 step: 1 initial_value: 100 unit_of_measurement: "%" internal: false disabled_by_default: true entity_category: config device_class: sound_pressure restore_value: true optimistic: true set_action: then: - speaker.volume_set: id: speaker_embedded volume: !lambda return x/100.0f; - lambda: |- static const std::string tone_volume_change = "${tone_volume_change}"; // Play sound if tone_volume_change is not "none" if (x > 0 and !tone_volume_change.empty() and tone_volume_change != "none") rtttl_speaker->play(tone_volume_change); rtttl: - id: rtttl_speaker speaker: speaker_embedded script: - id: !extend dump_config_list_packages then: - script.wait: dump_config - lambda: |- // Check for requirements #if !defined(TX_ULTIMATE_EASY_CORE) #error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required." #endif #if !defined(TX_ULTIMATE_EASY_STANDARD_HW_AUDIO) #error "The package TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml is required." #endif // Identify itself ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - Hardware - Speaker"); - id: speaker_play_click then: - if: condition: not: - speaker.is_playing: speaker_embedded then: - speaker.play: id: speaker_embedded data: [ 0x01, 0x02, 0x04, 0x06, 0x07, 0x08, 0x08, 0x06, 0x01, 0xFA, 0xF4, 0xEF, 0xEE, 0xF1, 0xF7, 0xFF, 0x07, 0x0E, 0x11, 0x11, 0x10, 0x0C, 0x06, 0xFF, 0xF8, 0xF1, 0xEC, 0xEA, 0xEC, 0xF2, 0xF9, 0xFF, 0x05, 0x0A, 0x10, 0x14, 0x17, 0x17, 0x14, 0x0B, 0xFD, 0xED, 0xE0, 0xD9, 0xDB, 0xE6, 0xF7, 0x0A, 0x19, 0x20, 0x1E, 0x14, 0x05, 0xF4, 0xE5, 0xDF, 0xE4, 0xF4, 0x0C, 0x24, 0x36, 0x3D, 0x35, 0x20, 0xFF, 0xDD, 0xC0, 0xAE, 0xA9, 0xB0, 0xC4, 0xE0, 0x03, 0x26, 0x48, 0x62, 0x70, 0x6D, 0x59, 0x35, 0x08, 0xD8, 0xAC, 0x8D, 0x80, 0x85, 0x9C, 0xC1, 0xF0, 0x21, 0x4E, 0x6F, 0x7F, 0x7A, 0x63, 0x3D, 0x0F, 0xE0, 0xB7, 0x9B, 0x90, 0x96, 0xAC, 0xCE, 0xF6, 0x1D, 0x3C, 0x50, 0x55, 0x4D, 0x3A, 0x20, 0x04, 0xEC, 0xD8, 0xCC, 0xC9, 0xCD, 0xD8, 0xE8, 0xF9, 0x0A, 0x17, 0x1F, 0x20, 0x1C, 0x12, 0x07, 0xFC, 0xF2, 0xEC, 0xEB, 0xED, 0xF3, 0xFA, 0x02, 0x0A, 0x10, 0x12, 0x12, 0x0E, 0x07, 0xFE, 0xF5, 0xED, 0xEA, 0xEB, 0xEF, 0xF7, 0x00, 0x0A, 0x10, 0x13, 0x12, 0x0F, 0x09, 0x02, 0xFB, 0xF5, 0xF3, 0xF2, 0xF3, 0xF6, 0xFB, 0xFF, 0x03, 0x05, 0x07, 0x08, 0x07, 0x05, 0x03, 0x01, 0xFF, 0xFE, 0xFC, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x01] - wait_until: condition: not: - speaker.is_playing: speaker_embedded - speaker.stop: speaker_embedded - id: !extend touch_on_multi_touch_release then: - script.execute: touch_on_multi_touch_release_speaker - id: touch_on_multi_touch_release_speaker mode: restart then: - lambda: |- if (sl_touch_speaker_feedback->state != "Disabled") speaker_play_click->execute(); - id: !extend touch_on_press then: - script.execute: touch_on_press_speaker - id: touch_on_press_speaker mode: restart then: - lambda: |- if (sl_touch_speaker_feedback->state == "On press" or sl_touch_speaker_feedback->state == "Always") speaker_play_click->execute(); - id: !extend touch_on_release then: - script.execute: touch_on_release_speaker - id: touch_on_release_speaker mode: restart then: - lambda: |- if (sl_touch_speaker_feedback->state == "On release" or sl_touch_speaker_feedback->state == "Always") speaker_play_click->execute(); select: - id: sl_touch_speaker_feedback name: Touch - Speaker feedback platform: template options: - "Disabled" - "On press" - "On release" - "Always" initial_option: "Disabled" optimistic: true restore_value: true internal: false entity_category: config disabled_by_default: false icon: mdi:vibrate speaker: - id: speaker_embedded platform: i2s_audio dac_type: external i2s_dout_pin: GPIO15 i2s_audio_id: if_i2s_audio i2s_comm_fmt: stand_msb channel: mono ...