Help us improve
Share bugs, ideas, or general feedback.
From cce-homeassistant
Configures Home Assistant Assist voice control with pipelines, custom intents, wake words, TTS/STT engines (Piper, Faster Whisper), and satellites. Use for local setups and natural voice commands.
npx claudepluginhub nodnarbnitram/claude-code-extensions --plugin cce-homeassistantHow this skill is triggered — by the user, by Claude, or both
Slash command
/cce-homeassistant:ha-voiceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Configure Assist pipelines, custom intents, wake words, speech processing, and voice satellites for local voice control.
Develops custom Home Assistant integrations including config flows, entities, platforms, manifest.json, and device registry. Prevents common errors in coordinators, async setup, and entity registration.
Operates Home Assistant via HA NOVA (App + Relay) with local OS auth. Provides preview-before-write, compact output, and reliable file-based quoting for automation tasks.
Applies agentic design patterns (tool use, routing, planning, exception handling, memory) to Home Assistant for smart home automation and IoT orchestration.
Share bugs, ideas, or general feedback.
Configure Assist pipelines, custom intents, wake words, speech processing, and voice satellites for local voice control.
# configuration.yaml
assist_pipeline:
pipelines:
- language: en
name: Default Pipeline
stt_engine: faster_whisper # Local STT
tts_engine: tts.piper # Local TTS
conversation_engine: conversation.home_assistant
wake_word_entity: binary_sensor.wake_word
Why this matters: The pipeline connects all components (STT, TTS, intent, conversation agent) into a single voice workflow.
# custom_sentences/en/turn_on.yaml
language: en
version: 1
intents:
TurnOn:
data:
- sentences:
- "turn on the [area] {name:list}"
- "turn on {name:list}"
- "[please] activate {name:list}"
lists:
name: light_names
lists:
light_names:
- "bedroom light"
- "kitchen overhead"
- "living room"
Why this matters: Custom sentence patterns enable natural voice commands tailored to your home.
Local Option - Piper:
tts:
- platform: piper
language: en_GB
voice: jenny_dioco
Cloud Option - OpenAI:
tts:
- platform: tts
service: google_translate_say # or openai, google cloud
language: en
Why this matters: TTS gives voice feedback; local options require no cloud dependencies.
Local Option - Faster Whisper:
stt:
- platform: faster_whisper
language: en
Cloud Option - Google Cloud Speech:
stt:
- platform: google_cloud
language_code: en-US
Why this matters: STT converts spoken commands to text; local options provide privacy.
custom_sentences/ directory for intent configuration (not deprecated sentences/){name:list} syntax for slot-based entity matchingversion: 1 in custom_sentences YAML filessentences/ directory with new custom_sentences/ (use custom_sentences/ only){query} for every slot (makes intents ambiguous)❌ Wrong - Hardcoded entity IDs:
intents:
TurnOn:
data:
- sentences:
- "turn on light.bedroom"
- "turn on light.kitchen"
✅ Correct - Using slot lists:
intents:
TurnOn:
data:
- sentences:
- "turn on [the] {name:list}"
lists:
name: light_names
lists:
light_names:
- "bedroom"
- "kitchen"
Why: Lists are dynamic and can be generated from Home Assistant entities programmatically.
Named slots match list values:
sentences:
- "turn on {name:list}" # Matches list value, captures as 'name' slot
List matching provides slot values:
lists:
room:
- "bedroom"
- "kitchen"
- "living room"
Square brackets make words optional:
sentences:
- "[please] turn on the {name:list}"
- "activate [the] {device:list}"
Wildcard slots capture any text:
sentences:
- "remind me {reminder:text}" # Captures any text as 'reminder'
- "set a timer for {duration:text}"
intents:
TurnOn:
data:
- sentences:
- "[please] [turn on | switch on | activate] [the] {area} {name:list}"
- "[please] turn on {name:list}"
- "activate {name:list} [in the] {room:list}"
lists:
name: light_names
room: room_names
Reminder:
data:
- sentences:
- "remind me {reminder:text}"
- "[please] [create | set] a reminder [for me] [to] {reminder:text}"
lists:
light_names:
- "bedroom light"
- "kitchen overhead"
- "living room lamps"
room_names:
- "bedroom"
- "kitchen"
- "living room"
Why this matters: Flexible patterns enable natural phrasing while maintaining intent recognition accuracy.
Home Assistant provides default intents:
HassTurnOn / HassTurnOff - Control devicesHassToggle - Toggle switches/lightsHassOpenCover / HassCloseCover - Control coversHassSetClimate - Control climate (heat/cool)HassGetState - Get entity stateHassGetHistory - Query automation historyHassArmAlarm / HassDisarmAlarm - Arm/disarm alarmsHassLockDoor / HassUnlockDoor - Control locksYou create additional intents in custom_sentences/ by defining new intent blocks:
intents:
CustomIntentName:
data:
- sentences: [...]
conversation:
engine: openai
# Enable openWakeWord
binary_sensor:
- platform: openwakeword
models:
- alexa # "Alexa, help"
- hey_google # "Hey Google, ..."
- hey_siri
binary_sensor:
- platform: porcupine
access_key: !secret porcupine_key
keywords:
- hey_home_assistant
# ESPHome device
packages:
voice_assistant: !include packages/voice_assistant.yaml
# Or inline configuration:
i2s_audio:
i2s_lrclk_pin: GPIO33
i2s_bclk_pin: GPIO34
i2s_mclk_pin: GPIO32
microphone:
- platform: i2s_audio
id: mic
adc_type: external
i2s_din_pin: GPIO35
pdm: false
speaker:
- platform: i2s_audio
id: speaker
dac_type: external
i2s_dout_pin: GPIO36
mode: mono
voice_assistant:
microphone: mic
speaker: speaker
noise_suppression_level: 2
auto_gain: 80dB
volume_multiplier: 0.8
Why this matters: Voice satellites extend Assist to multiple rooms with local processing.
Full Support (20+ languages): en, de, fr, it, es, nl, pl, pt, ru, sv, tr, uk, zh, ja, ko, and more
Partial Support (40+ languages): Regional variants and additional languages with varying STT/TTS availability
Community Support (80+ languages): Community-contributed sentence templates
Language Config:
assist_pipeline:
pipelines:
- language: de # German
name: Deutsche Pipeline
tts_engine: tts.piper # Set voice per language
STT (Faster Whisper):
stt:
- platform: faster_whisper
language: en
model: base # tiny, base, small, medium, large
acceleration: gpu # CPU or GPU
TTS (Piper):
tts:
- platform: piper
voice: en_GB-jenny
rate: 11025 # Audio sample rate
volume_normalize: true
Built-in Agent:
conversation:
engine: home_assistant
OpenAI Agent:
conversation:
engine: openai
api_key: !secret openai_api_key
model: gpt-4
Custom Conversation Agent:
conversation:
engine: custom
module: custom_components.my_agent
intents:
TurnOn:
data:
- sentences:
- "turn on [the] {name:list}"
- "[please] activate {name:list}"
lists:
name: light_names
intents:
SetClimate:
data:
- sentences:
- "set [the] {room:list} [thermostat] to {temp:number} degrees"
- "make it {temp:number} in [the] {room:list}"
lists:
room: room_names
intents:
GetState:
data:
- sentences:
- "what is the temperature [in the] {room:list}"
- "is [the] {name:list} on"
lists:
room: room_names
name: device_names
Symptoms: Voice command doesn't match any intent
Solution:
# Check custom_sentences directory structure
ls -R config/custom_sentences/
# Verify YAML syntax
cat config/custom_sentences/en/custom.yaml
# Test in Assist Developer Tools with exact phrase
# Adjust sentence patterns to match expected phrasing
Symptoms: "Engine not available" error in Assist
Solution:
# Verify engine is configured
service: tts.piper # Must exist
# Check dependencies installed
pip install piper-tts # for Piper
pip install faster-whisper # for Whisper
# Restart Home Assistant to load engines
Symptoms: Binary sensor stays off despite noise
Solution:
# Verify entity_id is correct
service: homeassistant.update_entity
target:
entity_id: binary_sensor.wake_word
# Check binary sensor configuration
# Review noise levels and model sensitivity
# Test microphone separately
Symptoms: ESP32 disconnects from WiFi or Assist pipeline
Solution:
# Check WiFi signal strength in ESPHome logs
# Reduce WiFi distance or add access point
# Update ESPHome firmware
esphome run voice_assistant.yaml --upload-speed 115200
| Component | Version | Purpose |
|---|---|---|
| Home Assistant | 2024.1+ | Assist platform |
| Faster Whisper | 0.5+ | Local STT engine |
| Piper TTS | 1.0+ | Local TTS engine |
| Component | Version | Purpose |
|---|---|---|
| OpenWakeWord | 0.3+ | Wake word detection |
| Porcupine | Latest | Premium wake word |
| ESPHome | 2024.1+ | Voice satellite devices |
Before using voice commands, verify:
custom_sentences/en/ directory created with intent definitions