Asterix for a prop phone system / escape room

I’m building an interactive prop telephone for a phone booth in a British pub. Guests will dial fictional numbers to hear recordings, and staff will trigger incoming calls that play a recording when someone answers. Maybe we can add in a mystery that gets solved over multiple calls over time. One way to think of this project is as an escape room.

I have done this in the past by installing an arduino in an old payphone, but this time I thought of connecting the existing analog telephone to a Grandstream HT801 v2 and running Asterisk on a Raspberry Pi. Maybe build a small web interface to:

  • Upload and manage recordings.

  • Map fictional numbers to recordings.

  • Trigger calls and stop them.

  • Show whether the phone is idle, ringing, or answered.

Does this make sense or is there an easier way? A few questions:

  1. What OS and Asterisk version would you recommend for a Raspberry Pi 4 with 2GB or 4GB RAM?

  2. For a simple web page that triggers calls, selects recordings, and shows phone status, what is the easiest way to control Asterisk?

  3. Are there existing open-source projects providing a similar interface?

  4. Any pitfalls with the HT801 v2 for ringing, audio playback, or hangup detection?

All suggestions are very welcome. The idea at the end is that the staff can maintain and configure the numbers and recordings over time. I’m doing this for fun, not as a commercial project.

You can use POTSBox if you like —

A few people have set up escape rooms that have different phones and clues involved with characters from the Maltise Falcon and that turns out to be a lot of fun!

[

Plain Old Telephone, Reimagined
pots-box.org

](https://pots-box.org/)

On Sep 28, 2026, at 2:53 PM, PhilippeThunderbolt notifications@asterisk.discoursemail.com wrote:

PhilippeThunderbolt
September 28

I’m building an interactive prop telephone for a phone booth in a British pub. Guests will dial fictional numbers to hear recordings, and staff will trigger incoming calls that play a recording when someone answers. Maybe we can add in a mystery that gets solved over multiple calls over time. One way to think of this project is as an escape room.

I have done this in the past by installing an arduino in an old payphone, but this time I thought of connecting the existing analog telephone to a Grandstream HT801 v2 and running Asterisk on a Raspberry Pi. Maybe build a small web interface to:

  • Upload and manage recordings.

  • Map fictional numbers to recordings.

  • Trigger calls and stop them.

  • Show whether the phone is idle, ringing, or answered.

Does this make sense or is there an easier way? A few questions:

  1. What OS and Asterisk version would you recommend for a Raspberry Pi 4 with 2GB or 4GB RAM?

  2. For a simple web page that triggers calls, selects recordings, and shows phone status, what is the easiest way to control Asterisk?

  3. Are there existing open-source projects providing a similar interface?

  4. Any pitfalls with the HT801 v2 for ringing, audio playback, or hangup detection?

All suggestions are very welcome. The idea at the end is that the staff can maintain and configure the numbers and recordings over time. I’m doing this for fun, not as a commercial project.


Visit Topic or reply to this email to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, click here.

Wow, that looks awesome. I appreciate the heads-up as none of my searching found this - I will give it a go and see if this fits the bill. Open to any other suggestions.

Thanks, I made it, you know…for the kids!

If you are new to the idea you can get an auto-configuring box or just put a URL into a grandstream you might already have and the Operator can set it up for you - what I love about this is that the Operator picks up the phone when you pick up, so you can use an early candlestick without a dial and she can transfer calls!

[

From the potsbox community on Reddit: Release 4.1 And Fancy Auto-Configure Operator is Here!
reddit.com

](https://www.reddit.com/r/potsbox/comments/1wlgnsw/release_41_and_fancy_autoconfigure_operator_is/)

People have done a lot of creative and fun things. You can share them in the “yellow pages” —

Enjoy!

On Sep 28, 2026, at 3:28 PM, PhilippeThunderbolt notifications@asterisk.discoursemail.com wrote:

PhilippeThunderbolt
September 28

Wow, that looks awesome. I appreciate the heads-up as none of my searching found this - I will give it a go and see if this fits the bill. Open to any other suggestions.


Visit Topic or reply to this email to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, click here.

Seems relevant – yet not posted it before on the forums :thinking: – definitely Allison’s voice on several of these “VOCS Telephone System” destinations at the Meow Wolf exhibit in Denver :grinning_cat_with_smiling_eyes:

POTSBox looks like a lovely fit if you want it to just work. Since nobody has answered the Asterisk questions directly, in case you’d rather keep it on your own Pi:

It makes sense. HT801 plus Asterisk is the right shape for this — the HT801 is a SIP ATA, so there is no DAHDI, no card and no analogue hardware anywhere in the Pi. One phone, one call at a time: a Pi 4 is enormously oversized, and a Pi Zero 2 W would do it.

OS and version. 64-bit Raspberry Pi OS and Asterisk from apt. For a prop that has to survive a pub rather than be interesting, the distro package you can apt upgrade and forget beats a self-built tree; you will not touch a single feature added since Asterisk 16. If you want a current LTS instead, 20 or 22 both build fine on a Pi 4 — just put /var/spool and your recordings somewhere you don’t mind rewriting, because SD cards do die, and take an image of the card once it works.

Fictional numbers → recordings. One context, one exten per fake number, Answer() then Playback(custom/whatever). Put the files in /var/lib/asterisk/sounds/custom/ and record them as 8 kHz mono — .wav (16-bit PCM) or .alaw/.ulaw to match the line and skip transcoding. If a number should take input, Background() plus WaitExten() instead of Playback().

Triggering an incoming call from a web page. Three options, easiest last:

  • a call file dropped in /var/spool/asterisk/outgoing/ — zero API, but you need to write it elsewhere and mv it in, and you get no feedback;
  • AMI Originate;
  • ARI: POST /ari/channels with endpoint=PJSIP/ata, app=prop, and your app answers and plays. This is the one I’d pick — one HTTP call out, and the state you want comes back on the same connection.

Idle / ringing / answered. With ARI you get ChannelStateChange and StasisStart/StasisEnd on the WebSocket, which is exactly your three states with no polling. If you go the AMI route, add hint => PJSIP/ata for the extension and watch DeviceStateChange, or poll GET /ari/endpoints/PJSIP/ata and GET /ari/channels every second — for one phone that is perfectly respectable.

The multi-call mystery. Keep the story’s progress in AstDB rather than in your web app, so the dialplan can branch on it without asking anything: Set(DB(prop/stage)=2) and ${DB(prop/stage)}. It survives restarts, and database show prop on the CLI lets you see and reset the state from behind the bar. Note a shared phone means the stage is per-booth, not per-guest — if guests should each have their own thread, give each a code to key the DB path on.

Two practical things: give the HT801 a static lease so your web app always finds it, and set the dialplan’s s extension to something harmless, because a prop phone in a pub will be knocked off the hook and left there.

You can watch for events with both AMI and ARI, no need to do periodic polling.

However, this is awkward to do with a PHP-style single-request-single-response web page; you need an ongoing back-end task to keep an eye on things, so all the web page does is send requests to the back-end for current status, initiate calls, hangup calls etc.

AMI events have evolved somewhat over the years … my code for handling them seems to have become a bit messy. :confused: