VoIP Stack for Home Assistant and ESPHome
Current stable release: 2026.9.0
VoIP Stack turns Home Assistant, ESPHome devices and standard SIP phones into a
real local communications system.
Home Assistant is not merely controlling a few call buttons. It can act as a
SIP endpoint, browser softphone host, call router, media bridge, local SIP
registrar, conference focus and optional SIP trunk endpoint.
ESPHome devices become local SIP phones. Depending on their hardware and
firmware profile, they can provide audio intercom, Voice Assistant features or
complete bidirectional audio and video on ESP32-P4.
The simple use case is still simple:
Door button → Home Assistant rings → answer → talk → hang up.
But the same installation can grow into a local house phone system, a video
doorbell, room-to-room calling, registered SIP phones, ring groups,
conferences, external calls and an Assist-powered answering machine.
For normal local installations, no separate Asterisk or FreeSWITCH server is
required.
Built for people who would rather call an ESP32 than another human being.
Entirely understandable.
What can you build?
| Scenario | What happens |
|---|---|
| Video doorbell | A SIP video door station calls Home Assistant. Answer from a browser, wall tablet or Companion app with audio and video. |
| ESPHome door intercom | An ESP button calls Home Assistant, another ESP, a room phone, a ring group or an external destination. |
| ESPHome videophone | A supported ESP32-P4 sends its camera, receives remote video and displays the caller on its physical screen while bidirectional audio remains active. |
| Room-to-room phones | Give Kitchen, Bedroom, Reception or Warehouse their own HA browser phone or ESPHome device. Call between rooms by name or extension. |
| ESP-to-ESP intercom | ESPHome endpoints discover the shared phonebook and call each other through standard SIP/SDP/RTP. |
| Home Assistant softphones | Create one or more logical HA phones, each with its own Device, state, extension, DND, groups, camera policy and Lovelace card. |
| Existing SIP equipment | Register Zoiper, Linphone, baresip, pjsua, an ATA or a standard SIP phone directly to Home Assistant. |
| External calls | Connect an optional provider or PBX trunk and route calls between external networks and local endpoints. |
| Ring groups | Call several HA phones, ESPs and registered SIP clients together. The first answer wins and the remaining phones stop ringing. |
| Conference rooms | Home Assistant hosts an audio conference and mixes participating HA, ESP and registered SIP endpoints. |
| Call Home Assistant Assist | Give an Assist pipeline a phonebook name and extension, then call it from an ESP, SIP phone, HA softphone or external trunk. |
| Automated answering | Let phones ring first, then forward the same unanswered call to Assist using a normal Home Assistant automation. |
One Home Assistant, many real phones
VoIP Stack can host multiple logical Home Assistant phones.
Keep the default phone, then open:
Settings → Devices & services → VoIP Stack → Add phone
Create phones such as Home, Kitchen, Reception, Workshop, a bedroom tablet or
a warehouse kiosk.
Every browser phone is a native Home Assistant config subentry and Device. It
has its own:
- optional extension;
- call state and connectivity;
- call Event Entity;
- Do Not Disturb;
- Auto Answer and Send Camera settings;
- ring-group and conference-group membership;
- preferred microphone, speaker and camera.
Bind one VoIP Stack card to the intended Device using the visual card editor.
The card, Device controls and Home Assistant actions all update the same
persisted backend configuration.
A logical phone can still ring while its tablet is temporarily offline. This
allows missed-call, timeout and forwarding automations to work even when a
kiosk browser is not open.
For a real room-to-room call, use two different browser sessions or devices.
Two cards in the same browser tab cannot represent two independent rooms
because one browser tab owns one microphone, speaker and camera pipeline.
Native SIP video in Home Assistant

