Cisco Support Community
cancel
Showing results for 
Search instead for 
Did you mean: 
Announcements

Welcome to Cisco Support Community. We would love to have your feedback.

For an introduction to the new site, click here. If you'd prefer to explore, try our test area to get started. And see here for current known issues.

New Member

UCCE Agent Whisper with CVP

I am attempting to build out the Agent Whisper Feature in our Development lab, but I keep getting "IPIVR Whisper is disabled as the routing client CVP is not System PG" in Router Log Viewer.

I followed the configuration guide for Agent Whisper, but I suspect I missed something in my current configuration.

http://www.cisco.com/en/US/docs/voice_ip_comm/cust_contact/contact_center/ipcc_enterprise/ipccenterprise8_5_1/configuration/guide/agwa85fg.pdf

My first guess was to look at the script, but I based my script on the script in the documentation.  Does anyone have any ideas on where I should look for this issue?  I will be glad to upload logs or screen shots if that helps.

Router Log viewer.jpg

script.jpg

Thanks!

Mike Cairns

Everyone's tags (2)
11 REPLIES
New Member

UCCE Agent Whisper with CVP

Yes, I am replying to my own post.   

I found that the problem was actually with the ECC Variable that I used.  Apparently there are two different variables used with Agent Whisper.  In my case I was using user.whisper (designed for use with System PG in Parent Child) when I should have been using variable Call.WhisperAnnouncement instead.  I was following the wrong section of the install documentation.  Hopefully this will help someone that makes the same silly mistake as me.

Mike Cairns

Green

UCCE Agent Whisper with CVP

I found that the problem was actually with the ECC Variable that I used.  Apparently there are two different variables used with Agent Whisper.  In my case I was using user.whisper (designed for use with System PG in Parent Child) when I should have been using variable Call.WhisperAnnouncement instead.


Good job. Note that technically, Call.WhisperAnnouncement is not an ECC variable, but is a Call variable.

It just so happens I am fiddling with Whisper today.

Mistake 1 was not setting Router Requery on the Queue to Skill Group node, but the Router Log Viewer showed that error so quickly fixed. I think the documentation is a bit poor in that it does not mention this important requirement until page 10.8, after a lot of boring and repetitive information that is standard CVP stuff (media server, locale, app media lib, CCITT uLaw etc).

Why isn't the Router Requery REQUIREMENT earlier in the chapter, like on page 10-3? For example:

"The most important piece in deploying Whisper Announcement is to include the requisite variables and settings in your Unified CCE routing scripts, including ensuring that Router Requery is set on your Queue to Skill Group nodes." (My bold)

Otherwise, the config for Whisper is the easiest thing I've ever done.

In my case, the ringback just plays for the caller, and the agent doesn't hear the whisper, the CTIOS lights up Reserved with a ringing call, but I can't really get the call. The IP phone shows the call is connected, and if I hit "End" it terminates the incoming call.

I can see the CVP trace saying the right things:

[OUTBOUND]: INVITE TO <9191919100>

[WHISPER]: Invitation proceeding 100

[WHISPER]: Invitation accepted - ack'ing

but I don't actually see an error here in the trace.

The fact that it does not work for me is probably due to my CUCM - which is 8.0. The specs say I need 8.5(1) SU2 or later. Bummer.

Have to find the DVD tomorrow.

Regards,

Geoff

Green

UCCE Agent Whisper with CVP

OK, replying to my own post.

I have upgraded the CUCM to 8.5(1) SU2. This caused an issue with CVP - I could run the VXML leg ok, but when it was torn down and the call sent to an agent, there was no voice path and the call dropped after 7 seconds or so. That was pretty interesting - no other change but an upgrade of CUCM!

If I changed the dial peer to go directly to the Subscriber (built a SIP trunk to the gwy) and to a second line on a phone matching the DNIS - voice path OK.

I checked the comaptibility guide and NO 12.x IOS is supported with CVP 8.5, so I upgraded the gateway to 15.1(4)M4 and the problem was resolved. This release has the gotcha on no ip address trusted authenticate, but that's another story.

