No Joy With My First AGI Python Script

Home » Asterisk Users » No Joy With My First AGI Python Script
Asterisk Users 3 Comments

It’s very simple but it doesn’t work. Here’s the entire script.

#! /usr/bin/python

import sys

env = {}

def comm(cmd):
sys.stdout.write(cmd.strip() + ‘\n’)
sys.stdout.flush()
return sys.stdin.readline().strip()

while 1:
line = sys.stdin.readline().strip()

if line == ”: break

key,data = line.split(‘:’)
if key[:4] == ‘agi_’:
key = key.strip()[4:]
data = data.strip()
if key: env[key] = data

#comm(“Verbose(0,pyast: %s)” % sys.argv)
comm(‘SAY NUMBER 123 “”‘)

sys.stderr.write(“AGI Environment Dump:\n”);
for key in env.keys():
sys.stderr.write(” — %s = %s\n” % (key, env[key]))

sys.stderr.flush()

The extension is;

exten => *22,1,Verbose(0,${CHANNEL(peername)} calling 22 TEST)
same => n,AGI(/home/darcy/pyast,Hello world)
same => n,Hangup

What happens when I dial it is that the dialplan Verbose statement runs but nothing else is logged and the number is not said. When I turn on AGI debugging I get this:

… (a bunch of agi_ variables)
AGI Tx >> agi_arg_1: Hello world
AGI Tx >>
AGI Rx << SAY NUMBER 123 "" AGI Tx >> 200 result=0

There is a delay between the last Rx and Tx suggesting that it thinks that the numbers are being played but I don’t hear them. Also, the output to stderr does not appear in the logs.

Here is my environment:
– Asterisk 11.20.0
– NetBSD 7.0
– Python 3.4

Thanks in advance for any help or suggestions.

3 thoughts on - No Joy With My First AGI Python Script

  • In no particular order (except #0):

    0) Use an existing Python library. Nobody gets it right the first time. I
    wrote my C library 100 years ago, so I don’t remember all the specifics of the AGI protocol.

    1) Is the space after the ‘she-bang’ significant?

    2) Your ‘sys.stderr.write’ may be violating the AGI protocol. Writing to stdout definitely does. I don’t remember what writing to stderr does.

    3) If you dump your AGI environment before ‘say number’ do you get a different outcome?

    4) Any chance the ‘digits’ directory is missing or that your channel language is set weird? Does the saynumber() dialplan application work?

    5) Can you play any audio to the channel? Does playback(demo-congrats)
    work?

    (That was my last straw to grasp — need another cup of tea.)

  • Are you talking about pyst? I guess but I am a firm believer in understanding the technology before I use it. I learned programming by depositing bits on an Altair S-100 bus. Even though I will probably never get close to that level again I think it made a good foundation.

    No. It does the same whether it is there or not.

    I got that from some example code I found. I removed it but nothing changed.

    Nope. That was actually where I started. I moved it to the end just in case it was causing a problem.

    OK, it doesn’t. Shouldn’t I see an error in the logs though? It pauses just like the AGI script but nothing is said and no errors are printed.

    Yes, that works. Also, “playback(digits/4&digits/5&digits/6)” works which tells me that the digits directory is where it is supposed to be. Another data point, “SayPhonetic(hello)” also does not work but there is silence as long as would expect the audio to last, same as SayNumber.

    Interestingly this led me down a different path. I added this to my script – comm(‘SET VARIABLE PYAST “hello world”‘) and displayed the varible in my dialplan and that worked. Saying a number was just a way to test the AGI. I didn’t really need audio for my current project. Now that I know that I can set variables I can continue.

    However, I sure would like to know why SayWhatever isn’t working. I
    will start a new thread for that issue.

    Thanks for the pointers.

  • Turns out to be related to AGI after all. I created a new test with Playback, SayNumber and SayPhonetic and everything worked fine so the issue was something else.

    Aha! Everything works fine. I just forgot to answer the phone.

    I think I need a session with the Clue-By-Four.