Skip to content

2026.8.0: Native HA Video Phones, Multi-Room Calling And PBX Routing

Latest

Choose a tag to compare

@n-IA-hane n-IA-hane released this 23 Jul 10:29
· 6 commits to main since this release

2026.8.0: Native HA Video Phones, Multi-Room Calling And PBX Routing

Important

Read the Breaking Changes
before upgrading. This
release deliberately removes development-only aliases and may require
reconfiguring VoIP Stack and updating existing automations.

2026.8.0 is the release where VoIP Stack stops looking like one clever
intercom and starts behaving like a small, Home Assistant-native communications
system. ESP devices, browser phones, wall tablets, standard SIP accounts,
Assist, ring groups, conference rooms and an optional provider trunk now share
one local roster and one standards-based SIP/SDP/RTP call model.

This note contains only the user-visible delta since stable 2026.7.1.

Video doorbell and private room-to-room calls through Home Assistant

🏠 One Home Assistant, Every Phone

Home Assistant can now host multiple logical browser phones. Keep the migrated
default phone, then add Kitchen, Reception, Office or any other room from
Settings > Devices & services > VoIP Stack > Add phone. Bind one
ha_softphone card and one real browser/tablet session to each Device.

  • Every HA phone has its own name, extension, DND, availability, groups, video
    capability and call state.
  • Browser phones and registered SIP accounts are native integration Devices
    with scoped state, connectivity, controls and call Event Entities.
  • ESP phones remain their existing ESPHome Devices. VoIP Stack discovers and
    routes them without creating duplicates.
  • Logical phones share the same SIP listeners and dynamic RTP pool; they do not
    reserve one server port set per room.
  • Two browser phones can call each other locally with independent audio and
    video. External legs remain normal SIP/SDP/RTP.
  • One endpoint owns one call. A second caller receives 486 Busy Here, while
    calls to other phones continue independently.
  • A logical phone may keep ringing while its kiosk browser is offline, allowing
    missed-call, timeout and fallback automations to remain meaningful.

Home Assistant as the local SIP and PBX hub

🎥 SIP Video Calling

SIP video is supported in web browsers, the Home Assistant Companion app,
standard SIP video door stations, SIP video phones and softphones, including
compatible routes through a PBX or trunk. ESPHome endpoints intentionally
remain audio-only.

  • Direct receive supports H.264, VP8 and RTP/JPEG without decoding or
    re-encoding video on the HA server.
  • Compatible H.264 and VP8 calls can send the browser camera when both the
    integration-wide permission and that phone's persistent Send Camera
    switch are on. Auto Answer and Send Camera are phone settings stored
    by the integration, so clearing browser cache does not reset them; microphone
    and camera permission remains local to the browser that owns the call media.
  • Optional bounded FFmpeg receive converts H.263, H.263-1998 or H.265 to VP8.
    It is receive-only, single-slot and never records an intermediate file.
  • Incoming and outgoing calls support sendrecv, sendonly, recvonly and
    inactive directions.
  • Direct calls and video-capable trunk/PBX routes use the same media contract.
    Authenticated retries preserve the complete audio/video offer.
  • A direct HA-browser dialog can accept compatible peer-initiated video
    add/remove, hold/resume and RTP endpoint changes through re-INVITE or UPDATE.
  • RTP/AVP remains the compatible default. Negotiated AVPF adds compound RTCP
    reports and bounded PLI/FIR key-frame recovery.
  • Camera denial, decoder failure, unsupported video or optional transcoder
    failure does not tear down compatible audio.
  • The card keeps video inside its configured Lovelace geometry, preserves the
    native aspect ratio and moves identity, duration and Hang Up into a compact
    translucent bottom bar.
  • Detailed media counters appear only with backend debug and Extended
    information
    enabled.

Live SIP video in the Home Assistant softphone card

Video remains opt-in and requires HTTPS, a compatible browser and an RTP path
permitted by the local firewall. Read
SIP Video
for codec, network and privacy requirements.

🧭 Initial Preview: Automation-Native PBX Routing

Home Assistant automations can now influence an inbound call at explicit
decision points instead of replacing the normal dial plan.

Warning

