tab5 voice assist v0.1
All checks were successful
Podman DDNS Image / build-and-push-ddns (push) Successful in 1m10s
All checks were successful
Podman DDNS Image / build-and-push-ddns (push) Successful in 1m10s
This commit is contained in:
407
active/device_esphome/tab5.yaml
Normal file
407
active/device_esphome/tab5.yaml
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
esphome:
|
||||||
|
name: tab1
|
||||||
|
friendly_name: M5Stack Tab5 1
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
board: esp32-p4-evboard
|
||||||
|
flash_size: 16MB
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
advanced:
|
||||||
|
enable_idf_experimental_features: true
|
||||||
|
|
||||||
|
esp32_hosted:
|
||||||
|
variant: esp32c6
|
||||||
|
active_high: true
|
||||||
|
clk_pin: GPIO12
|
||||||
|
cmd_pin: GPIO13
|
||||||
|
d0_pin: GPIO11
|
||||||
|
d1_pin: GPIO10
|
||||||
|
d2_pin: GPIO9
|
||||||
|
d3_pin: GPIO8
|
||||||
|
reset_pin: GPIO15
|
||||||
|
slot: 1
|
||||||
|
|
||||||
|
logger:
|
||||||
|
hardware_uart: USB_SERIAL_JTAG
|
||||||
|
|
||||||
|
psram:
|
||||||
|
mode: hex
|
||||||
|
speed: 200MHz
|
||||||
|
|
||||||
|
api:
|
||||||
|
|
||||||
|
# Touchscreen support
|
||||||
|
external_components:
|
||||||
|
- source: github://pr#12075
|
||||||
|
components: [st7123]
|
||||||
|
refresh: 1h
|
||||||
|
|
||||||
|
ota:
|
||||||
|
platform: esphome
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
|
||||||
|
i2c:
|
||||||
|
- id: bsp_bus
|
||||||
|
sda: GPIO31
|
||||||
|
scl: GPIO32
|
||||||
|
frequency: 400kHz
|
||||||
|
|
||||||
|
pi4ioe5v6408:
|
||||||
|
- id: pi4ioe1
|
||||||
|
address: 0x43
|
||||||
|
# 0: O - wifi_antenna_int_ext
|
||||||
|
# 1: O - speaker_enable
|
||||||
|
# 2: O - external_5v_power
|
||||||
|
# 3: NC
|
||||||
|
# 4: O - lcd reset
|
||||||
|
# 5: O - touch panel reset
|
||||||
|
# 6: O - camera reset
|
||||||
|
# 7: I - headphone detect
|
||||||
|
- id: pi4ioe2
|
||||||
|
address: 0x44
|
||||||
|
# 0: O - wifi_power
|
||||||
|
# 1: NC
|
||||||
|
# 2: NC
|
||||||
|
# 3: O - usb_5v_power
|
||||||
|
# 4: O - poweroff pulse
|
||||||
|
# 5: O - quick charge enable (inverted)
|
||||||
|
# 6: I - charging status
|
||||||
|
# 7: O - charge enable
|
||||||
|
|
||||||
|
button:
|
||||||
|
- platform: restart
|
||||||
|
name: "Restart Tablet"
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- platform: gpio
|
||||||
|
id: wifi_power
|
||||||
|
name: "WiFi Power"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe2
|
||||||
|
number: 0
|
||||||
|
restore_mode: ALWAYS_ON
|
||||||
|
- platform: gpio
|
||||||
|
id: usb_5v_power
|
||||||
|
name: "USB Power"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe2
|
||||||
|
number: 3
|
||||||
|
- platform: gpio
|
||||||
|
id: quick_charge
|
||||||
|
name: "Quick Charge"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe2
|
||||||
|
number: 5
|
||||||
|
inverted: true
|
||||||
|
- platform: gpio
|
||||||
|
id: charge_enable
|
||||||
|
name: "Charge Enable"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe2
|
||||||
|
number: 7
|
||||||
|
- platform: gpio
|
||||||
|
id: wifi_antenna_int_ext
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe1
|
||||||
|
number: 0
|
||||||
|
- platform: gpio
|
||||||
|
id: speaker_enable
|
||||||
|
name: "Speaker Enable"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe1
|
||||||
|
number: 1
|
||||||
|
restore_mode: ALWAYS_ON
|
||||||
|
- platform: gpio
|
||||||
|
id: external_5v_power
|
||||||
|
name: "External 5V Power"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe1
|
||||||
|
number: 2
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- platform: gpio
|
||||||
|
id: charging
|
||||||
|
name: "Charging Status"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe2
|
||||||
|
number: 6
|
||||||
|
mode: INPUT_PULLDOWN
|
||||||
|
|
||||||
|
- platform: gpio
|
||||||
|
id: headphone_detect
|
||||||
|
name: "Headphone Detect"
|
||||||
|
pin:
|
||||||
|
pi4ioe5v6408: pi4ioe1
|
||||||
|
number: 7
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
- platform: ina226
|
||||||
|
address: 0x41
|
||||||
|
adc_averaging: 16
|
||||||
|
max_current: 8.192A
|
||||||
|
shunt_resistance: 0.005ohm
|
||||||
|
bus_voltage:
|
||||||
|
id: battery_voltage
|
||||||
|
name: "Battery Voltage"
|
||||||
|
current:
|
||||||
|
id: battery_current
|
||||||
|
name: "Battery Current"
|
||||||
|
# Positive means discharging
|
||||||
|
# Negative means charging
|
||||||
|
|
||||||
|
# Tab5 built-in battery discharges from full (8.23 V) to shutdown threshold (6.0 V)
|
||||||
|
- platform: template
|
||||||
|
name: "Battery Percentage"
|
||||||
|
lambda: |-
|
||||||
|
float voltage = id(battery_voltage).state;
|
||||||
|
// Adjust these values based on your battery's actual min/max voltage
|
||||||
|
float min_voltage = 6.0; // Discharged voltage
|
||||||
|
float max_voltage = 8.23; // Fully charged voltage
|
||||||
|
float percentage = (voltage - min_voltage) / (max_voltage - min_voltage) * 100.0;
|
||||||
|
if (percentage > 100.0) return 100.0;
|
||||||
|
if (percentage < 0.0) return 0.0;
|
||||||
|
return percentage;
|
||||||
|
update_interval: 60s
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
accuracy_decimals: 1
|
||||||
|
|
||||||
|
touchscreen:
|
||||||
|
- platform: st7123
|
||||||
|
i2c_id: bsp_bus
|
||||||
|
interrupt_pin: GPIO23
|
||||||
|
display: lcd
|
||||||
|
update_interval: never
|
||||||
|
reset_pin:
|
||||||
|
pi4ioe5v6408: pi4ioe1
|
||||||
|
number: 5
|
||||||
|
calibration:
|
||||||
|
x_min: 0
|
||||||
|
x_max: 720
|
||||||
|
y_min: 0
|
||||||
|
y_max: 1280
|
||||||
|
id: touch
|
||||||
|
on_touch:
|
||||||
|
- logger.log: "LVGL resuming"
|
||||||
|
- lvgl.resume:
|
||||||
|
- light.turn_on: backlight
|
||||||
|
on_release:
|
||||||
|
- media_player.stop:
|
||||||
|
|
||||||
|
esp_ldo:
|
||||||
|
- voltage: 2.5V
|
||||||
|
channel: 3
|
||||||
|
|
||||||
|
display:
|
||||||
|
- platform: mipi_dsi
|
||||||
|
id: lcd
|
||||||
|
dimensions:
|
||||||
|
height: 1280
|
||||||
|
width: 720
|
||||||
|
model: M5STACK-TAB5-V2
|
||||||
|
reset_pin:
|
||||||
|
pi4ioe5v6408: pi4ioe1
|
||||||
|
number: 4
|
||||||
|
|
||||||
|
output:
|
||||||
|
- platform: ledc
|
||||||
|
pin: GPIO22
|
||||||
|
id: backlight_pwm
|
||||||
|
frequency: 1000Hz
|
||||||
|
|
||||||
|
light:
|
||||||
|
- platform: monochromatic
|
||||||
|
output: backlight_pwm
|
||||||
|
name: "Display Backlight"
|
||||||
|
id: backlight
|
||||||
|
restore_mode: ALWAYS_ON
|
||||||
|
default_transition_length: 250ms
|
||||||
|
initial_state:
|
||||||
|
brightness: "100%"
|
||||||
|
- platform: lvgl
|
||||||
|
widget: listen_led_widget
|
||||||
|
name: LVGL light
|
||||||
|
id: listen_led
|
||||||
|
|
||||||
|
lvgl:
|
||||||
|
byte_order: little_endian
|
||||||
|
|
||||||
|
on_idle:
|
||||||
|
timeout: 60s
|
||||||
|
then:
|
||||||
|
- logger.log: "LVGL is idle"
|
||||||
|
- light.turn_off:
|
||||||
|
id: backlight
|
||||||
|
transition_length: 15s
|
||||||
|
- lvgl.pause:
|
||||||
|
widgets:
|
||||||
|
- led:
|
||||||
|
id: listen_led_widget
|
||||||
|
align: CENTER
|
||||||
|
color: 0xFF0000
|
||||||
|
brightness: 0%
|
||||||
|
height: 100px
|
||||||
|
width: 100px
|
||||||
|
- label:
|
||||||
|
align: TOP_MID
|
||||||
|
id: lbl_status
|
||||||
|
text_font: montserrat_48
|
||||||
|
text: "IDLE"
|
||||||
|
- label:
|
||||||
|
align: BOTTOM_LEFT
|
||||||
|
id: lbl_version
|
||||||
|
text_font: montserrat_12
|
||||||
|
text: "v0.1"
|
||||||
|
|
||||||
|
# The DAC Output select needs to be manually (or with an automation) changed to `LINE1` for the onboard speaker
|
||||||
|
select:
|
||||||
|
- platform: es8388
|
||||||
|
dac_output:
|
||||||
|
name: DAC Output
|
||||||
|
adc_input_mic:
|
||||||
|
name: ADC Input Mic
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
id: wifi_antenna_select
|
||||||
|
name: "WiFi Antenna"
|
||||||
|
options:
|
||||||
|
- "Internal"
|
||||||
|
- "External"
|
||||||
|
optimistic: true
|
||||||
|
on_value:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
lambda: return i == 0;
|
||||||
|
then:
|
||||||
|
- switch.turn_off: wifi_antenna_int_ext
|
||||||
|
else:
|
||||||
|
- switch.turn_on: wifi_antenna_int_ext
|
||||||
|
|
||||||
|
i2s_audio:
|
||||||
|
- id: mic_bus
|
||||||
|
i2s_lrclk_pin: GPIO29
|
||||||
|
i2s_bclk_pin: GPIO27
|
||||||
|
i2s_mclk_pin: GPIO30
|
||||||
|
|
||||||
|
audio_adc:
|
||||||
|
- platform: es7210
|
||||||
|
id: es7210_adc
|
||||||
|
bits_per_sample: 16bit
|
||||||
|
sample_rate: 16000
|
||||||
|
|
||||||
|
microphone:
|
||||||
|
- platform: i2s_audio
|
||||||
|
id: tab5_microphone
|
||||||
|
i2s_din_pin: GPIO28
|
||||||
|
sample_rate: 16000
|
||||||
|
bits_per_sample: 16bit
|
||||||
|
adc_type: external
|
||||||
|
|
||||||
|
audio_dac:
|
||||||
|
- platform: es8388
|
||||||
|
id: es8388_dac
|
||||||
|
|
||||||
|
speaker:
|
||||||
|
- platform: i2s_audio
|
||||||
|
id: tab5_speaker
|
||||||
|
i2s_dout_pin: GPIO26
|
||||||
|
audio_dac: es8388_dac
|
||||||
|
dac_type: external
|
||||||
|
channel: mono
|
||||||
|
buffer_duration: 100ms
|
||||||
|
bits_per_sample: 16bit
|
||||||
|
sample_rate: 48000
|
||||||
|
|
||||||
|
media_player:
|
||||||
|
- platform: speaker
|
||||||
|
name: None
|
||||||
|
id: tab5_media_player
|
||||||
|
announcement_pipeline:
|
||||||
|
speaker: tab5_speaker
|
||||||
|
format: WAV
|
||||||
|
|
||||||
|
micro_wake_word:
|
||||||
|
id: mww
|
||||||
|
models:
|
||||||
|
- okay_nabu
|
||||||
|
- hey_mycroft
|
||||||
|
- hey_jarvis
|
||||||
|
on_wake_word_detected:
|
||||||
|
- voice_assistant.start:
|
||||||
|
wake_word: !lambda return wake_word;
|
||||||
|
|
||||||
|
voice_assistant:
|
||||||
|
id: va
|
||||||
|
microphone: tab5_microphone
|
||||||
|
media_player: tab5_media_player
|
||||||
|
micro_wake_word: mww
|
||||||
|
on_listening:
|
||||||
|
- if:
|
||||||
|
condition: lvgl.is_paused
|
||||||
|
then:
|
||||||
|
- logger.log: "LVGL resuming"
|
||||||
|
- lvgl.resume:
|
||||||
|
- light.turn_on: backlight
|
||||||
|
- light.turn_on:
|
||||||
|
id: listen_led
|
||||||
|
brightness: 100%
|
||||||
|
red: 0%
|
||||||
|
green: 100%
|
||||||
|
blue: 0%
|
||||||
|
effect: "None`"
|
||||||
|
- lvgl.label.update:
|
||||||
|
id: lbl_status
|
||||||
|
text: "LISTENING"
|
||||||
|
on_stt_vad_end:
|
||||||
|
- light.turn_on:
|
||||||
|
id: listen_led
|
||||||
|
brightness: 100%
|
||||||
|
red: 0%
|
||||||
|
green: 0%
|
||||||
|
blue: 100%
|
||||||
|
effect: "None"
|
||||||
|
- lvgl.label.update:
|
||||||
|
id: lbl_status
|
||||||
|
text: "PROCESSING"
|
||||||
|
on_tts_start:
|
||||||
|
- light.turn_on:
|
||||||
|
id: listen_led
|
||||||
|
brightness: 100%
|
||||||
|
red: 100%
|
||||||
|
green: 0%
|
||||||
|
blue: 0%
|
||||||
|
effect: "None"
|
||||||
|
- lvgl.label.update:
|
||||||
|
id: lbl_status
|
||||||
|
text: "RESPONDING"
|
||||||
|
on_end:
|
||||||
|
# Wait a short amount of time to see if an announcement starts
|
||||||
|
- wait_until:
|
||||||
|
condition:
|
||||||
|
- media_player.is_announcing:
|
||||||
|
timeout: 0.5s
|
||||||
|
# Announcement is finished and the I2S bus is free
|
||||||
|
- wait_until:
|
||||||
|
- and:
|
||||||
|
- not:
|
||||||
|
media_player.is_announcing:
|
||||||
|
- not:
|
||||||
|
speaker.is_playing:
|
||||||
|
- micro_wake_word.start:
|
||||||
|
- lvgl.led.update:
|
||||||
|
id: listen_led_widget
|
||||||
|
color: 0x000000
|
||||||
|
brightness: "0%"
|
||||||
|
- lvgl.label.update:
|
||||||
|
id: lbl_status
|
||||||
|
text: "IDLE"
|
||||||
|
- light.turn_off:
|
||||||
|
id: backlight
|
||||||
|
transition_length: 15s
|
||||||
|
on_client_connected:
|
||||||
|
- micro_wake_word.start:
|
||||||
|
on_client_disconnected:
|
||||||
|
- micro_wake_word.stop:
|
||||||
Reference in New Issue
Block a user