So now  back to Whisper - it still does not work. Simple script - router requery enabled.

If I send the bypass the SET node for Call.WhisperAnnouncement and go to the Queue to SG, all is fine. If I put the Call.WhisperAnnouncement back in, I just hear rining on both sides - never hear the Whisper and I can't talk to the customer. It doesn't cut through.

Does the phone need a BIB ?

I know from the Agent Greeting/Whisper Guide that AG needs the BIB, but it does not say Whisper does.

Any clues on how to debug this?

Regards,

Geoff

New Member

Re: UCCE Agent Whisper with CVP

Did you upgrade your tcl files on the gateway

Apply any ES to Cvp ? we are on 8.5 es6

Jtapi updated on pg? To match ccm

Sent from Cisco Technical Support iPhone App

Green

UCCE Agent Whisper with CVP

Excellent questions.

I did not upgrade the TCL or VXML files on the gateway. In fact, the test gateway in my lab is still running TCL and VXML files from 7.0. When I compared the 8.0 files to the 7.0 files a couple of years back, there was only 1 line of difference and I wanted to be able to use the gateway in an 7.0 and 8.0 system, so I kept the 7.0 files.

I will compare files today and see if there is something there in those 8.5 files that is required to make Whisper work. Thank you for reminding me.

No ES applied - stock CVP 8,5.

JTAPI upgraded to match CUCM 8.5.1 SU2 - Absolutely.

Regards,

Geoff

New Member

UCCE Agent Whisper with CVP

Ok , I'm pretty sure that the Whisper feature is using the Ringback service / TCL file to play the Whisper.

We updated to ES6 for some Agent Greeting / Whisper transfer bugs, and a CVP reporting server bug.

Green

UCCE Agent Whisper with CVP

That makes perfect sense. I know that the it is sending 9191919100 back to the gateway and I changed the dial peer for 91919191 to catch this extended number. I should have thought more about this.

Your advice is much appreciated. I'll try this as soon as I get to the office and update the thread.

I'd like to try Agent Greeting too - but although I have at least 30 IP phones in the lab, they are all 7940 or 7960. I don't have a single phone with the BIB, which is very disappointing. May have to get one on eBay. ;-) We created our own Agent Greeting solution a number of years ago, originally client side, then changed to server-side Agent Greeting, but Cisco hobbled that a bit around 7.5.10 when they stopped single-step conference from working and we had to change to a two-step conf. I'm interested in comparing the two solutions now.

Regards,

Geoff

New Member

UCCE Agent Whisper with CVP

Testing here too.  I found that Agent Greeting would use the Conference resources in CM if the BIB was off on a phone, not supported but an interesting "feature".

I also have an issue where Agent Greetings do not play to IP Communicator Agents with BIB "ON".  Only if I set it to "OFF" (and a CFB is used)

We are also trying to see if the Agent Greetings will get recorded by a BIB style recording platform (Verint, CallCopy, etc), but I don't have that in my lab.

New Member

Re: UCCE Agent Whisper with CVP

I agree with braclarke.  It is most likely an issue with your ringtone.tcl.  If you look at the code you can see that there are several references to the Whisper feature.

# Script last modified by: chleblan
# Script Version: CVP_8_5_1_0_0_0_312
# Script Name: ringtone.tcl
# Script Lock Date: 4/24/2008
#
#
# Copyright (c) 2010 by Cisco Systems, Inc.
# All rights reserved.
#------------------------------------------------------------------
#
# DESCRIPTION-------------:
# ringtone.tcl - application script used to play ring tone back to the caller on cvp sip calls.
#
# CVP DISCLAIMER
# This tcl script is a component of CVP.
# Modifications to this script not made as part of an CVP release
# nullify Cisco's support responsibility for this script.   The party who makes the
# change assumes responsibility for ongoing maintenance of this script.
#
# History:
# 4/24/08   Added the ability to use RTSP and HTTP as the URL type for the custom ringtone
#           in function, act_Media { }.
#