This is a preliminary, disabled-by-default API. Event fields, decision
timing and service semantics may change in a future release while more real
PBX installations shape the final contract. The central phonebook, explicit
extensions and configured fallback destination remain the stable default.

  • Direct inbound mode can expose a short route_requested decision before the
    configured target.
  • DTMF mode gives explicit extension digits priority and exposes automation
    routing only when no digits were entered.
  • ingress and origin distinguish provider/PBX trunk calls from local
    extension calls without relying on internal ownership fields.
  • voip_stack.select_inbound_destination selects the initial target.
  • voip_stack.forward moves an already ringing or connected HA-owned call to
    another phone, ESP, registered endpoint, group or Assist pipeline.
  • Forward failures can resume, terminate or return busy; a replaced ringing
    SIP leg receives a real CANCEL.
  • Per-phone state Sensor and call Event Entities support native HA triggers
    such as ringing for 30 seconds, without helper timers or Call-ID templates
    for the ordinary single-call case.
  • Once Assist owns the call, compatible in-dialog audio updates remain live;
    video re-offers are answered explicitly with m=video 0 because the Assist
    endpoint is audio-only, rather than interrupting TTS or stranding the dialog.
  • Revision and sequence guards remain available for concurrent or multi-stage
    routing policies.

Assist answers an unattended delivery call

Yes: an unanswered door station can now be forwarded to Assist. What Assist
says is controlled by your pipeline prompt. Good judgement is still not
included.

Copyable native-UI automation examples are in
Automation Dial Plan.

👥 Ring Groups And Conference Groups

Groups now re-enter the same canonical PBX dispatcher as every other target.
They are no longer special routing shortcuts with subtly different media or
ownership rules.

  • A ring group calls all eligible members in parallel.
  • The first answer wins; losing early dialogs receive CANCEL and a confirmed
    losing dialog receives BYE.
  • The originating endpoint is excluded when it is also a group member.
  • DND, disabled endpoints, busy state and endpoint capability are applied
    before fan-out.
  • Browser phones, ESP endpoints and registered SIP accounts can share one
    group without forcing audio-only members to negotiate video.
  • A conference group is a real HA-hosted focus: members join the same mixed
    room, optional invitees ring, and the room closes when the last participant
    leaves.

Ring group first-answer-wins and conference group behavior

☎️ A More Predictable SIP/PBX Core

Most of this release is invisible when it works, which is precisely the point.
The former monolithic runtime has been decomposed around explicit call,
transaction, dialog, route and media ownership primitives.

  • A logical call owns its generation, legs, tasks, media reservations and one
    cancellation-safe cleanup barrier.
  • SIP dialogs follow Call-ID and tags, not the lifetime or source port of one
    TCP connection. Established trunk calls survive a replacement flow.
  • Inbound answer is transactional: prepare resources, send the final response,
    commit media or roll everything back.
  • Audio and video media updates commit atomically against the current call
    generation. A late re-INVITE cannot leave the two directions on different
    revisions.
  • State transitions are monotonic. Late provisional responses or stale browser
    callbacks cannot resurrect a terminated card.
  • Hang Up remains available through calling, connecting and remote ringing.
    SIP CANCEL, 487 Request Terminated, ACK and crossed-200 BYE handling now
    share one lifecycle.
  • Remote Contact and Record-Route state are retained for correct in-dialog ACK,
    BYE, INFO, UPDATE and re-INVITE routing through proxies.
  • Cleanup is idempotent and releases dialogs, tasks, media owners, relays, RTP
    reservations and optional transcoder slots before the endpoint returns idle.

🔢 DTMF, Registered Phones And Trunks

  • Initial trunk extension selection supports negotiated RFC 4733
    telephone-event and compatible SIP INFO digits.
  • Established HA-owned bridges publish one experimental voip_stack.dtmf
    occurrence per RFC 4733 or SIP INFO key for door/gate automations.
  • Direct ESP-to-ESP media remains outside HA and therefore does not generate
    backend DTMF events.
  • Registered standard SIP accounts appear in the phonebook only while a live
    registrar Contact exists.
  • Outbound trunk calls use the configured address-of-record identity while
    keeping an independent digest-auth username.
  • Authenticated retries preserve Request-URI, Call-ID and SDP while incrementing
    CSeq and using a fresh Via branch.

🎙️ One Audio Device, Every Voice Feature

