For background: Home Assistant OS, Core 2025.9.2, Supervisor 2025.09.0, Operating System 16.2, Frontend 20250903.5. ha-sip is currently at version 5.1; Piper TTS is at version 1.6.4 and the Wyoming Protocol is installed, current, and working. This isn’t a new problem, but I’ve finally reached the point with it where help is needed.
Abstract: inbound calls are answered by an automation which should play a single message generated by TTS, then hang up. What actually happens depends on which command: options are specified in the action. If command: play_message is used, the call is answered and the message plays on infinite repeat until the calling extension is manually hung up. With command: answer, the call is answered, but no message plays and the call remains active until the calling extension hangs up.
For comparison’s sake, there is also an automation for outbound calls using both command: dial and menu:, and it works as intended - call an extension, play the message once, hang up. This is expected behaviour, but for some reason inbound calls don’t seem to be able to be made to behave in the same way.
Here’s the incoming call action in question that plays the message in an infinite loop; note that post_action: hangup is present but does not appear to be respected.
alias: Inbound Call (Test)
description: ""
triggers:
- trigger: webhook
allowed_methods:
- POST
- PUT
local_only: true
webhook_id: redacted
conditions: []
actions:
- action: hassio.addon_stdin
metadata: {}
data:
addon: c7744bff_ha-sip
input:
command: play_message
number: "{{ trigger.json.parsed_caller }}"
message: >-
This is a test of the inbound call answering system. If this had been
an actual inbound call, chances are good that this message wouldn't
repeat ad infinitum. This is only a test. Goodbye.
post_action: hangup
wait_for_audio_to_finish: true
cache_audio: false
mode: single
And here’s the command: answer action with menu: present that never plays the message and just gives dead air:
alias: Inbound Call (Test)
description: ""
triggers:
- trigger: webhook
allowed_methods:
- POST
- PUT
local_only: true
webhook_id: redacted
conditions: []
action: hassio.addon_stdin
metadata: {}
data:
addon: c7744bff_ha-sip
input:
command: answer
number: "{{ trigger.json.parsed_caller }}"
menu:
message: >-
This is a test of the inbound call answering system. If this had been
an actual inbound call, chances are good that this message wouldn't
repeat ad infinitum. This is only a test. Goodbye.
post_action: hangup
wait_for_audio_to_finish: true
cache_audio: false
mode: single
BTW: wait_for_audio_to_finish: true and cache_audio: false are part of the requirements for the action once it’s sorted out, so need to remain in place during troubleshooting. They have been removed experimentally in both cases, but with no effect.
Does anyone have any ideas as to what may be going on? It seems to my mind that either action should work, but clearly they aren’t so something isn’t right.