DG-Labs Coyote TCode Support for FapTap, MultiFunPlayer, etc

I’ve made a small python script to act as an interface between a TCode serial port and the DG-Labs Coyote directly via Bluetooth.

No more relying on XToys!

It uses a trimmed down version of the code from GameInterfaceForToys to connect/communicate with the Coyote.

The script supports two axis (L0 and R2) mapped to Channels A/B.

Works with:


  • The Bluetooth library used sometimes takes a few attempts to connect (you may need to restart the script if taking too long)
  • If you’re not familiar with e-stim, do some research before attempting to use this and follow common sense (nothing near the chest, across the heart, etc.)
  • Don’t adjust the maximum output limit unless you’re familiar with the capability of the Coyote. It can hurt if you don’t know what you’re doing.
  • The hardware has a limitation of changing intensity once every 100ms which sounds fast, but with fast scripts it may not be able to react quick enough.


In order to use the script, you need a few things:

  • Python 3 for Windows

  • The following Python packages - it is recommended that you use python’s built-in package manager “pip”:

    • pip install bleak
      pip install pyserial
      pip install pyglet

  • com0com for Windows to create two virtual COM ports paired together.

    • com0com creates a pair of COM ports (e.g. COM3 and COM4) linked together to allow connecting one COM port based application to another. All the default settings seem to work fine.
    • i.e. the script connects to COM3, while whatever app you’re using connects to COM4
    • This allows the script to receive T-Code commands and translate it into something the Coyote can respond to.


There are a few user-configurable items:

  • COM_PORT - The COM port used by the script from com0com
  • OUTPUT_LIMIT - Default maximum intensity (adjustable via GUI once running), an integer value from 0-2047. Default is 300.
  • OUTPUT_LIMIT_CAP - Maximum intensity cap as an integer value from 0-2047. Be careful adjusting this value.
  • OUTPUT_LIMIT_RANGE - A scaled range of intensity relative to the max output. Default is 10%. E.g. If the T-Code command is between 0-9999, 0 corresponds to the current OUTPUT_LIMIT, 9999 corresponds to the OUTPUT_LIMIT minus 10%.
  • DEVICE_UID - Your specific device bluetooth MAC address. You can configure this to allow connecting without scanning first.
  • A_B_LINKED - By default, axis R2 (pitch) is connected to Channel B. You can optionally link both Channel B to axis L0.
  • A_B_INVERTED - If True, Channel B will output the inverse of Channel A
  • B_MIDPOINT - If True, any values received for axis R2 assumes the home position is the midpoint, with the absolute delta value relative to home used as intensity

Unzip the files and run interface.py:

python ./interface.py

A small window will open showing the max/min output as a percentage. Hover over and use a mouse scroll wheel to adjust in real time.

Coyote Interface Download




  • V1.1
    • Added ability to adjust max intensity in real time with mouse wheel
    • Scale T-Code command to configurable intensity range of intensity rather than relying on software/players to scale properly
    • Added option for inverted output on Channel B when using as a single axis (FapTap / Buttplug.io)

see error below. what am i doing wrong?

L:> python interface.py
Traceback (most recent call last):
File “L:\interface.py”, line 35, in
import serial, re, math, time, asyncio
ModuleNotFoundError: No module named ‘serial’
PS L:> python ./interface.py
Traceback (most recent call last):
File “L:\interface.py”, line 35, in
import serial, re, math, time, asyncio
ModuleNotFoundError: No module named ‘serial’

I’ve updated the instructions to include pip install pyserial.

There’s an updated version (v1.1) that needs the pyglet package as well.