Умный дом на Home Assistant и 3D печать.
 
Telegram-канал FoxJoy
Почта: dm@foxjoy.ru
Домашний интерком

Домашний интерком

Мне понравился проект Home Intercom, который отлично подходит под мои нужды.
Знаете эту ситуацию? Ребёнок играет в гостиной, вы на кухне, и нужно что-то ему сказать. Кричать через весь дом — неудобно, а иногда и невозможно (спят, например).
Я решил сделать себе домашний интерком: нажал кнопку на телефоне → голос из колонок звучит в нужной комнате. Без облаков, без подписок, всё в локальной сети.
Рассказываю, как это повторить.

Схема такая:
[Телефон] —(HTTPS)→ [Сервер: LXC + Docker] —(API)→ [Home Assistant] → [ESP32 + колонка]
                          ↑
                   Caddy (HTTPS)

  • Сервер принимает голос с телефона, сохраняет в WAV и отправляет в Home Assistant
  • Home Assistant проигрывает звук на нужном медиаплеере или на всех возможных
  • ESP32 с PCM5102A — это сама колонка, подключённая по WiFi через ESPHome
  • Caddy обеспечивает HTTPS (нужен для доступа к микрофону браузера)

Что понадобится

Что  Зачем 
 LXC-контейнер или сервер с Debian  Для Docker-сервера
 Home Assistant  Управление медиаплеерами
 ESP32 + плата PCM5102A + динамик  Колонка в комнате
 ESPHome  Прошивка для ESP32
 Android-телефон  Кнопка PTT

Сервер
Создайте LXC-контейнер в Proxmox или возьмите любой Debian-сервер в локальной сети.
Установите Docker:

apt update && apt install -y docker.io docker-compose-plugin

Создайте рабочую директорию:

mkdir -p /opt/home-intercom/audio 

cd /opt/home-intercom

docker-compose.yml

services: 

  intercom:
    image: ghcr.io/mdj2812/home-intercom:latest
    container_name: home-intercom
    restart: unless-stopped
    ports:
      - "8764:8764"
    volumes:
      - ./audio:/data/audio
      - ./rooms.json:/app/rooms.json:ro
    environment:
      - HA_URL=http://192.168.1.ваш IP:8123
      - HA_TOKEN=ваш_токен_HA
      - PUBLIC_URL=http://192.168.1.например 108:8764


HA_TOKEN: Home Assistant → Профиль → Токены долгосрочного доступа → Создать токен.

rooms.json — ваши комнаты
Здесь вы указываете, какие колонки использовать. entity — это entity_id медиаплеера из Home Assistant.

{ 

  "kabinet": {
    "name": "Кабинет",
    "entity": "media_player.esp32_kabinet",
    "announce_volume": 40
  },
  "gostinnaya": {
    "name": "Гостиная",
    "entity": "media_player.esp32_gostinnaya",
    "announce_volume": 60
  }
}
  • announce_volume — громкость объявления (0–100). После воспроизведения вернётся прежняя громкость.
  • Чтобы добавить комнату — добавьте новый блок. Не забывайте запятые в JSON, после каждого блока с комнатой

Проверка перед рестарт

python3 -m json.tool rooms.json > /dev/null && echo "OK" || echo "Ошибка JSON"


HTTPS через Caddy
Микрофон в браузере работает только по HTTPS. Caddy сам сгенерирует внутренний сертификат.
Установите Caddy:

apt install -y debian-keyring debian-archive-keyring apt-transport-https curl 

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install -y caddy

Настройте Caddyfile:

cat > /etc/caddy/Caddyfile << 'EOF' 

https://192.168.1.ваш IP {
    tls internal
    reverse_proxy localhost:8764
}
EOF

Запустите

systemctl enable --now caddy

Колонки в комнатах

Собирал я их раньше и с этим можете ознакомиться в статье "WiFi колонка на esp32-s3 для Home Assistant". 

Настраиваем управление с телефона

1. Скачайте CA-сертификат
Скопируйте корневой сертификат Caddy в доступное место:

cp /var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt /opt/home-intercom/ 

chmod 644 /opt/home-intercom/root.crt

Теперь он доступен по адресу: https://192.168.1.ваш IP/root.crt 

2. Откройте этот адрес на телефоне
Браузер покажет предупреждение — нажмите "Всё равно открыть". Файл скачается.
3. Установите сертификат (Android)
Настройки → Безопасность → Шифрование и учётные данные → Установить сертификат → Центр сертификации (CA).
Выберите скачанный файл, подтвердите установку. Или просто тапнуть по сертификату и установить его :)

4. В браузере на телефоне перейдите: https://192.168.1.ваш IP
Страница должна открыться без предупреждений. Зажмите кнопку — говорите фразу — отпустите. Голос отправится на нужную или как вариант на все подключенные в доме колонки. Когда вы нажимаете кнопку, перед объявлением воспроизводится звонок дверного звонка - это достаточно забавно и удобно. 

Автозапуск
В общем всё уже настроено на автозапуск: 

  • Docker стартует при загрузке (systemctl enable docker)Контейнер поднимется автоматически (restart: unless-stopped)
  • Caddy стартует через systemd

После перезагрузки сервера интерком будет работать без ручного вмешательства.

Что у нас в итоге получилось:

  • Интерком работает только в локальной сети
  • Никаких облаков, подписок и сторонних сервисов
  • Громкость для каждой комнаты настраивается отдельно
  • Добавить новую комнату = одна запись в rooms.json + колонка в HA

Проект простой, но решает конкретную задачу: сказать что-то в нужную комнату, не вставая с места. Рекомендую, если у вас большой дом и маленькие дети.

Полезные ссылки:
Репозиторий проекта: https://github.com/mdj2812/home-intercom
ESPHome: https://esphome.io/
Home Assistant: https://www.home-assistant.io/
Caddy: https://caddyserver.com/