UCCE
Engineering Specials
UCCE Components
Certs
Here is a cool new Cert Tool for CCE
Here are the commands for the Reporting Server.
- Delete the wsm and Callserver Certs
- Create the wsm and callserver certs
- Export the wsm and callserver certs
%CVP_HOME%\jre\bin\keytool.exe -storetype JCEKS -keystore %CVP_HOME%\conf\security\.keystore -delete -alias wsm_certificate %CVP_HOME%\jre\bin\keytool.exe -storetype JCEKS -keystore %CVP_HOME%\conf\security\.keystore -delete -alias callserver_certificate %CVP_HOME%\jre\bin\keytool.exe -storetype JCEKS -keystore %CVP_HOME%\conf\security\.keystore -genkeypair -alias wsm_certificate -keysize 2048 -keyalg RSA -validity 3650 %CVP_HOME%\jre\bin\keytool.exe -storetype JCEKS -keystore %CVP_HOME%\conf\security\.keystore -genkeypair -alias callserver_certificate -keysize 2048 -keyalg RSA -validity 3650 %CVP_HOME%\jre\bin\keytool.exe -storetype JCEKS -keystore %CVP_HOME%\conf\security\.keystore -export -alias wsm_certificate -file %CVP_HOME%\conf\security\wsm.crt %CVP_HOME%\jre\bin\keytool.exe -storetype JCEKS -keystore %CVP_HOME%\conf\security\.keystore -export -alias callserver_certificate -file %CVP_HOME%\conf\security\callserver.crt
UCCE Links
Configuration
More UCCE Links
UCCE API info
For a Health / Content Switch health probe - use the following API call - as it does not require authentication
https://server/unifiedconfig/config/deployment
Example for Inventory
https://<server>/unifiedconfig/config/activedirectorydomain https://<server>/unifiedconfig/config/deployment https://<server>/unifiedconfig/config/deploymenttypeinfo https://<server>/unifiedconfig/config/machineinventory https://<server>/unifiedconfig/config/version https://<server>/unifiedconfig/config/routingtype https://<server>/unifiedconfig/config/registry https://<server>/unifiedconfig/config/status
Training
Linking ICM TCD Records to CUCM CDRs
TCD PeripheralCallKey = (globalCallID_callManagerId * (2 to the 24th)) + globalCallID_callId TCD PeripheralCallKey = (globalCallID_callManagerId * (16777216)) + globalCallID_callId example: TCD PeripheralCallKey = (4 * (16777216)) + 70002)
CAD
- CAD Supervisor & Client download from
http://<CAD base services IP address>:8088/TUP/CAD/Install.htm
- CAD Admin from here:
http://<CAD base services IP address>:8088/TUP/CAD/Admin.htm
- CAD SR from here:
http://<CAD base services IP address>:8088/TUP/CAD/SR.htm
- CAD browser edition
https://CAD-server/cadbe/CAD-BE.jsp
http://CAD-server:8088/cadbe/CAD-BE.jsp
CAD LDAP
- On a test environment, to understand better how the Cisco CAD LDAP server is setup you can use the following method
- Download and install the free LDAP client from http://jxplorer.org/
- This is a Java based program, so requires you install the Java Run Time on your PC
- Run JExplorer and connect to the CAD server using the following details:
Version: LDAPv2 Host: IP address of the Server Port: 38983 Base DN: o=Spanlink Communications Security: Anonymous
Parsing a variable with a separator in ICM
This example has a “:” as the separator.
Call.PeripheralVariable8 == Variable1:Variable2" Variable1 == left(Call.PeripheralVariable8,((find(":", Call.PeripheralVariable8))-1)) Variable2 == right(Call.PeripheralVariable8,((len(Call.PeripheralVariable8)-(find(":", Call.PeripheralVariable8)))))
Custom Functions
user1stVariable ⇒
before(":",%1%)
user2ndvariable ⇒
before(":",right(%1%,((len(%1%)-(find(":",%1%))))))
VariableMinusFirst ⇒
right(%1%,((len(%1%)-(find(":",%1%)))))
userVariableMinusSecond ⇒
right(right(%1%,((len(%1%)-(find(":",%1%))))),((len(right(%1%,((len(%1%)-(find(":",%1%))))))-(find(":",right(%1%,((len(%1%)-(find(":",%1%))))))))))
user3rdvariable ⇒
user2ndVariable(userVariableMinusFirst(%1%))
user4thVariable ⇒
(userVariableMinusFirst(userVariableMinusFirst(%1%)))
Upgrade Sequence
- Finesse
- CVP
- GW
- CUIC
- CCE
- CM
All Event CTI Feed from ICM
Small Agent / Generic PG: Max of 5 (excluding CTIOS)
Large Agent / Generic PG: Max of 20 (excluding CTIOS)
Reference: Page 326 of UCCE 11 SRND
Extract below:
All-Event clients (CTI Server)
Max of 5: For 2 vCPU VMs built from the Small Agent PG OVA. These clients are in addition to the 2 CTI OS connections. You can reduce the number of All-Event clients to support more monitor mode connections.
Max of 20: For 4 vCPU VMs built from the Large Agent PG OVA. These clients are in addition to the 2 CTI OS connections. You can reduce the number of All-Event clients to support more monitor mode connections.
UCCE Reason Codes
Reason Code | Reason Description |
---|---|
-1 | Agent reinitialized due to peripheral restart |
-2 | PG reset the agent - PG Failure |
999 | A Finesse supervisor forced an agent state change. |
-3 | Administrator modified the agents extension while the agent was logged in |
32767 | The agent's state was changed to Not Ready because the agent did not answer a call and the call was redirected to a different agent or skill group. |
50002 | CTIOS Failure - Agent Logged Out Incorrectly? |
50003 | The agent was logged out because CUCM reported the agents device as out of service |
50004 | The agent was logged out due to agent inactivity as configured in agent desk settings |
50010 | Not Ready - The agent did not receive multiple consecutive calls routed to him/her. The system makes the agent Not Ready automatically so that additional calls are not routed to the agent. By default, the number of consecutive calls missed before the agent is made Not Ready is 2. |
50020 | Logged Out Due to been Reskilled |
50040 | The mobile agent was logged out because the call failed. |
50041 | Not Ready - The agent's state was changed to Not Ready because the call fails when the agent's phone line rings busy. |
50042 | The mobile agent was logged out because the phone line disconnected when using nailed connection mode. |
51004 | Not Ready - This reason codes applies if an agent logs onto an extension which already has a call or if the agent is on a call when the PG restarts. |
File Exchange
ICM Scripting
Concatenate - too many arguments
Concatenate can handle up to 8 arguments - as per below - any more and it will give a “too many arguments” error If you need to concatenate more - put your 8 arguments to one VariableX and another 8 to another variableY and then concatenate variables X and Y.
concatenate("a=a1","b=2","c=3","d=4","e=5","f=6","g=7","h=8")
UCCE VMware Checklist
Disable on all VMs the following:
- TCP Chimney (netsh int tcp set global chimney=disabled)
- TCP Offload Engine (TOE) - NIC interface - any IPv4 Checksum Offload
- NetDMA (Regedit: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableTCPA = 0)
- RSS (netsh int tcp set global rss=disabled)
- IPv6
How to check:
- netsh int tcp show global (shows if RSS and Chimney is disabled)
- netsh int ip show offload (shows if all offload features has been disabled (not visible) for the 2 physical interfaces)
Scripts
- disable-rss.cmd
@echo off : Gerard O'Rourke cls set confirm=N set /P confirm=Do you want to proceed and disable RSS? IF "%confirm%" == "Y" goto continue IF "%confirm%" == "y" goto continue goto end :continue @echo on netsh int tcp set global rss=disabled netsh int tcp show global pause exit :end echo Script Aborted! pause
Business Hours (CCE 12)
configuredStatus
- 0: Calendar Schedule
- 1: Force Close
- 2: Force Open
runTimeState
- 0 Calendar Closed
- 1 Calendar Open
- 2 Forced Closed
- 3 Forced Open
Open when 1 or 3, Closed when 0 or 2
Calender Open
<configuredStatus><status>0</status></configuredStatus> <runTimeStatus>1</runTimeStatus>
Calender Closed
<configuredStatus><status>0</status></configuredStatus> <runTimeStatus>0</runTimeStatus>
Forced Open
<configuredStatus><status>2</status></configuredStatus> <runTimeStatus>3</runTimeStatus>
Forced Closed
<configuredStatus><status>1</status></configuredStatus> <runTimeStatus>2</runTimeStatus>
Forced Open Example API
<businessHour> <department> <refURL>/unifiedconfig/config/department/5000</refURL> <name>Department1</name> </department> <refURL>/unifiedconfig/config/businesshour/5001</refURL> <changeStamp>3</changeStamp> <configuredStatus> <status>2</status> <statusReason> <refURL>/unifiedconfig/config/businesshourstatusreason/5003</refURL> <reasonText>Unknown Reason</reasonText> </statusReason> </configuredStatus> <name>ForceOpenExample</name> <runTimeStatus>3</runTimeStatus> <runTimeStatusReason>Unknown Reason</runTimeStatusReason> <specialDaySchedules/> <timezone> <refURL>/unifiedconfig/config/timezone/v2/5038</refURL> <displayName>(UTC) Dublin, Edinburgh, Lisbon, London</displayName> </timezone> <type>0</type> <weekDaySchedules/> </businessHour>
Forced Closed
<businessHour> <department> <refURL>/unifiedconfig/config/department/5000</refURL> <name>Department1</name> </department> <refURL>/unifiedconfig/config/businesshour/5002</refURL> <changeStamp>1</changeStamp> <configuredStatus> <status>1</status> <statusReason> <refURL>/unifiedconfig/config/businesshourstatusreason/5003</refURL> <reasonText>Unknown Reason</reasonText> </statusReason> </configuredStatus> <name>ForceClosedExample</name> <runTimeStatus>2</runTimeStatus> <runTimeStatusReason>Unknown Reason</runTimeStatusReason> <specialDaySchedules/> <timezone> <refURL>/unifiedconfig/config/timezone/v2/5038</refURL> <displayName>(UTC) Dublin, Edinburgh, Lisbon, London</displayName> </timezone> <type>0</type> <weekDaySchedules/> </businessHour>
Auto Open by Hours
<businessHour> <refURL>/unifiedconfig/config/businesshour/5003</refURL> <changeStamp>1</changeStamp> <configuredStatus> <status>0</status> </configuredStatus> <name>OpenHours_247</name> <runTimeStatus>1</runTimeStatus> <runTimeStatusReason>Week Day open reason</runTimeStatusReason> <specialDaySchedules/> <timezone> <refURL>/unifiedconfig/config/timezone/v2/5038</refURL> <displayName>(UTC) Dublin, Edinburgh, Lisbon, London</displayName> </timezone> <type>0</type> <weekDaySchedules/> </businessHour>
Auto Closed by Hours
<businessHour> <refURL>/unifiedconfig/config/businesshour/5000</refURL> <changeStamp>21</changeStamp> <configuredStatus> <status>0</status> </configuredStatus> <name>Hours_Sales</name> <runTimeStatus>0</runTimeStatus> <runTimeStatusReason>Week Day closed reason</runTimeStatusReason> <specialDaySchedules/> <timezone> <refURL>/unifiedconfig/config/timezone/v2/5038</refURL> <displayName>(UTC) Dublin, Edinburgh, Lisbon, London</displayName> </timezone> <type>1</type> <weekDaySchedules> <weekDaySchedule> <refURL>/unifiedconfig/config/businesshour/5000/weekdayschedule/5006</refURL> <changeStamp>1</changeStamp> <endTime>17:00</endTime> <startTime>07:00</startTime> <dayOfWeek>1</dayOfWeek> </weekDaySchedule> <weekDaySchedule> <refURL>/unifiedconfig/config/businesshour/5000/weekdayschedule/5007</refURL> <changeStamp>7</changeStamp> <endTime>17:00</endTime> <startTime>07:00</startTime> <dayOfWeek>2</dayOfWeek> </weekDaySchedule> <weekDaySchedule> <refURL>/unifiedconfig/config/businesshour/5000/weekdayschedule/5008</refURL> <changeStamp>2</changeStamp> <endTime>17:00</endTime> <startTime>07:00</startTime> <dayOfWeek>3</dayOfWeek> </weekDaySchedule> <weekDaySchedule> <refURL>/unifiedconfig/config/businesshour/5000/weekdayschedule/5009</refURL> <changeStamp>0</changeStamp> <endTime>17:00</endTime> <startTime>09:00</startTime> <dayOfWeek>4</dayOfWeek> </weekDaySchedule> <weekDaySchedule> <refURL>/unifiedconfig/config/businesshour/5000/weekdayschedule/5010</refURL> <changeStamp>0</changeStamp> <endTime>17:00</endTime> <startTime>09:00</startTime> <dayOfWeek>5</dayOfWeek> </weekDaySchedule> </weekDaySchedules> </businessHour>
Expected Wait Time (EWT)
The example formula provided by the Courtesy Call back Script:
ValidValue(((SkillGroup.%1%.RouterCallsQNow+1) * (ValidValue(SkillGroup.%1%.AvgHandledCallsTimeTo5,20)) /max( SkillGroup.%1%.Ready, (SkillGroup.%1%.TalkingIn + SkillGroup.%1%.TalkingOut + SkillGroup.%1%.TalkingOther)) ),100)
Actual Example with Skillgroup “eirSupport1”
Skill Group Example ValidValue(((SkillGroup.eirSupportSG1.RouterCallsQNow+1)*(ValidValue(SkillGroup.eirSupportSG1.AvgHandledCallsTimeTo5,100))/max(SkillGroup.eirSupportSG1.Ready,(SkillGroup.eirSupportSG1.TalkingIn+SkillGroup.eirSupportSG1.TalkingOut+SkillGroup.eirSupportSG1.TalkingOther))),100)
===
Explanation
This returns the EWT in seconds. Effectivity the formula is: Calls in (Queue * Average Handled Time) / Number of agents that logged in and actively taking calls (i.e. exclude agents that are not ready)
The formula uses the ValidValue so if no current value available for the last 5 minutes it returns a 'default' value.
These should be set the specific Average Handle Time for this specific Queue (determine this by reviewing the SG / PQ Historical report).
Here is a Precision Queue Example:
ValidValue(((PQ.eirSupport1_PQ.CallsInQ+1)*(ValidValue(PQ.eirSupport1_PQ.AvgHandledCallsTimeTo5,285))/max(PQ.eirSupport1_PQ.Ready,(PQ.eirSupport1_PQ.TalkingIn+PQ.eirSupport1_PQ.TalkingOut+PQ.eirSupport1_PQ.TalkingOther))),285)
If the formula is used prior to routing to the PQ - you should include the +1.
If the formula is used after queuing to the SG / PQ - then this should be excluded.
Example for when same Agents are in 3 different PQs
ValidValue(((PQ.Sales_PQ.CallsInQ+PQ.CustomerService_PQ.CallsInQ+PQ.Accounts.CallsInQ)*trun((ValidValue(PQ.Sales_PQ.AvgHandledCallsTimeTo5,285)+ValidValue(PQ.CustomerService_PQ.AvgHandledCallsTimeTo5,285)+ValidValue(PQ.Accounts.AvgHandledCallsTimeTo5,285))/3)/max(PQ.Sales_PQ.Ready,(PQ.Sales_PQ.TalkingIn+PQ.Sales_PQ.TalkingOther))),285)
EWT Custom Functions
Using Precision Queues
Name: EWT_1PQ
ValidValue(((PQ.%1%.CallsInQ)*trunc((ValidValue(PQ.%1%.AvgHandledCallsTimeTo5,%2%))/max(PQ.%1%.Ready,(PQ.%1%.TalkingIn+PQ.%1%.TalkingOther)))),1)
Name: EWT_CustomerService_PQ
trunc(1.0*( userEWT_1PQ(CustomerService_PQ,497) + userEWT_1PQ(Apples_PQ,249) + trunc(0.7*(userEWT_1PQ(Bananas_PQ,171))) ) )
Using Skillgroups
Name: EWT_1SkillGroup
ValidValue(((SkillGroup.%1%.RouterCallsQNow)*trunc((ValidValue(SkillGroup.%1%.AvgHandledCallsTimeTo5,%2%))/max(SkillGroup.%1%.Ready,(SkillGroup.%1%.TalkingIn+ SkillGroup.%1%.TalkingOut+SkillGroup.%1%.TalkingOther)))),%2%)
Name: EWT_Sales
userEWT_1SkillGroup(Sales_IVR,300) + trunc((0.50)*userEWT_1SkillGroup(Apples_IVR,386)) + trunc((0.80)*userEWT_1SkillGroup(Bananas_IVR,300))
API URLs
Inventory URL
https://cvp-server:8111/cvp-dp/rest/DiagnosticPortal/ListConfigurationCategories https://cvp-server:8111/cvp-dp/rest/DiagnosticPortal/GetConfigurationCategory?Category=CallServer%2FSIP&Filename=C%3A%5CCisco%5CCVP%5Cconf%5Csrv.xml https://cvp-server:8111/cvp-dp/rest/DiagnosticPortal/GetConfigurationCategory?Category=CallServer/SIP&Filename=C:%5CCisco%5CCVP%5Cconf%5Csrv.xml https://cvp-server:8111/cvp-dp/rest/DiagnosticPortal/GetProductVersion https://cce-server:7890/icm-dp/rest/DiagnosticPortal/GetProductVersion https://cce-server:7890/icm-dp/rest/DiagnosticPortal/ListServices https://finesse:8445/finesse/api/SystemInfo
Agent API
Note - only PCCE API allows you to create Agents.
With UCCE you get a 405 - method not allowed.
List Agents
HTTP GET
URL:
https://ucce-hds-12/unifiedconfig/config/agent?time=1677491118064&startIndex=0&q=&ignoreSearchErrors=true&summary=true&resultsPerPage=2
Response
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <results> <pageInfo> <firstPage>https://ucce-hds-12/unifiedconfig/config/agent?sort=person.userName%20asc&resultsPerPage=2</firstPage> <lastPage>https://ucce-hds-12/unifiedconfig/config/agent?sort=person.userName%20asc&startIndex=4&resultsPerPage=2</lastPage> <nextPage>https://ucce-hds-12/unifiedconfig/config/agent?sort=person.userName%20asc&startIndex=2&resultsPerPage=2</nextPage> <resultsPerPage>2</resultsPerPage> <sortTerm>person.userName asc</sortTerm> <startIndex>0</startIndex> <totalResults>6</totalResults> </pageInfo> <permissionInfo> <canCreate>true</canCreate> <canUpdate>true</canUpdate> <canDelete>true</canDelete> <role>Administrator</role> <departmentAdmin>false</departmentAdmin> </permissionInfo> <agents> <agent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="agentSummary"> <department> <refURL>/unifiedconfig/config/department/5000</refURL> <name>Department1</name> </department> <refURL>/unifiedconfig/config/agent/5028</refURL> <changeStamp>7</changeStamp> <agentId>5551001</agentId> <agentServicesEnabled/> <agentStateTrace>false</agentStateTrace> <agentTeam> <refURL>/unifiedconfig/config/agentteam/5000</refURL> <name>Team_A</name> <department> <refURL>/unifiedconfig/config/department/5000</refURL> <name>Department1</name> </department> </agentTeam> <person> <ecePerson>true</ecePerson> <firstName>Alice</firstName> <lastName>Anderson</lastName> <loginEnabled>true</loginEnabled> <screenName>Alice</screenName> <ssoEnabled>false</ssoEnabled> <userName>[email protected]</userName> </person> <supervisor>true</supervisor> </agent> <agent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="agentSummary"> <department> <refURL>/unifiedconfig/config/department/5000</refURL> <name>Department1</name> </department> <refURL>/unifiedconfig/config/agent/5029</refURL> <changeStamp>6</changeStamp> <agentId>5551002</agentId> <agentServicesEnabled/> <agentStateTrace>false</agentStateTrace> <agentTeam> <refURL>/unifiedconfig/config/agentteam/5000</refURL> <name>Team_A</name> <department> <refURL>/unifiedconfig/config/department/5000</refURL> <name>Department1</name> </department> </agentTeam> <person> <ecePerson>true</ecePerson> <firstName>Bob</firstName> <lastName>Bobster</lastName> <loginEnabled>true</loginEnabled> <screenName>Bob</screenName> <ssoEnabled>false</ssoEnabled> <userName>bob</userName> </person> <supervisor>false</supervisor> </agent> </agents> </results>
Create an Agent
HTTP POST
URL:
https://ucce-hds-12/unifiedconfig/config/agent
BODY:
<agent> <agentId>999001</agentId> <peripheral/> <peripheralSet/> <person> <firstName>temp</firstName> <lastName>agent1</lastName> <userName>temp_agent1</userName> <loginEnabled>false</loginEnabled> <ssoEnabled>false</ssoEnabled> <password>12345</password> <ecePerson>false</ecePerson> </person> <description>My Desc</description> <department/> <datacenter/> <agentDeskSettings/> <agentTeam/> <agentAttributes/> <skillGroups> <skillGroup> <refURL>/unifiedconfig/config/skillgroup/5035</refURL> </skillGroup> </skillGroups> <defaultSkillGroup/> <supervisor>false</supervisor> <supervisorTeams/> </agent>
CCE 12.6.2
SQL 2019 Issues
Make sure to install ODBC 13
Install Error
2023-05-21 12:13:41 [Information] Operating System ProductName = Windows Server 2019 Standard 2023-05-21 12:13:41 [Information] Microsoft SQL Server is installed on this system 2023-05-21 12:13:41 [Information] Checking Microsoft SQL Server installation 2023-05-21 12:13:41 [Information] MSSQLSERVER service is started. 2023-05-21 12:13:41 [Information] SQL query = select case when CHARINDEX('64', CAST(SERVERPROPERTY('Edition') AS VARCHAR(100))) >0 then 64 else 32 end 2023-05-21 12:13:41 [Information] Return code from dbupgRunSQLSelectInt = 0 2023-05-21 12:13:41 [Error] Installer failed due to the following possible reasons: 1) SQL Server Edition check failed. 2) The logged in user may not be part of SQL security logins with sysadmin role associated. Please correct the errors manually and re-start the ICM Installation.
ALTER DATABASE master SET COMPATIBILITY_LEVEL = 140;
SELECT name, compatibility_level FROM sys.databases;
Reference: Compatability: https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cust_contact/contact_center/icm_enterprise/ucce_compatibility/matrix/rcct_b_12_6_solution_compatibility_matrix.html Install: https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cust_contact/contact_center/pcce/pcce_12_6_2/installation/guide/pcce_b_1262_cisco_pcce_installationandupgrade_guide/pcce_b_cisco_pcce_installationandupgrade_guide_12_5_2_appendix_01010.html#task_BFD5435B077F5DD844025A17F2B572DB SQL https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver15
Virtualization
UPCC Test
An Example of using UPCCTEST. This should only be used with instructions from TAC.
upcctest: tran /start upcctest: SystemAttribute /SystemAttributeID <ID> /AttributeValue 1 /cs <CHANGESTAMP> /update upcctest: tran /commit Verify the update by executing query on AWDB.
If the ID the field is '1234' and the existing change stamp is '9' the command would look like below:
upcctest: tran /start upcctest: SystemAttribute /SystemAttributeID 1234 /AttributeValue 1 /cs 9 /update upcctest: tran /commit Verify the update by executing query on AWDB.
Another example - adding a System Reason Code - which was in Finesse but not in AW database
tran /start ReasonCode /ReasonCode 50006 /ReasonText Offhook /desc "The agent takes the phone off the hook to place a call. If the agent remembers to change the status, the agent-triggered reason code is displayed. If the agent does not remember to change the status, the system issues this reason code" /ReasonType 4 /IsGlobal Y tran /commit