#service ringtone flash:ringtone.tcl

#dial-peer voice 9191 voip
# service ringtone
# voice-class codec 1
# incoming called-number 9191T
# dtmf-relay rtp-nte
# no vad

# CODE REVIEW FEEDBACK 9/10/2010
#1.Playtone requires DSP^Rs.  We sell bundles that don^Rt have DSP^Rs for VXML gateways.  CUBE may also not have DSP^Rs.  Can^Rt we force a media name so that we don^Rt default to playtone?
#2.^QParam register^R used to have a memory leak.  I had to take them all out of survivability.tcl at one time.  I^Rm not sure if that has since been fixed.
#3.I have seen weird things if timers are still active when the caller hangs up.   You should always invoke Cleanup for the call close and add a couple of statements to stop the timers.


proc init { } {

    global zombie_timeout
    set zombie_timeout 600
    if {[infotag get cfg_avpair_exists zombie-timeout]} {
        set zombie_timeout [infotag get cfg_avpair zombie-timeout]
    }

    global whisper_timeout
    set whisper_timeout 15
    if {[infotag get cfg_avpair_exists whisper-timeout]} {
        set whisper_timeout [infotag get cfg_avpair whisper-timeout]
    }

    global use_facility_event
    set use_facility_event 1
    if {[infotag get cfg_avpair_exists use_facility_event]} {
        set use_facility_event [infotag get cfg_avpair use_facility_event]
    }
}

proc act_Setup { } {

    global zombie_timeout
    global whisper_timeout

    global callident
    global whisper
    global medianame
    global use_facility_event
    global agent_dummy_port

    set medianame ""
    set whisper 0
    set agent_dummy_port 0

    set uahdr [infotag get leg_proto_headers "User-Agent"]
    puts "\n *** USER AGENT header = $uahdr *** \n"

    set incoming [infotag get evt_legs]
    set callident [infotag get leg_guid $incoming]

    # Extract ringtone media file name to play
    # SIP calls with App-Info header of format "App-Info: <10.86.129.211:8000:8443>;ringtone=ringback.wav"

    set appinfohdr [infotag get leg_proto_headers "App-Info"]
    puts "\n\n *** App-Info=$appinfohdr *** \n\n"

    if {[string length $appinfohdr] > 0} {

        if {[string first "whisper" $appinfohdr] != -1} {
            set whisper 1
        }

        if {[string first "4000" $appinfohdr] != -1} {
            set agent_dummy_port 4000
        }

        set list [split $appinfohdr ";"]

        if { [llength $list] > 0 } {
           set temp [lindex $list 1]
           set list2 [split $temp "="]
           set medianame [lindex $list2 1]
        }
    }

    puts "\n\n *** medianame = $medianame *** \n\n"

    leg connect leg_incoming

    if {$whisper != 1} {
        fsm setstate RINGTONE_TIMER
        timer start named_timer $zombie_timeout RingtoneServiceTimer
        act_Media
    } else {
        fsm setstate WHISPER_TIMER
        timer start named_timer $whisper_timeout RingtoneServiceTimer
        if {$use_facility_event == 0 || $agent_dummy_port == 0} {
            act_Media
        }
    }

}

# do this so that the media loops, ie ringing goes on and on
proc act_Media { } {

    global medianame


    if {[string length $medianame] > 0} {

        if {[string first "RTSP://" $medianame] != -1} {
            media play leg_incoming $medianame
        } elseif {[string first "rtsp://" $medianame] != -1} {
            media play leg_incoming $medianame
        } elseif {[string first "HTTP://" $medianame] != -1} {
            media play leg_incoming $medianame
        } elseif {[string first "http://" $medianame] != -1} {
            media play leg_incoming $medianame
        } elseif {[string first "appl:" $medianame] != -1} {
            #do handoff here
            set application [string range $medianame 12 [string last > $medianame]]
            handoff appl leg_incoming $application
        } else {
            media play leg_incoming flash:$medianame
        }

    } else {
        set medianame "ringback.wav"
        media play leg_incoming flash:$medianame
    }
}