Home Assistant browser phones can negotiate standard SIP video with compatible
phones, PBXs and video door stations.
The browser path supports:
- H.264, VP8 and JPEG;
- bidirectional and one-way video;
- calls that begin with audio and add video later;
- browser camera return on compatible calls;
- live microphone, speaker and camera selection.
An optional bounded FFmpeg receive path can convert H.263, H.263-1998 or H.265
for display in the browser.
The card preserves the native aspect ratio inside its assigned Lovelace slot,
so video does not expand into neighbouring dashboard columns. Audio remains
active if video is unavailable or rejected.
Video requires HTTPS, browser permission, a compatible browser and a reachable
RTP path.
ESPHome has a videophone now
The maintained ESP32-P4 profiles turn a development board into a complete SIP
videophone.
The P4 can transmit its own camera, receive the remote RTP video stream, decode
it and display the other party on its physical MIPI DSI panel while
bidirectional audio remains active.
Calls can start directly with audio and video, or begin as ordinary audio calls
and enable video later. When the call ends, the device returns to its normal
LVGL interface.
Separate JPEG and H.264 profiles keep each firmware focused on the selected
codec. The full JPEG profile can combine the videophone with AFE echo
cancellation, Micro Wake Word, Voice Assistant, LVGL, TTS, HTTP media and
Sendspin.
JPEG is the stable full-device baseline. H.264 remains experimental in
2026.9.0.
This opens the door to custom ESPHome videophones, video doorbells and
room-to-room devices that remain completely local.
One shared phonebook and dial plan
The central phonebook can contain:
- Home Assistant browser phones;
- discovered ESPHome VoIP endpoints;
- registered SIP accounts;
- Home Assistant Assist pipelines;
- manual SIP contacts and internal extensions;
- external destinations reached through an optional trunk;
- dynamic ring groups and conference groups.
Dial a destination by friendly name, extension, SIP URI or telephone number.
VoIP Stack resolves the route and media capabilities centrally.
Registered SIP accounts appear only while their registration is valid.
Discovered ESPHome contacts follow device availability, while static contacts
and browser phones remain available independently.
ESP endpoints can use direct local SIP/RTP where appropriate. Home Assistant
can bridge calls when the route, transport or media formats require it.
Ring groups and conference rooms
A ring group may contain browser phones, ESP endpoints, registered SIP clients
and manual contacts.
VoIP Stack checks DND, busy state, availability and endpoint capabilities
before making the phones ring. The first valid answer wins and the remaining
destinations are cancelled.
Conference groups are different: participants join the same HA-hosted mixed
audio room. Optional members can ring when the room starts, and resources are
released when the last participant leaves.
Home Assistant Assist becomes a telephone destination
Assist can appear in the same phonebook as every other endpoint.
Give a pipeline a name and optional extension, then call it from an ESPHome
phone, a Home Assistant browser phone, a registered SIP client or an external
trunk.
The telephone call remains open for a normal multi-turn conversation:
- STT listens to the caller;
- the configured conversation agent processes the request;
- the selected TTS provider streams its reply into the same call;
- Assist returns to listening;
- the conversation continues until hangup.
The assistant’s behaviour belongs in the selected pipeline prompt. It can be a
polite receptionist, a domestic secretary or something considerably less
respectable.
Optional VoIP Stack Assist intents also let Voice Assistant satellites control
calls with phrases such as Call Kitchen, Answer, Decline and
Hang up.
A normal Home Assistant automation can let a door or room phone ring for a
chosen period and then forward the same unanswered call to Assist. Presence,
schedules and caller identity can all become automation conditions.
The ordinary phonebook, extensions, groups and configured fallback destination
remain the stable default. Automation-native routing is an optional layer for
more advanced installations.
ESPHome endpoints and full voice devices
ESPHome endpoints advertise the media they actually have:
| Derived role | Media |
|---|---|
full_duplex |
Microphone TX and speaker RX |
mic_only |
Microphone TX only |
speaker_only |
Speaker RX only |
Maintained full-experience profiles can combine:
- media playback and Music Assistant or Sendspin;
- TTS, Micro Wake Word and Voice Assistant;
- ringtone and VoIP calls;
- LVGL controls and call state;
- lightweight AEC or full ESP-SR AFE;
- camera capture and physical video presentation on supported ESP32-P4
profiles.
Playback feeds one coordinated output and one phase-coherent echo reference.
Micro Wake Word, Voice Assistant and VoIP TX consume the same cleaned post-AEC
microphone instead of creating competing audio paths.
The project is split into reusable components:
voip_stack, Home Assistant integration, card, routing, registrar, trunk and browser media;esphome-voip-stack, ESPHome SIP/SDP/RTP phone component;esphome-audio-stack, full-duplex audio, codecs, AEC/AFE and clean audio surfaces;esphome-runtime-controller, arbitration for media, Voice Assistant, VoIP, LEDs and displays.
Installation
Home Assistant through HACS
- Open HACS and search for VoIP Stack.
- Download the latest stable release.
- Restart Home Assistant.
- Open
Settings → Devices & services → Add integration. - Search for VoIP Stack and complete the setup flow.
- Add additional browser phones or standard SIP accounts with Add phone.
The integration registers the Lovelace card automatically.
Default ports:
| Purpose | Default |
|---|---|
| SIP signaling | 5060 |
| RTP base | 40000 |
ESPHome
Start from a maintained YAML matching your board and use case:
The maintained YAMLs reference the stable main branches of the project
components.
Important limits and security notes
- Local SIP and RTP are plaintext. Use a trusted LAN, VLAN or VPN.
- Do not expose ESP SIP/RTP listeners directly to the public Internet.
- Assist and normal ESP32-S3 profiles are audio-only.
- Video requires a browser phone, compatible SIP device or supported ESP32-P4
videophone profile. - Conference video mixing is not implemented.
- There is no SRTP, SIP/TLS on ESP, ICE/STUN/TURN or call recording.
- H.264 on ESP32-P4 remains experimental in
2026.9.0. - Provider, PBX, NAT and third-party door-station behaviour can vary.
- Read the breaking changes before upgrading custom YAMLs or automations.
Links
- Main repository and complete documentation
- Stable
2026.9.0release - Breaking changes
- SIP video documentation
- Automation dial-plan examples
- Services and actions
- Troubleshooting
- GitHub Sponsors
Feedback wanted
Compatibility reports are especially useful for SIP video devices, real PBX
and provider trunks, registered SIP clients, ESP32-S3 and ESP32-P4 hardware,
and room-to-room installations.
When reporting a problem, please include the exact call path, SIP transport,
offer and answer SDP, endpoint models and negotiated codecs where possible.
This started as an ESPHome intercom.
Now Home Assistant has a local phone system living inside it, and apparently
the ESP32-P4 demanded a screen too.
![]()





















