Skip to content

Instantly share code, notes, and snippets.

@NateEaton
Created April 6, 2024 02:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NateEaton/ecda65f579c16f0a0a9d7470348be328 to your computer and use it in GitHub Desktop.
Save NateEaton/ecda65f579c16f0a0a9d7470348be328 to your computer and use it in GitHub Desktop.
Data Collection Components for Total Solar Eclipse using ESPHOME and Home Assistant
# yamllint disable rule:brackets rule:commas
esphome:
name: sound-level-meter
friendly_name: sound-level-meter
external_components:
- source: github://stas-sl/esphome-sound-level-meter
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
level: DEBUG
# Enable Home Assistant API
api:
encryption:
key: "[private]"
ota:
password: "[private]"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Sound-Level-Meter"
password: "[private]"
captive_portal:
time:
- platform: homeassistant
id: homeassistant_time
i2s:
bck_pin: 23
ws_pin: 18
din_pin: 19
sample_rate: 48000 # default: 48000
bits_per_sample: 32 # default: 32
dma_buf_count: 8 # default: 8
dma_buf_len: 256 # default: 256
use_apll: true # default: false
# right shift samples.
# for example if mic has 24 bit resolution, and
# i2s configured as 32 bits, then audio data will be aligned left (MSB)
# and LSB will be padded with zeros, so you might want to shift them right by 8 bits
bits_shift: 8 # default: 0
sound_level_meter:
id: sound_level_meter1
# update_interval specifies over which interval to aggregate audio data
# you can specify default update_interval on top level, but you can also override
# it further by specifying it on sensor level
update_interval: 60s # default: 60s
# you can disable (turn off) component by default (on boot)
# and turn it on later when needed via sound_level_meter.turn_on/toggle actions;
# when used with switch it might conflict/being overriden by
# switch state restoration logic, so you have to either disable it in
# switch config and then is_on property here will have effect,
# or completely rely on switch state restoration/initialization and
# any value set here will be ignored
is_on: false # default: true
# buffer_size is in samples (not bytes), so for float data type
# number of bytes will be buffer_size * 4
buffer_size: 1024 # default: 1024
# ignore audio data at startup for this long
warmup_interval: 500ms # default: 500ms
# audio processing runs in a separate task, you can change its settings below
task_stack_size: 4096 # default: 4096
task_priority: 2 # default: 2
task_core: 1 # default: 1
# see your mic datasheet to find sensitivity and reference SPL.
# those are used to convert dB FS to db SPL
mic_sensitivity: -26dB # default: empty
mic_sensitivity_ref: 94dB # default: empty
# additional offset if needed
offset: 0dB # default: empty
# for flexibility sensors are organized hierarchically into groups. each group
# could have any number of filters, sensors and nested groups.
# for examples if there is a top level group A with filter A and nested group B
# with filter B, then for sensors inside group B filters A and then B will be
# applied:
# groups:
# # group A
# - filters:
# - filter A
# groups:
# # group B
# - filters:
# - filter B
# sensors:
# - sensor X
groups:
# group 1 (mic eq)
- filters:
# for now only SOS filter type is supported, see math/filter-design.ipynb
# to learn how to create or convert other filter types to SOS
- type: sos
coeffs:
# INMP441:
# b0 b1 b2 a1 a2
- [ 1.0019784 , -1.9908513 , 0.9889158 , -1.9951786 , 0.99518436]
# nested groups
groups:
# group 1.1 (no weighting)
- sensors:
# 'eq' type sensor calculates Leq (average) sound level over specified period
- type: eq
name: LZeq_1s
id: LZeq_1s
# you can override updated_interval specified on top level
# individually per each sensor
update_interval: 1s
# you can have as many sensors of same type, but with different
# other parameters (e.g. update_interval) as needed
- type: eq
name: LZeq_1min
id: LZeq_1min
unit_of_measurement: dBZ
# 'max' sensor type calculates Lmax with specified window_size.
# for example, if update_interval is 60s and window_size is 1s
# then it will calculate 60 Leq values for each second of audio data
# and the result will be max of them
- type: max
name: LZmax_1s_1min
id: LZmax_1s_1min
window_size: 1s
unit_of_measurement: dBZ
# same as 'max', but 'min'
- type: min
name: LZmin_1s_1min
id: LZmin_1s_1min
window_size: 1s
unit_of_measurement: dBZ
# it finds max single sample over whole update_interval
- type: peak
name: LZpeak_1min
id: LZpeak_1min
unit_of_measurement: dBZ
# Higher resolution measurements
- type: eq
name: LZeq_5sec
id: LZeq_5sec
unit_of_measurement: dBZ
update_interval: 5s
- type: max
name: LZmax_1s_5sec
id: LZmax_1s_5sec
window_size: 1s
unit_of_measurement: dBZ
update_interval: 5s
- type: min
name: LZmin_1s_5sec
id: LZmin_1s_5sec
window_size: 1s
unit_of_measurement: dBZ
update_interval: 5s
- type: peak
name: LZpeak_5sec
id: LZpeak_5sec
unit_of_measurement: dBZ
update_interval: 5s
# group 1.2 (A-weighting)
- filters:
# for now only SOS filter type is supported, see math/filter-design.ipynb
# to learn how to create or convert other filter types to SOS
- type: sos
coeffs:
# A-weighting:
# b0 b1 b2 a1 a2
- [ 0.16999495 , 0.741029 , 0.52548885 , -0.11321865 , -0.056549273]
- [ 1. , -2.00027 , 1.0002706 , -0.03433284 , -0.79215795 ]
- [ 1. , -0.709303 , -0.29071867 , -1.9822421 , 0.9822986 ]
sensors:
- type: eq
name: LAeq_1min
id: LAeq_1min
unit_of_measurement: dBA
- type: max
name: LAmax_1s_1min
id: LAmax_1s_1min
window_size: 1s
unit_of_measurement: dBA
- type: min
name: LAmin_1s_1min
id: LAmin_1s_1min
window_size: 1s
unit_of_measurement: dBA
- type: peak
name: LApeak_1min
id: LApeak_1min
unit_of_measurement: dBA
# Higher resolution measurements
- type: eq
name: LAeq_5sec
id: LAeq_5sec
unit_of_measurement: dBA
update_interval: 5s
- type: max
name: LAmax_1s_5sec
id: LAmax_1s_5sec
window_size: 1s
unit_of_measurement: dBA
update_interval: 5s
- type: min
name: LAmin_1s_5sec
id: LAmin_1s_5sec
window_size: 1s
unit_of_measurement: dBA
update_interval: 5s
- type: peak
name: LApeak_5sec
id: LApeak_5sec
unit_of_measurement: dBA
update_interval: 5s
# group 1.3 (C-weighting)
- filters:
# for now only SOS filter type is supported, see math/filter-design.ipynb
# to learn how to create or convert other filter types to SOS
- type: sos
coeffs:
# C-weighting:
# b0 b1 b2 a1 a2
- [-0.49651518 , -0.12296628 , -0.0076134163, -0.37165618 , 0.03453208 ]
- [ 1. , 1.3294908 , 0.44188643 , 1.2312505 , 0.37899444 ]
- [ 1. , -2. , 1. , -1.9946145 , 0.9946217 ]
sensors:
- type: eq
name: LCeq_1min
id: LCeq_1min
unit_of_measurement: dBC
- type: max
name: LCmax_1s_1min
id: LCmax_1s_1min
window_size: 1s
unit_of_measurement: dBC
- type: min
name: LCmin_1s_1min
id: LCmin_1s_1min
window_size: 1s
unit_of_measurement: dBC
- type: peak
name: LCpeak_1min
id: LCpeak_1min
unit_of_measurement: dBC
# Higher resolution measurements
- type: eq
name: LCeq_5sec
id: LCeq_5sec
unit_of_measurement: dBC
update_interval: 5s
- type: max
name: LCmax_1s_5sec
id: LCmax_1s_5sec
window_size: 1s
unit_of_measurement: dBC
update_interval: 5s
- type: min
name: LCmin_1s_5sec
id: LCmin_1s_5sec
window_size: 1s
unit_of_measurement: dBC
update_interval: 5s
- type: peak
name: LCpeak_5sec
id: LCpeak_5sec
unit_of_measurement: dBC
update_interval: 5s
# automation
# available actions:
# - sound_level_meter.turn_on
# - sound_level_meter.turn_off
# - sound_level_meter.toggle
switch:
- platform: template
name: "Sound Level Meter Switch"
# if you want is_on property on component to have effect, then set
# restore_mode to DISABLED, or alternatively you can use other modes
# (more on them in esphome docs), then is_on property on the component will
# be overriden by the switch
restore_mode: DISABLED # ALWAYS_OFF | ALWAYS_ON | RESTORE_DEFAULT_OFF | RESTORE_DEFAULT_ON
lambda: |-
return id(sound_level_meter1).is_on();
turn_on_action:
- sound_level_meter.turn_on
turn_off_action:
- sound_level_meter.turn_off
button:
- platform: template
name: "Sound Level Meter Toggle Button"
on_press:
- sound_level_meter.toggle: sound_level_meter1
binary_sensor:
- platform: gpio
pin: GPIO0
name: "Sound Level Meter GPIO Toggle"
on_press:
- sound_level_meter.toggle: sound_level_meter1
- platform: status
name: "Connectivity Status"
id: connectivity_status
device_class: connectivity
sensor:
- platform: wifi_signal # Reports the WiFi signal strength/RSSI in dB
name: "WiFi Signal dB"
id: wifi_signal_db
update_interval: 60s
entity_category: "diagnostic"
- platform: copy # Reports the WiFi signal strength in %
source_id: wifi_signal_db
name: "WiFi Signal Percent"
filters:
- lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
unit_of_measurement: "Signal %"
entity_category: "diagnostic"
- platform: uptime
name: "Uptime"
update_interval: 60s
entity_category: "diagnostic"
text_sensor:
- platform: version
name: "Version"
icon: mdi:cube-outline
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment