본문 바로가기

잠자던 스마트폰, TTS·음악·알람 완벽한 스마트 스피커로 화려한 재탄생

728x90

안 쓰는 구형 스마트폰을 Home Assistant “스마트 스피커”로 집안의 작은 비서로 부활한 스마트폰

안드로이드 스마트폰 1대만 있으면 구글스피커 없이도 음성 안내(TTS), 음악/사운드 재생, 자동화 알림까지 모두 구현할 수 있습니다. Companion App 단기 완성 → Tasker+MQTT 고급화하는 간단한 방법입니다.

개요 — 어떤 방식이 좋은가요?

  1. 가장 간단(5분 완성): Home Assistant 앱의 모바일 알림 + TTS
    • notify.mobile_app_... 서비스로 즉시 음성 안내 가능
    • “센서만 잡히는데요?”가 정상입니다(앱만 설치해선 media_player 엔티티는 생기지 않음)
  2. 가장 유연(강력 추천): Tasker + MQTT
    • HA → MQTT 명령(say:, play: 등) → 스마트폰(Tasker)이 TTS/오디오 재생
    • 플레이/정지/볼륨/플레이리스트 등 모바일 기기 전체 제어까지 확장 가능
  3. 보너스(선택): 가상 엔티티/UI 구성
    • MQTT Discovery로 가상 엔티티(button/number/select 등) 노출, Lovelace 카드로 미디어 컨트롤 패널 만들기
    • “진짜 media_player” 에뮬레이션은 가능하지만, 규격이 까다로워 버튼/넘버/셀렉트 조합을 권장

준비물

  • 안드로이드 스마트폰(충전 고정, 스탠드 권장)
  • Home Assistant(Any) + 내부망 Wi-Fi
  • Home Assistant Android Companion App
  • (고급) Tasker + MQTT 플러그인(또는 Tasker의 MQTT 액션)
  • (선택) 로컬 TTS Piper 애드온

체크리스트

  • VLAN 분리(스마트홈/관리망) + HA 원격접속은 TLS/인증 필수
  • MQTT 계정·비밀번호, 필요 시 TLS 활성화, 토픽 화이트리스트
  • 안드로이드 절전 예외·방해 금지 해제·알림 우선순위 높음
  • ADB 디버깅 상시 Off, 필요한 경우에만 일시 On
  • 로그: HA 호출 이력, MQTT 접속 로그, Tasker 실행 이력 정기 점검

5분 완성: Companion App로 TTS 안내

1. 스마트폰 기본 설정

  • Wi-Fi 고정(IP 예약), 자동 잠금/절전 예외에 Home Assistant 앱 추가
  • 알림 허용(소리/팝업/잠금화면 표시 “허용”)

2. Companion App 등록

  1. 스마트폰에 Home Assistant 앱 설치 → HA URL 로그인
  2. HA 개발자도구 → 서비스에서 notify.mobile_app_<기기명> 확인

3. 즉시 TTS 테스트

service: notify.mobile_app_<기기명>
data:
  title: "시스템 알림"
  message: "테스트 음성입니다."
  data:
    ttl: 0
    priority: high
    tts: true
  • 잠금 화면/무음에서도 읽히도록 priority: high, ttl: 0 권장

4. 자동화 예시(현관문 열림 → 음성)

alias: "현관: 문 열림 안내"
trigger:
  - platform: state
    entity_id: binary_sensor.door_front
    from: "off"
    to: "on"
action:
  - service: notify.mobile_app_<기기명>
    data:
      title: "현관 알림"
      message: "현관문이 열렸습니다."
      data:
        ttl: 0
        priority: high
        tts: true
mode: single

포인트: Companion App만으로도 음성 안내 품질/지연이 매우 우수합니다.

고급: Tasker + MQTT로 “스마트 스피커”화

1. MQTT 브로커(HA 애드온: Mosquitto)

  1. 애드온 설치 → 사용자/비밀번호 생성(예: ha / 강력암호)
  2. HA 설정 → 통합구성요소 → MQTT 추가, 브로커 연결
  3. (선택) TLS 적용 시 인증서/포트 설정

예시(mosquitto ACL, 필요 시)

user ha
topic readwrite home/phone01/#
topic readwrite homeassistant/#

2. Tasker 설정(스마트폰)

  1. Tasker 설치 (+ MQTT 플러그인 또는 Tasker의 MQTT 액션 사용)
  2. 프로필Event: MQTT Subscribe
    • Topic: home/phone01/cmd
  3. 태스크(명령 파서) — 메시지 규칙:
    • say:문장TTS 읽기
    • play:URLURL 오디오/MP3 재생
    • vol:0-15볼륨 설정(미디어 볼륨)
    • stop정지

Tasker 액션 예시(핵심만)

  • If %mqtt_msg ~R ^say:(.*)SayText: %mq1, Stream: Media, Pitch/Speed: 취향
  • Else If ^play:(.*)Open URLURL: %mq1(http/https mp3/stream)
  • Else If ^vol:(\d+)Audio → Media Volume%mq1
  • Else If ^stop$Media Control → Stop
  1. 상태 보고(선택)
    • MQTT Publishhome/phone01/state 에 JSON 출력
    • 예: {"status":"idle","volume":10}
    • LWT(유언 메시지) 설정 시 오프라인 탐지 가능
300x250

3. HA에서 명령 보내기(서비스 예시)

1) 말하기

service: mqtt.publish
data:
  topic: "home/phone01/cmd"
  payload: "say:거실 온도는 {{ states('sensor.living_temp') }}도 입니다."

2) 사운드/음악 재생

service: mqtt.publish
data:
  topic: "home/phone01/cmd"
  payload: "play:https://example.local/media/chime.mp3"

3) 볼륨/정지

service: mqtt.publish
data:
  topic: "home/phone01/cmd"
  payload: "vol:8"
service: mqtt.publish
data:
  topic: "home/phone01/cmd"
  payload: "stop"

4. 자동화 시나리오(예시)

A) 아침 브리핑(날씨+일정 → 말하기 + 음악)

alias: "아침 브리핑"
trigger:
  - platform: time
    at: "07:30:00"
action:
  - service: mqtt.publish
    data:
      topic: "home/phone01/cmd"
      payload: >
        say:{{ now().strftime('%-m월 %-d일 %A') }} 아침입니다.
        현재 기온 {{ states('sensor.outdoor_temp') }}도,
        강수확률 {{ states('sensor.pop') }}퍼센트 입니다.
  - delay: "00:00:05"
  - service: mqtt.publish
    data:
      topic: "home/phone01/cmd"
      payload: "play:https://example.local/media/playlist/morning.m3u"
mode: single

B) 보안 이벤트(침입 감지 → 경고·사이렌)

alias: "보안: 침입 경고"
trigger:
  - platform: state
    entity_id: binary_sensor.intrusion
    to: "on"
action:
  - service: mqtt.publish
    data:
      topic: "home/phone01/cmd"
      payload: "say:경고! 침입이 감지되었습니다. 확인이 필요합니다."
  - service: mqtt.publish
    data:
      topic: "home/phone01/cmd"
      payload: "play:https://example.local/media/siren.mp3"
mode: restart

로컬 TTS(Piper) 연동 — 더 자연스럽고 빠르게

1. TTS 설정

# configuration.yaml
tts:
  - platform: piper
    voice: ko_KR-<설치한_보이스명>

2. 파일 생성 → 스마트폰 재생

Piper는 음성 파일을 만듭니다. 파일 경로나 “마지막 TTS 파일” 경로는 설치 방식에 따라 다를 수 있습니다.

alias: "Piper 브리핑 + 재생"
sequence:
  - service: tts.piper_say
    data:
      entity_id: media_player.dummy   # 재생용이 아닌 파일 생성 트리거 용도
      message: "지금은 {{ now().strftime('%H시 %M분') }} 입니다."
  - delay: "00:00:02"
  - service: mqtt.publish
    data:
      topic: "home/phone01/cmd"
      payload: "play:https://example.local/media/tts/last_tts.mp3"

운영 팁: NAS/HA Media 폴더에 TTS 출력 디렉터리 고정 → 고정 URL로 Tasker play: 호출.

가상 엔티티 & 대시보드(UI) — 깔끔한 컨트롤 패널

“진짜 media_player” 에뮬은 스펙이 까다로워 아래 조합을 권장합니다.

1. MQTT Discovery로 버튼/넘버/셀렉트 공개

플레이/정지 버튼

# Publish once (Discovery)
topic: homeassistant/button/phone01_play/config
payload: {"name":"Phone01 Play","command_topic":"home/phone01/cmd","payload_press":"play:https://example.local/media/radio.m3u","unique_id":"phone01_play"}

topic: homeassistant/button/phone01_stop/config
payload: {"name":"Phone01 Stop","command_topic":"home/phone01/cmd","payload_press":"stop","unique_id":"phone01_stop"}

볼륨 넘버

topic: homeassistant/number/phone01_vol/config
payload: {"name":"Phone01 Vol","command_topic":"home/phone01/cmd","min":0,"max":15,"step":1,"mode":"slider","unique_id":"phone01_vol","set_value_template":"vol:{{ value }}"}

플레이리스트 셀렉트

topic: homeassistant/select/phone01_playlist/config
payload: {
  "name":"Phone01 Playlist",
  "command_topic":"home/phone01/cmd",
  "options":["news","jazz","rain"],
  "unique_id":"phone01_playlist",
  "command_template":"{% if value=='news' %}play:https://example/media/news.m3u{% elif value=='jazz' %}play:https://example/media/jazz.m3u{% else %}play:https://example/media/rain.m3u{% endif %}"
}

2. Lovelace 카드(예시)

type: vertical-stack
cards:
  - type: entities
    title: Phone01 Controls
    entities:
      - button.phone01_play
      - button.phone01_stop
      - number.phone01_vol
      - select.phone01_playlist

실제 media_player 없이도 대시보드 조작감을 충분히 낼 수 있습니다.

운영 기준 점검 포인트

  1. 네트워크/접근제어
    • HA, MQTT는 내부망 한정(필요 시 VPN)
    • 외부 노출은 TLS + 인증 + IP 제한
    • 스마트홈 VLAN 따로, 관리단에서만 설정 변경
  2. MQTT 보안
    • 사용자/비밀번호 필수, 익명 접속 금지
    • 토픽 최소권한(예: home/phone01/#만)
    • 가능하면 TLS(서버 인증서/클라이언트 인증서)
    • LWT로 단말 이탈 탐지, QoS=1 이상 고려
  3. 스마트폰 하드닝
    • 불필요 앱·권한 제거, 절전 예외
    • ADB Off(필요 시 순간 On, Wi-Fi 디버깅은 더 엄격)
    • 화면 잠금/부팅 자동 실행(Tasker) 설정
  4. 무결성/미디어 경로
    • 재생 URL은 내부 NAS/HA Media 폴더 등 신뢰 경로로 고정
    • (선택) 서명/토큰·만료시간 적용, 디렉터리 인덱싱 차단
  5. 관제/로그
    • HA 자동화 호출 이력, Mosquitto 접속 로그, Tasker 동작 로그 주기 점검
    • 이상 토픽/빈도 감시(탐지 룰) → 알림/차단

트러블슈팅

  • 앱만 설치했는데 media_player가 안 보여요
    → 정상입니다. Companion App은 센서/알림 중심입니다. TTS는 notify.mobile_app로 처리하고, 고급 컨트롤은 Tasker+MQTT로 확장하세요.
  • TTS가 안 들려요
    → 방해금지/무음/절전/알림 우선순위 확인, priority: high, ttl: 0 적용
  • URL 재생이 실패해요
    → 내부 DNS/인증서/접근권한 확인, HTTP Range/Content-Type 점검, Wi-Fi 연결 유지
  • 지연이 느려요
    → Piper(로컬 TTS) 사용, 같은 AP(5GHz) 사용, HA·MQTT·미디어 저장소 근접 배치

추천 시나리오

  1. 빠른 구축: notify.mobile_app + tts:true → 음성안내 완료
  2. 유연 확장: Tasker+MQTT로 say:/play:/vol:/stop 명령 체계 → 음악/효과음/브리핑 자동화
  3. 깔끔 UI: MQTT Discovery(버튼/넘버/셀렉트) + Lovelace 카드 → 리모컨 수준 조작
  4. 보안 필수: MQTT 인증/TLS, ADB 상시 Off, 토픽 최소권한+로그 관제
728x90
그리드형(광고전용)

댓글