#################################################################################################### ##### TX Ultimate Easy for ESPHome ##### ##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### #################################################################################################### ##### Purpose: ESPHome - Add-on - 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 click_sound: |- [ 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 ] packages: core_hw_audio: !include TX-Ultimate-Easy-ESPHome_core_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 (rtttl_speaker_gain->state > 0) { ESP_LOGI("api", "Play tone: '%s'", tone.c_str()); rtttl_speaker->play(tone.c_str()); } esphome: platformio_options: build_flags: - -D TX_ULTIMATE_EASY_ADDON_SPEAKER number: - id: rtttl_speaker_gain 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: - lambda: |- rtttl_speaker->set_gain((100-(x/10.0f))/100.0f); 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_speaker->dump_config(); rtttl: - id: rtttl_speaker speaker: speaker_embedded script: - id: !extend dump_config then: - 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_CORE_HW_AUDIO) #error "The package TX-Ultimate-Easy-ESPHome_core_hw_audio.yaml is required." #endif // Identify itself ESP_LOGCONFIG("addon_speaker", "Add-on Speaker installed"); - id: speaker_play_click then: - if: condition: not: - speaker.is_playing: speaker_embedded then: - speaker.play: id: speaker_embedded data: !lambda return std::vector(${click_sound}); - 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") vibrate->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") vibrate->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") vibrate->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 ...