Call transfer not accept extension digits and returns: extension is not valid

hello dear friends,
i have problem in call transfer in asterisk 13.18
incoming call from PSTN send to extension 1000 , he answers the call and then wants to transfer to 2000, first he press * (specified in features.conf), music on hold will be played for the caller from PSTN, after that asterisk playbacks “pbx-transfer.gsm” for 1000 and then want to enter extension number, but once “extension 1000” want to enter 2000 and exactly when press 2 (first digit of 2000) asterisk playbacks “pbx-invalid.gsm” , like it cant understand DTMF and again returns the call to 1000.

i test many configuration in features.conf and sip.conf
please help me to solve the problem

features.conf

[general]
transferdigittimeout => 10 ; Number of seconds to wait between digits when transferring a call; (default is 3 seconds)
xfersound = beep ; to indicate an attended transfer is complete
xferfailsound = beeperr ; to indicate a failed transfer
pickupexten = *8 ; Configure the pickup extension. (default is *8)
pickupsound = beep
featuredigittimeout = 500
transferdialattempts = 2

[featuremap]
blindxfer = #
atxfer = *

sip.conf

[general]
udpbindaddr=0.0.0.0:5060
realm=10.1.10.45 ;replace with your Asterisk server public IP address or host
;transport=udp,ws,wss
transport=udp
websocket_enabled=true
transfer=yes
dtmfmode=rfc2833
canreinvite=no
directmedia=no
allowtransfer=yes
relaxdtmf=yes

[1000]
deny=0.0.0.0/0.0.0.0
secret=1q2w3e
dtmfmode=rfc2833
canreinvite=no
context=from-internal
host=dynamic
trustrpid=yes
sendrpid=no
type=friend
nat=yes
port=5060
qualify=no
qualifyfreq=60
transport=udp
avpf=no
icesupport=no
dtlsenable=no
dtlsverify=no
dtlssetup=actpass
encryption=no
callgroup=
pickupgroup=
dial=SIP/1000
mailbox=1000@device
permit=0.0.0.0/0.0.0.0
callerid=1000-jessica <1000>
callcounter=yes
faxdetect=no

[2000]
deny=0.0.0.0/0.0.0.0
secret=1q2w3e
dtmfmode=rfc2833
canreinvite=no
context=from-internal
host=dynamic
trustrpid=yes
sendrpid=no
type=friend
nat=yes
port=5060
qualify=no
qualifyfreq=60
transport=udp
avpf=no
icesupport=no
dtlsenable=no
dtlsverify=no
dtlssetup=actpass
encryption=no
callgroup=
pickupgroup=
dial=SIP/2000
mailbox=2000@device
permit=0.0.0.0/0.0.0.0
callerid=2000-robert <2000>
callcounter=yes
faxdetect=no

extensions.conf

[from-internal]
exten => 1000,1,dial(sip/1000,Tt)
exten => 2000,1,dial(sip/2000,Tt)

your kind helps are so appritiated, thanksss

Are you sure the peers are set to the equivalent of dtmfmode=2833?

Also please note that it is meaningless to have both directmedia and canreinvite, at the same time, as they are the same. canreinvite is deprecated.

Specifying type-friend for local devices reduces security and can cause misoperation. Unless there is some reason why IP address is not sufficient to distinguish callers, always use type=peer.

The yes value of nat is deprecated, and doesn’t appear to be needed in this case.

qualify=no is unusual for local devices.

To the best of my knowledge, dial= does nothing.

thanks for your help.
acctually now my transfer is working with below context:

[from-internal]
exten => 1000,1,dial(sip/1000,Tt)
exten => 2000,1,dial(sip/2000,Tt)

but my context is something like this:

[from-internal]
include => ext-local

[ext-local]
exten => 2000,1,Set(__rt=${DB(${EXTEN}/ringtimer)})
exten => 2000,n,macro(dial-one,2000)
exten => 2000,n,set(CHANNEL(language)=${DB(2000/language)})
exten => 2000,n,macro(vm,2000)

[macro-dial-one]
include => macro-dial-one-custom
exten => s,1,Set(DEXTEN=${ARG1})
exten => s,n,Set(CID=${CALLERID(num)})
exten => s,n,ExecIf($["${DB(${CALLERID(num)}/user)}"="yes"]?Set(__DID=0):Set(__DID=${CALLERID(dnid)}))
exten => s,n,macro(in-get-id,${DEXTEN},${CID},${DID})
exten => s,n,macro(mixmonitor,in,${DEXTEN},${CID})
exten => s,n,dial(${type}/${DEXTEN},${rt},TtM(connect^${callid}))
exten => s,n,MacroExit()

as you see i pass Tt option to dial.

when there is no exact route for 2000 in from-internal , transfer not work ,
but why transfer doesn’t use “include” routes in from-internal ?

i think by default transfer execute just with direct route in main context. unless there be a trick that i don’t know

please help me friends

Many missing “$”. Please mark dialplan as pre-formatted text, using </> button.

thanks for your inform, please check my real problem.