В рамках развития инфраструктуры умного дома, часть голосов в моей голове решила переселиться в более комфортную среду обитания.
Разные люди по разному представляют себе концепцию «умного дом». Так, например, некоторые люди склонны видеть в умном доме некое «разумное существо», с котором можно поболтать или как-то еще взаимодействовать. Но лично я подхожу к этому всему строго наоборот: считаю, что дом тем умнее, чем меньше приходится с ним взаимодействовать. Зачем мне умный дом, который не может без подсказки свет включить? Эдак я и сам могу выключателем щёлкнуть — много ума для этого не нужно. Умный дом должен быть умным как можно незаметнее, управляя миром не привлекая внимания санитаров.
Для «общения и взаимодействия» в доме мне достаточно Жены, Пса и Кота. Еще не хватало, чтобы мне какой-то сервер из-под потолка мозги выносил, требуя внимания.
Однако, в некоторых исключительных случаях, я считаю допустимым, чтобы дом всеми силами пытался привлечь к себе внимание и поощрял к взаимодействию. Например, во время срабатывания пожарной сигнализации. Думаю, это очевидно… Ну а в качестве не очень очевидного примера, можно привести поливалки на газоне: просто потому что я, в принципе, совсем не возражаю, чтобы меня кто-то предупредил немного заранее, прежде чем внезапно окатить водой с головы до ног.
Таким образом, в какой-то момент, появилась необходимость снабдить дом простыми системами звуковых оповещений. Ведь мы не таращимся на его графическую консоль управления круглыми сутками, отслеживая все происходящие события. Что-то можем и пропустить важное.
Итого… Задача проекта: создать группу простых устройств с динамиками и микрофонами, которые могли бы воспроизводить медиа-контент уровня голосовых сообщений и, в случае необходимости, принимать простые голосовые команды. Ни в коем случае, не «музыкальный центр» — он и без того уже есть. Это должны быть простейшие матюгальники, как на вокзале. С минимальным функционалом. Рассеянные по всем-всем помещениям в доме:

Преимущества именно группы устройств против одного общего:
- Отсутствие необходимости орать во всю мощь единственного динамика, чтобы докричаться до дальнего угла двора за домом.
- Каждый живущий в доме может настроить матюгальник в своей комнате так, как ему хочется (голос, громкость и т.п.).
- Выборочная адресация. Например, о том, что сейчас включится система полива газона, актуально знать только тому, кто находится во дворе, но не тому, кто тихо-мирно храпит сладким сном у себя в спальне.
- Организация селекторной связи между помещениями. Да, так уж вышло, что у нас мобильные телефоны не приклеены у каждого к руке, а доораться из гаража на кухню Жене не всегда получается.
- Компактность. Очевидно, что отдельное маломощное устройство оповещения не требует такого пространства, как один матюгальник с мощным усилителем и динамиками.
Можно купить на амазоне или еще каком алибабае простые и не слишком дорогие беспроводные динамики. Их разных есть. Некоторые даже можно заставить интегрироваться в HA. Если повезет… Поэтому я пошел по более интересному и надежному пути — сделать беспроводной динамик, как компонент системы умного дома, самостоятельно. Ничего там такого запредельного нет. Проект «начального-среднего» уровня сложности. Выйдет дешевле и без приключений с совместимостью.
Начал с того, что присобачил к ESP32 плату с DAC на базе UDA1334A, умеющую в I2S. К ней — усилитель на базе PAM8403. А к нему — пару двухдюймовых динамиков 4Ω 3W:

