Hi all,
I’m debugging an issue with TECH7Fox SIP Core + sip-call-card where calls connect fine on iPad, but I cannot hear any audio on iPad (incoming audio is silent). The other direction works just fine. It works perfectly on Android and desktop browsers.
This is used for a door intercom (Mobotix T26) via Asterisk (HA OS add-ons), but the problem is NOT Mobotix-specific: I also don’t get audio when calling the iPad from a Linux SIP client.
Environment
- Home Assistant Core: 2026.1
- SIP Core: 5.0.2 (via HACS / Tech7Fox)
- Asterisk add-on: Tech7Fox Asterisk add-on (HA OS)
- iPad: iPad 10th gen, iPadOS 17.5.1
- Tested clients on iPad:
- Safari
- Chrome (iOS)
- Home Assistant Companion App
→ None have audio
- Android phone works (audio in both directions)
Symptoms
- iPad rings and answers the call (WebRTC session establishes)
- Microphone direction (iPad → door / Asterisk) works
- But speaker direction (door / Asterisk → iPad) is silent
- Asterisk shows RTP is flowing both directions
- MixMonitor recording captures audio correctly → audio exists at Asterisk side
Asterisk codec info
From CLI core show channel ... I see negotiated codecs like:
NativeFormats: (ulaw)
WriteFormat: ulaw
ReadFormat: ulaw
WriteTranscode: No
ReadTranscode: No
NativeFormats: (opus)
WriteFormat: slin48
ReadFormat: slin48
WriteTranscode: Yes (slin@48000)->(opus@48000)
ReadTranscode: Yes (opus@48000)->(slin@48000)
So codec negotiation appears OK.
Asterisk RTP debug shows RTP flowing
Typical RTP debug lines during call:
Got RTP packet from 192.168.0.180:58518 (type 00, seq ..., len 000170)
Sent RTP packet to 192.168.0.60:7078 (type 00, seq ..., len 000160)
... (and vice versa) ...
Sent RTP packet to 192.168.0.180:58518 (via ICE) (type 00, seq ..., len 000170)
Got RTP packet from 192.168.0.180:58518 (type 00, seq ..., len 000170)
also reported:
Strict RTP learning after ICE completion
Strict RTP learning complete - Locking on source address ...
So ICE + RTP look active.
IPv6 note
iPad always offers IPv6 ICE candidates (cannot disable IPv6 on iPad/router).
I see IPv4 and IPv6 candidates in SDP; Asterisk locks on source addresses successfully.
Current Asterisk PJSIP endpoint config (Mobotix)
pjsip.conf excerpt:
[8001]
type=endpoint
context=from-door
disallow=all
allow=ulaw
allow=alaw
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
aors=8001
auth=8001
[8001]
type=aor
max_contacts=1
remove_existing=yes
[8001]
type=auth
auth_type=userpass
username=8001
password=xxx
rtp.conf
[general]
rtpstart=10000
rtpend=20000
icesupport=yes
stunaddr=stun.l.google.com:19302
rtp_ipv6=no
Dialplan
I tried many dialplan variants. Basic current test:
[from-door]
exten => 8001,1,NoOp(Doorbell -> iPad)
same => n,Dial(PJSIP/104,30)
same => n,Hangup()
I also tried early Answer/Playback warm-up ideas, but iPad still silent.
sip-call-card YAML
type: custom:sip-call-card
extensions:
"100":
name: morly
"101":
name: marina
"102":
name: tablet
override_icon: mdi:doorbell
video: true
ice_gathering_timeout: 5000
buttons: []
IMPORTANT: Safari console errors (even before calls)
On iPad Safari console I consistently get:
Unhandled Promise Rejection: TypeError: undefined is not an object
(evaluating 'this.config?.buttons.map')
This repeats very often in console.
DOM debugging observation
Using Safari dev tools I checked the component:
document.querySelectorAll("sip-call-card").lengthreturns 0 (but that may be because HA uses shadow DOM)- I can find
sip-call-dialogelement, and it has config (including buttons array)
Example:
const d = document.querySelector("sip-call-dialog");
d?.config?.buttons
MixMonitor proof that audio exists
I recorded the call server-side:
Dialplan used:
[from-door]
exten => 8001,1,NoOp(Doorbell -> iPad (record test))
same => n,Set(__RECFILE=/share/door-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}.wav)
same => n,MixMonitor(${RECFILE},a)
same => n,Dial(PJSIP/104,30)
same => n,Hangup()
Result: WAV contains proper audio (door side), but iPad still silent.
What I’m looking for / questions
- Is this a known iPadOS 17 WebRTC / autoplay / audio-output issue with sip-call-card / sip-core?
- Is the
buttons.mapconsole error a known bug? (buttons config seems required to avoid runtime errors?) - Does the card create/attach its
<audio>element in iOS Safari differently (maybe blocked until user interaction)? - Any recommended configuration to force audio output on iPad (speaker route)?
Thanks!
Attachments I can provide
- SIP / RTP logs from Asterisk (
pjsip set logger on,rtp set debug on) - iPad Safari console screenshots
- full YAML and SIP Core config