-
Notifications
You must be signed in to change notification settings - Fork 14
/
advanced-example-config.yaml
237 lines (212 loc) · 8.39 KB
/
advanced-example-config.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# yamllint disable rule:brackets rule:commas
---
esphome:
name: sound-level-meter
external_components:
- source: github://stas-sl/esphome-sound-level-meter
esp32:
board: esp32dev
framework:
type: arduino
logger:
level: DEBUG
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
# according to datasheet when L/R pin is connected to GND,
# the mic should output its signal in the left channel,
# however in my experience it's the opposite: when I connect
# L/R to GND then the signal is in the right channel
channel: right # default: right
# 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: true # 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
# 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
# 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
# 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