И оно прекрасно сработало. Выход с модуля DAC на усилитель — либо со встроенного 3-мм джека (option #2), либо с имеющихся на борту шпиньков аналогового выхода (option #1). Все модули в этом примере подобраны так, чтобы им было достаточно уже имеющихся в системе 5V питания. Это избавляет от необходимости городить всякие промежуточные повышайки/понижайки.
Впрочем, конечно, совершенно ничто не мешает вам всобачить туда усилитель категории D размером с грузовик, запитать его напрямую от ближайшего ядерного реактора и качнуть воздух сразу во всем городе сообщением о том, что в атмосфере туалета вашего дома повысился уровень метана.
Готовые прошивки для такой комбинации легко находятся в интернете, как для систем типа ESPHome, так и для автономных «ардуино-проектов». Искать по именам модулей или шине I2S в контексте ESP32. Там везде обычно используются стандартные библиотеки и непробиваемо дубовый код из дюжины строк. Вот, например, один из моих любимых DIY-еров на ютубе, отличающийся совершенно запредельной дотошностью в своих «видео-уроках», когда-то давно разжевал всю эту тему «от и до»:
Вряд ли я смогу что-то к этому добавить.
Предложенный выше мой вариант матюгальника работает и интегрируется в систему HA + ESPHome сходу. Причем буквально с кусками прошивки из примеров в документации, которые можно тупо копипастить, как есть.
Я уже начал думать, как все это по-быстрому закатать в один общий корпус, когда совершенно случайно наткнулся на все то же самое, но в виде одной единственной доски под названием ESP32-A1S Audio Kit:



Там уже сразу и сама ESP32, и DAC, и усилитель, и кнопки управления, и микрофоны, и выходы на динамики, и выход напрямую, и вход напрямую, и поддержка microSD для локального медиа. Т.е. вообще все, что нужно. По себестоимости оно выходило раза в полтора дороже, чем собирать то же самое из рассыпухи. Зато, с такой доской не нужно ничего делать ровным счетом ничего. Т.е. совсем ничего! Только прошивку залить, да корпус соорудить. Причем последнее пришлось бы делать, что так, что эдак. Поэтому я отказался от первоначальной комбинации из модулей в пользу одной ESP32-A1S Audio Kit.
Желающие повторить мой опыт, могут пойти по любому из этих путей. Результат будет абсолютно идентичным. За одним единственным исключением: в первом случае у меня не представлен функционал микрофонов. Там я просто еще не дошел до этой части проекта, когда мне попалась готовая A1S Audio Kit, где они уже были. Но добавить к рассыпухе еще один модуль с микрофоном — задача тривиальная. Так, что, как я и сказал выше, результат будет тем же самым. Вопрос лишь в удобстве (один модуль проще пристроить в кузове, чем несколько), цене (разница составит буквально в три-пять долларов) и времени, которое вы на это потратите (модули придется соединять проводами самостоятельно).
Собственно, весь проект, в итоге, свелся к простому созданию корпуса. С которым тоже не пришлось голову ломать.
Никаких особенно высокохудожественных выкрутасов или технических тонкостей тут не требовалось, поэтому все рисовалось по принципу «куда курсор на экране потянет»:


В основном, корпус создавался из расчета на хоть какой-то разнос динамиков и их размер. Поэтому внутри там, в основном, пустота:

Несмотря на всю простоту конструкции, деталек все же набежало немношк:

- Нижняя половина корпуса.
- Ножки.
- Декоративная накладка. Исключительно для красоты. От ее наличия или отсутствия, конструкция устройства решительно никак не меняется.
- Передняя панель.
- Защитная сеточка для микрофонов.
- Кнопки управления.
- Панель органов управления. В принципе, она должна быть одним целым с соответствующей частью корпуса, но тогда пришлось бы печатать ее со структурами поддержки. А я это люто ненавижу по понятным причинам. Гораздо проще напечатать ее отдельно и приклеить на место.
- Верхняя половина корпуса.
- Плата ESP32-A1S Audio Kit.
- Динамики.
- Тоже самое, что и п.7 выше, но без отверстий для кнопок и микрофонов. Является отдельным элементом по той же самой причине.
Органы управления, в принципе, не очень нужны:

- Вкл./Выкл. звука
- Уменьшение громкости
- Увеличение громкости
- Включение голосового помощника
Первые три кнопки управления громкостью дублируют встроенные функции интерфейса HA. Т.е. все это может делаться там вручную или средствами автоматизации прямо из консоли. Кнопка активации «голосового помощника» тоже, в общем, не нужна т.к. все можно настроить на активацию по волшебному слову «Эй, домище!» или чего оно там…
По причине отсутствия на текущий момент, необходимости в управлении домом посредством голоса, этот функционал в матюгальниках есть, но он пока ничем не обслуживается. В интерфейсе я вижу, что кнопка активации работает, на стороне сервера «голосовой помощник» активируется и начинает слушать. Только ничего потом не происходит, потому, что никаких дальнейших указаний на этот счет система не имеет. Я пока еще не брался за эту часть возможностей HA, поэтому не знаю, как оно работает. Но оно там есть и оно как-то работает.
В общем, кнопки управления тут реализованы, в основном, по причине того, что они уже просто есть готовые на доске контроллера. Их там, вообще, аж шесть штук. Но я и для четырех то с трудом высосал из пальца некий базовый функционал. С другой стороны, устройство без кнопок, это насилие над самой природой человека. Потому, что человеку непременно надо иметь иллюзию того, что он чем-то управляет и от его действий что-то зависит…
Перед общей сборкой понадобился небольшой подготовительный этап. А именно — перенос рейки с GPIO на обратную сторону платы:


Это сделано исключительно только ради RGB-светодиода, который я решил добавить в устройство. Сейчас показывает:
- горит зеленым, когда устройство вкл.
- кратковременно попыхивает красным, показывая, что устройство на связи с HA.
- врубает синий, когда активирована функция «голосового помощника».


Как и в случае с кнопками, без этой иллюминации можно прекрасно обойтись. Но я люблю огонечки. Да и чего лишним GPIO зазря пропадать?
И на этом же этапе в плату удобнее всего влить базовую прошивку:

Потом ее можно конфигурировать и менять уже «по воздуху». Но самое первое прошитие должно происходить через прямое USB-соединение с компьютером или сервером. Я не стал делать вывод USB наружу корпуса и поэтому потом для этой задачи устройство придется разбирать.
Изготовление деталей корпуса началось с передней морды лица:


Она состоит из плоской основной панели, декоративной накладки, динамиков, RGB-светодиода и некоторого количества крепежа. Причем самостоятельно изготовить нужно только основную панель и декоративную накладку. Их можно было бы распечатать на 3D-принтере, как и все остальное в этом корпусе. Но было решено пойти другим путем.
Так уж вышло, что я, совершенно случайно, обзавелся в гараже «промышленным» CO-лазером. Это отдельная история, расскажу ее как-нибудь потом. Суть в том, что не очень то он мне был и нужен — задач под него у меня в хозяйстве не так много. В основном, он занимается только тем, что стоит в гараже. Но я не люблю бесполезных инструментов, поэтому изо всех сил пытаюсь пристроить его к делу где это уместно и где не уместно. Так и в этом случае — панель и накладку я решил не напечатать, а вырезать лазером из акрила.


В обоих случаях использовался обрезок старого акрилового стекла из загашника, на который была наклеена виниловая декоративная пленка. Бежево-золотистая для панели и перламутровая для накладки. Меня не спрашивайте — цвета выбирала Жена. Она так видит.
Для любителей индастриал-порно, процесс вырезки декоративной накладки лазером без склеек и ускорения видео:
Все необходимые для морды детали готовы:

Временно собрал морду с применением гаек:


В будущем, болтики фиксирующие динамики будут вкручиваться непосредственно в корпус и гайки будут не нужны.
Тут я решил немного поэкспериментировать с выходной мощностью сигнала. Принтер все еще был занят печатью деталей корпуса и нужно было чем-то занять себя на это время.
На плате ESP32-A1S Audio Kit есть свой усилитель. Для динамиков 4Ω он отдает 2W на каждый канал, если верить документации. В принципе, этого достаточно для бытового применения в пределах комнаты (приходится даже громкость урезать до 70-80%).
Но динамики, которые я нашел у себя в загашнике, оказались рассчитаны на мощность до 3W при тех же 4Ω. Так и фигли бы не сделать все чуточку погромче? Например, можно проигнорировать выход на динамики через встроенный усилитель платы и использовать ее же линейный выход без усилителя. А в качестве усилителя использовать внешний модуль на базе PAM8403, который как раз и может выдавать 3W на канал для динамиков 4Ω. Прирост копеечный, но все уже есть под рукой и особенно мудрить ничего не нужно.
На плате ESP32-A1S Audio Kit нет специального отдельного выхода 5V. Есть только 3.3V. Для PAM8403 этого мало. Ему нужно 5V. Зато на плате есть два USB-входа. Один только для питания, второй — полноценный UART. На какой из них питание ни подавай, на обоих будут 5V. Соответственно, один из них можно использовать для питания устройства, а со второго организовать вывод на усилитель.
На фото, нижний USB — вход питания, верхний — вывод 5V на усилитель. Ну и 3mm джек из линейного выхода тоже на усилитель само-собой:


Громкость — о чудо! — стала чуточку выше. Интересно, а чего еще можно было ожидать… Мой непритязательный, но тонкий музыкальный слух ничто не оскорбило и, в дальнейшем, для производства была принята именно такая комбинация устройств.
Благо, что для этого всего не пришлось вносить в конструкцию уже печатающегося корпуса никаких изменений. Модуль усилителю можно просто так бросить в корпусе, закатав в термоусадку:

Я еще попробовал другой усилитель. На базе PAM8610. Он точно такой же крошечный, но ему нужно уже 12V питания. Но и хохотало он раскачивает уже до 15W. Однако, взятые для проекта динамики начали ожидаемо хрипеть на такой мощности и кричать «я ща порвусь!». В общем, был сделан вывод, что в этом проекте останутся PAM8403, чтобы не искать новые динамики и не городить дополнительный блок питания. Но так же, в память был отложен и вариант с PAM8610. Возможно использую его на других матюгальниках в доме. Мне их все равно будет нужно не один и не два. Посмотрим…
Пока я играл с лазерами и усилителями, принтер подогнал остальные детали корпуса. Вот так выглядит полный набор компонентов для сборки матюгальника:

Принтер — настоящий лапочка. Это он делает всю работу. Мне остается только винты крутить, да детальки склеивать.
Сперва в верхнюю и нижнюю половины кузова впаиваются резьбовые вкладыши, везде, где это нужно:

Панелька для кнопок снабжается защитной сеточкой для микрофонов и приклеивается к верхней половине корпуса:





Устанавливается плата контроллера и, параллельно с этим, к ней подключаются все необходимые провода:


К одной из половин прихватывается морда с динамиком, которые подключаются к усилителю:


К нижней половине корпуса почти ничего не крепится, кроме ножек и декоративной заглушки:

Пространство за динамиками забивается синтепоном, добытым из старых собачьих игрушек, коих у нас в доме не счесть, хвала Псу и ежемесячной подписке на Bark-Box:




Уложив сентипон и провода, можно все закрыть второй половиной корпуса:

На этом, собственно, и все…
В итоге я изготовил два идентичных друг-другу матюгальника:

Один для своего кабинета-мастерской, другой для общей гостиной:


Надо пожить с ними какое-то время и убедиться, что овчинка выделки стоила. Тогда уже можно будет решить, наклепать ли еще штук пять таких же точно или сделать их как-то иначе. И нужны ли они вообще в системе.
Пока очевиден лишь один факт. Зато забавный… Я настроил систему так, чтобы среди прочего, оповещение срабатывало, если камера наружного наблюдения фиксирует человека. Машины и прочее движение игнорируется. Но если система распознает именно человека, то дом скажет «Warning! Person detected in the front yard».
Так вот… Когда-то Псу потребовалась пара недель, чтобы научиться по команде уверено давать лапу. Зато, упомянутую фразу он выучил за два дня! Два, мать их, дня! Причем совершенно самостоятельно и без всяких поощрительных вкусняшек. Для него это теперь команда, чтобы сорваться с места и с брёхом броситься к окну у двери. И думает, небось еще, мол, вот, хозяева молодцы: теперь не нужно сидеть перед окном целыми днями и почтальона сторожить. Можно спать на мягкой подстилке в гостиной и бежать брехать только когда робот скажет…
Я уверен, что причиной такого быстрого выучивания новой команды является синтепон из собачьих игрушек в матюгальниках. Звуковые волны, проходя через этот наполнитель, приобретают некоторую «собаковость», понятную Псу. Иными причинами я это объяснить не берусь…
Так, что, как минимум один член семьи оценил эту новую функцию дома очень высоко.
Если кто-то захочет себе такое же, то список электронных компонентов можно почерпнуть из текста статьи. Схема организации компонентов:

Детали корпуса для печати:
Пример конфигурационного файла прошивки ESPHome:
# Substitutions
# ================================================================
# Substitutions allow defining reusable variables for values that are repeated
# across the configuration file.
substitutions:
# Controller Configuration
name: 'jh-echo' # Unique identifier for the device in this configuration
friendly_name: 'JHome Echo' # User-friendly name for display in interfaces
# Project Information
project_name: 'JHome.NNVI' # Unique identifier for the project
project_version: '6.0' # Current version of the project configuration
# Board Specifications
board_master: 'ESP32-A1S' # Primary ESP32-based board model
board_slave: 'ESP32 Audio Kit v2.2 A426' # Secondary ESP32-based board model for additional functionality
# On-board Devices Configuration
led_service_pin: '22' # GPIO pin assigned to the service indicator LED
led_action_pin: '05' # GPIO pin assigned to the action indicator LED
# I2C Bus Configuration
i2c_sda_pin: '33' # GPIO pin for I2C data line (SDA)
i2c_scl_pin: '32' # GPIO pin for I2C clock line (SCL)
# DAC (Digital-to-Analog Converter) Pin Configuration
dac_lrclk_pin: '25' # GPIO pin for DAC Left-Right Clock (LRCLK)
dac_bclk_pin: '27' # GPIO pin for DAC Bit Clock (BCLK)
dac_dout_pin: '26' # GPIO pin for DAC Data Output (DOUT)
dac_din_pin: '35' # GPIO pin for DAC Data Input (DIN)
# Headphone Jack Configuration
hdp_state_pin: '39' # GPIO pin connected to headphone jack state detection
# Amplifier Control
amp_output_pin: '21' # GPIO pin controlling the amplifier power state (ON/OFF)
# Button Configuration
btn_1_pin: '36' # GPIO pin assigned to button 1 (Key 1)
btn_2_pin: '13' # GPIO pin assigned to button 2 (Key 2)
btn_3_pin: '19' # GPIO pin assigned to button 3 (Key 3)
btn_4_pin: '23' # GPIO pin assigned to button 4 (Key 4)
btn_5_pin: '18' # GPIO pin assigned to button 5 (Key 5)
#btn_6_pin: '05' # GPIO pin assigned to button 6 (Key 6)
# Basic ESPhome Configuration
# ================================================================
esphome:
# This section defines the basic configuration for the ESPHome device.
name: ${name} # Device's name
friendly_name: ${friendly_name} # Device's friendly name
project:
name: ${project_name} # Project name from substitutions
version: ${project_version} # Project version from substitutions
name_add_mac_suffix: false # Prevent appending the MAC address to the name
# Actions to perform on device boot
on_boot:
priority: -100
then:
- if:
condition:
binary_sensor.is_on: jack_status
then:
- output.turn_off: amp_output
else:
- output.turn_on: amp_output
esp32:
# This section specifies the hardware platform and framework type for the ESP32 board.
board: esp-wrover-kit # ESP32 development board type
framework:
type: arduino # Arduino framework
# Network Configurations
# ================================================================
wifi:
# This section configures the Wi-Fi settings for connecting the device
# to a network or creating an access point for direct communication.
ssid: !secret wifi_ssid # Wi-Fi network name from secrets
password: !secret wifi_password # Wi-Fi password from secrets
ap:
ssid: ${friendly_name} # Access Point (AP) mode SSID
password: !secret ap_password # Access Point (AP) mode password
# Enabling ESPHome Features
# ================================================================
api:
# Enables integration with Home Assistant using the ESPHome API.
encryption:
key: !secret api_key # Encryption key for secure communication
ota:
# Configures Over-the-Air (OTA) updates to allow firmware updates.
platform: esphome # Required platform for OTA
password: !secret ota_password # Password for OTA updates
captive_portal:
# Provides a captive portal for easy Wi-Fi setup when no known network is available.
web_server:
# Enables a local web server for device management and diagnostics.
logger:
# Configures logging options to debug or monitor device activity.
level: INFO # Set logging level to INFO for reduced verbosity
# Additional Features and Integrations
# ================================================================
# Uncomment the section below if you need Improv Wi-Fi setup
# esp32_improv:
# authorizer: none # Setup for Improv without authorization
dashboard_import:
# Imports external configuration files from GitHub for easy reuse and updates.
package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
import_full_config: true # Import full configuration from GitHub
# External Components
# ================================================================
external_components:
# Configures additional components from external sources like GitHub.
- source: github://mulcmu/esphome-es8388-a1s@nightdav-patch
components: [es8388]
refresh: 0s
es8388:
# Initializes and configures the ES8388 audio codec component.
# GLOBAL VARIABLES
# ================================================================
globals:
# Memory for volume level
- id: mem_volume
type: float
restore_value: no
initial_value: '0.5'
# SERIAL INTERFACES
# ================================================================
i2c:
# I2C Bus Configuration
id: bus_a
sda: ${i2c_sda_pin}
scl: ${i2c_scl_pin}
frequency: 400kHz
scan: true
i2s_audio:
# I2S Audio Configuration
i2s_lrclk_pin: ${dac_lrclk_pin}
i2s_bclk_pin: ${dac_bclk_pin}
i2s_mclk_pin: 0
# OUTPUTS
# ================================================================
output:
# Service LED
- platform: gpio
id: led_service
pin: ${led_service_pin}
#inverted: true
# Action LED
- platform: gpio
id: led_action
pin: ${led_action_pin}
# Amplifier Output
- platform: gpio
id: amp_output
pin: ${amp_output_pin}
# MEDIA FUNCTIONS
# ================================================================
media_player:
# I2S Audio Player
- platform: i2s_audio
id: mplayer
name: "Player"
i2s_dout_pin: ${dac_dout_pin}
dac_type: external
mode: stereo
microphone:
# External Microphone
- platform: i2s_audio
id: mic1
i2s_din_pin: ${dac_din_pin}
adc_type: external
channel: left
pdm: false
voice_assistant:
microphone: mic1
# BINARY SENSORS
# ================================================================
binary_sensor:
# Connection status
- platform: status
id: status_connection
internal: true
# Headphones mode (Jack status)
- platform: gpio
id: jack_status
pin:
number: ${hdp_state_pin}
inverted: true
mode:
input: true
name: "Headphones mode"
on_state:
- if:
condition:
binary_sensor.is_on: jack_status
then:
- output.turn_off: amp_output
else:
- output.turn_on: amp_output
# Key 2 - Mute
- platform: gpio
id: btn_mute
pin:
number: ${btn_2_pin}
inverted: true
mode:
input: true
pullup: true
name: "Mute"
icon: mdi:volume-mute
on_press:
- if:
condition:
lambda: 'return id(mplayer).volume == 0.0;'
then:
- media_player.volume_set:
id: mplayer
volume: !lambda 'return id(mem_volume);'
else:
- lambda: 'id(mem_volume) = id(mplayer).volume;'
- media_player.volume_set:
id: mplayer
volume: 0.0
# Key 3 - Volume down
- platform: gpio
id: btn_vol_down
pin:
number: ${btn_3_pin}
inverted: true
name: "Vol. down"
icon: mdi:volume-minus
filters:
- delayed_off: 10ms
on_press:
- media_player.volume_down: mplayer
# Key 4 - Volume up
- platform: gpio
id: btn_vol_up
pin:
number: ${btn_4_pin}
inverted: true
mode:
input: true
pullup: true
name: "Vol. up"
icon: mdi:volume-plus
filters:
- delayed_off: 10ms
on_press:
- media_player.volume_up: mplayer
# Key 5 - Assistant
- platform: gpio
id: btn_assistant
pin:
number: ${btn_5_pin}
inverted: true
mode:
input: true
pullup: true
name: "Voice assistant"
icon: mdi:assistant
filters:
- delayed_off: 10ms
on_press:
- output.turn_on: led_action
- voice_assistant.start:
on_release:
- output.turn_off: led_action
- voice_assistant.stop:
# SENSORS
# ================================================================
sensor:
# Signal strength
- platform: wifi_signal
id: info_signal
name: "[network] Signal"
icon: "mdi:information-box-outline"
unit_of_measurement: "%"
entity_category: diagnostic
filters:
- lambda: |-
return min(max(2 * (x + 100.0), 0.0), 100.0);
# Board temperature
- platform: internal_temperature
id: info_brd_temperature
name: "[board] Temperature"
icon: "mdi:information-box-outline"
unit_of_measurement: "°C"
entity_category: diagnostic
update_interval: 1min
# BUTTONS
# ================================================================
button:
# Restart button
- platform: restart
id: btn_restart
name: "Restart"
# Factory reset button
- platform: factory_reset
id: btn_factory_reset
name: "Reset with Defaults"
# INTERVALS
# ================================================================
interval:
- interval: 10s
then:
- if:
condition:
binary_sensor.is_on: status_connection
then:
- output.turn_on: led_service
- delay: 100ms
- output.turn_off: led_service
else:
- output.turn_on: led_service
# DIAGNOSTIC SENSORS
# ================================================================
text_sensor:
# Wi-Fi Info
- platform: wifi_info
ip_address:
id: info_IP
name: "[network] IP"
icon: "mdi:information-box-outline"
entity_category: diagnostic
ssid:
id: info_SSID
name: "[network] SSID"
icon: "mdi:information-box-outline"
entity_category: diagnostic
bssid:
id: info_MAC
name: "[network] MAC"
icon: "mdi:information-box-outline"
entity_category: diagnostic
# Board Master Info
- platform: template
id: info_brd_master
name: "[board] Master"
icon: "mdi:information-box-outline"
entity_category: diagnostic
update_interval: 1d
lambda: |-
return std::string("${board_master}");
# Board Slave Info
- platform: template
id: info_brd_slave
name: "[board] Slave"
icon: "mdi:information-box-outline"
entity_category: diagnostic
update_interval: 1d
lambda: |-
return std::string("${board_slave}");
Обратите внимание, что я перебросил GPIO неиспользуемой кнопки номер шесть (btn_6_pin) на светодиод. Итого, по RGB-светодиоду получается, что G (зеленый) он берет напрямую с шины питания 3.3V, R (красный) — состояние подключения со встроенного в доску светодиода на led_service_pin, ну а B (синий) — с led_action_pin, который переброшен с неиспользуемой кнопки.
Для адаптации под себя, не забудьте указать ssid/pass для своей сетки, доступу к телу в режиме AP, доступу со стороны системы, в т.ч. и ключ API (нужные строки подсвечены в примере выше). У меня эти данные берутся из общего для всех контроллеров файла secrets.yaml (пример):
wifi_ssid: "MyWiFyck"
wifi_password: "b0brkyrva"
ota_password: "ol0lo"
ap_password: "popya4sa"
api_key: "mnoGAbuKoV_AFtarPESHiEsho="
В остальном можно все оставить без изменений.
Из особенностей конфигурации:
- Встроенная «автоматика», отключающая контур усилителя при подключении 3мм джека в гнездо. Т.е. доска сама следит за тем, что сейчас используется — ее собственный усилитель, или внешний.
- Кнопка Mute, выключая звук, запоминает какая громкость была на этот момент. При повторном нажатии будет восстановлена та громкость, что была. Это работает, как с случае физического нажатия «железной» кнопки на устройстве, так и при вызове ее со стороны сервера.
Что в представленной версии конечного устройства маловероятно т.к. в нем не предусмотрены выходы наружу. Но я люблю стандартизацию, и Пес его там знает в будущем, для чего я применю ту же самую конфигурацию прошивки.
И, повторюсь еще раз, в данных примерах не проверялась работа микрофонов. Инициализируются один из них (левый) и система его, вроде бы, видит. Принимает ли он на самом деле звуки и передает ли куда надо — вопрос… Пока мне эта часть функционала не нужна и не очень интересна, поэтому проверка этого момента отложена на потом. Когда и если оно мне понадобится, я дополню эту статью более конкретной информацией.
Такие дела…