Maintained full-device profiles keep music, TTS, wake word, Voice Assistant and
VoIP on one coordinated ESPHome audio system. Playback feeds one controlled
output and one phase-coherent AEC/AFE reference; Micro Wake Word, Voice
Assistant and VoIP TX consume the same cleaned post-AEC microphone.

Shared audio output and clean post-AEC microphone pipeline

ESPHome's primary platform rules are now explicit: the core no longer
auto-loads button, number, switch, text or text-sensor platforms. Maintained
YAMLs include the wanted native entities explicitly; minimal VoIP targets no
longer need empty platform blocks.

🖥️ Card, Diagnostics And Documentation

  • Normal call actions now use one vocabulary: destination selects what to
    call and the optional device_id selects which phone acts. Development-only
    destination aliases, selector aliases and the private start WebSocket path
    were removed before stable release instead of becoming parallel APIs.
  • Browser-phone Devices expose native Extension, Ring groups, Conference
    groups, Ring for conference calls and DND controls. Device entities, card
    settings and actions all update the same persisted phone configuration.
  • Card commands use normal Home Assistant services and authoritative response
    snapshots; the frontend does not invent call IDs or a parallel state machine.
  • Phone identity, presentation and browser audio/video negotiation now live in
    focused models instead of one giant card file.
  • Repeated HA state changes no longer rebuild unchanged phonebook and
    destination DOM during call setup.
  • Browser media handoff is scoped by phone, call and direction, so reloading one
    dashboard cannot block or steal another phone's microphone/camera.
  • Navigating between dashboards or closing a completed call releases browser
    media claims without leaving another phone disabled or showing a false
    "media active in another tab" error.
  • Config-entry and per-device diagnostics can be downloaded through Home
    Assistant with credentials, addresses and other private values redacted.
  • The Home Assistant card picker suggests the VoIP Stack card directly from a
    browser-phone call-state entity and binds the resulting card to the correct
    phone Device.
  • Logbook records one readable summary per PBX session instead of exposing a
    stream of internal leg transitions.
  • Runtime snapshots expose sessions, legs, routes, SIP clients, relays, audio
    and video WebSockets, owners, cleanup tasks and allocated RTP ports.
  • The README now uses a consistent illustrated visual language for system
    topology, signaling transport, phonebook routing and canonical call paths;
    the service, trunk, automation, video, testing and troubleshooting guides
    describe the same behavior.

⚠️ Compatibility And Deliberate Limits

The 2026.7.0 SIP migration remains the breaking baseline. For 2026.8.0:

  • custom ESP YAMLs that relied on auto_entities must declare the desired
    native platform: voip_stack entities or include the maintained package;
  • experimental automation routing is opt-in and may evolve;
  • SIP video is supported in web browsers, the Home Assistant Companion app,
    standard SIP video door stations, SIP video phones and softphones, including
    compatible routes through a PBX or trunk. ESP and Assist endpoints remain
    audio-only, conference video mixing is not implemented, and SIP-to-SIP video
    bridges require an exact compatible codec/profile;
  • local SIP/RTP is plaintext. Use a trusted LAN/VLAN/VPN and do not expose ESP
    listeners directly to the Internet;
  • there is no SRTP, SIP/TLS on ESP, ICE/STUN/TURN, recording or general-purpose
    video transcoding PBX.

See the
Breaking Changes
and the individual feature guides before updating a custom deployment.

🧪 Qualification

The release passes 1102 tests plus 99 subtests, together with Ruff and
JavaScript parsing. Real calls cover browser phones, ESP endpoints, registered
SIP accounts, groups, conferences, trunks, audio, bidirectional video and
post-call cleanup.

📦 Installing Or Upgrading

  1. Back up the existing integration and configuration.
  2. Install or update VoIP Stack through HACS. Manual installations can download
    voip_stack.zip from the v2026.8.0 GitHub release.
  3. Extract it into config/custom_components/voip_stack/, replacing the
    previous component directory only when installing manually.
  4. Restart Home Assistant.
  5. Hard-refresh every dashboard and fully restart the Android Companion app so
    the card version matches the backend.
  6. Reopen VoIP Stack options to enable SIP video or automation
    routing; both remain off by default.

Please report the exact call path, SIP transport, offer/answer SDP, endpoint
states and final cleanup snapshot when something misbehaves. “It broke” is
emotionally valid but slightly less useful to a SIP transaction.