proc act_Facility {} {
    global use_facility_event
    global agent_dummy_port
    if {$use_facility_event == 1 && $agent_dummy_port == 4000} {
        act_Media
    }
}

proc actMediaDone { } {
    global whisper
    global medianame
    global callident

    set media_err ""

    set status [infotag get evt_status]

    switch $status {
        "ms_000" {
        }
        default { #all other errors go here
            set msg "******* ERROR: playing media in ringtone tcl CALLID=$callident STATUS=$status WHISPERFLAG=$whisper MEDIANAME=$medianame *******"
            LogMsg "ERROR" $msg

            #set medianame to empty so that if custom ringtone cannot be found then just play ringback tone
            set medianame ""

            if {$whisper == 1} {
                set media_err "whisper fail"
            }
        }
    }

    # for whisper announcement make sure we end after the prompt is done
    if {$whisper == 1} {
        if {$media_err != ""} {
            leg disconnect leg_incoming -c 38
        }

        act_Cleanup
    } else {
        act_Media
    }
}


proc zombieTimerExpired { } {
    set msg "******* Ringtone Zombie timer expired - call cleared *******"
    LogMsg "INFO" $msg
    act_Cleanup
}

proc whisperCallMaxLengthExceeded {} {
    global medianame
    global callident

    set msg "******* ERROR: Clearing call. Whisper Prompt Max Length Exceeded in ringtone tcl. MEDIANAME=$medianame *******"
    LogMsg "ERROR" $msg
    act_Cleanup
}


proc LogMsg {errLevel msg} {
   global callident

   set x " CallID = "
   set y "TCL CVP ringtone.tcl: "
   append x $callident
   append msg $x
   append y $msg
   puts -nonewline "\n$y"
   if {$errLevel == "ERR"} {
      log $y -s ERR
   }
   if {$errLevel == "WARN"} {
      log $y -s WARN
   }
   if {$errLevel == "INFO"} {
      log $y -s INFO
   }
}


proc act_Cleanup { } {
    timer stop named_timer RingtoneServiceTimer
    call close
}


init
requiredversion 2.1

#----------------------------------
#   State Machine
#----------------------------------
set fsm(any_state,ev_disconnected)         "act_Cleanup        same_state"
set fsm(CALL_INIT,ev_setup_indication)     "act_Setup          same_state"
set fsm(any_state,ev_facility)             "act_Facility       same_state"
set fsm(any_state,ev_media_done)           "actMediaDone       same_state"
set fsm(RINGTONE_TIMER,ev_named_timer)     "zombieTimerExpired same_state"
set fsm(WHISPER_TIMER,ev_named_timer)      "whisperCallMaxLengthExceeded same_state"


fsm define fsm CALL_INIT

Green

UCCE Agent Whisper with CVP

Mike Cairns wrote:

I agree with braclarke.  It is most likely an issue with your ringtone.tcl.  If you look at the code you can see that there are several references to the Whisper feature.

Oh I know it. As soon as I got to work I diffed the CVP8 TCL files and the CVP8.5 TCL files to check out what had changed in survivability, handoff, bootstrap and of course, ringtone - ringtine stood out!

I have loaded the gateway files and rebooted the router and am just setting up the agent again.

(Sorry for the novice error)

Regards,

Geoff

Green

UCCE Agent Whisper with CVP

Agent has been set up and now Whisper is working. The CVP 8.5 ringtone.tcl file made all the difference.

Initially I had an error in my configuration, but this simply connected the agent and caller immediately and no Whisper was played. But the CVP error log said I had an error in the routing. And so it was.

I had forgotten to add 9191919100 to my "send to originator" pattern list. Easy fix.

Thanks so much for pointing me in the right direction. I know a lot about Whisper now.

Regards,

Geoff

3371
Views
16
Helpful
11
Replies