sys-hidplus: a brand new sysmodule that allows you to emulate gamepads over the network for Parsec

sys_hidplus.png

(v1.1 + New Client released!)
sys-hidplus: a brand new sysmodule that allows you to emulate controllers over the network


sys-hidplus is a sysmodule that allows you to emulate up to 3 controllers (and probably more in the future) over the network from a PC to a Nintendo Switch.
The objective of this is to allow services such as Parsec to be usable on the Switch without having to buy $100 worth of accessories to emulate a single controller.
Currrently, the sysmodule still has some bugs, but it's usable and, most importantly, playable and enjoyable.
You can check more details on the github repository and any kind of feedback is welcomed!

unknown.png

If anything here sounds familiar, is because I'm the same developer a hid-mitm-plus, a unstable fork of hid-mitm with the same objective, but it has been rewritten from scratch due to the crashes and bad performance.
So, yeah, this not a fork or an update, this is, in fact, a brand new sysmodule with newly written code and functionality too (such as experimental joy-con emulation)!
(just in case, development of hid-mitm-plus has ceased and won't be coming back, use this instead)

Requirements:
Instructions:
(This tutorial has yet to be updated for v1.1, please be patient!)
First, copy the contents of the "nswitch" folder in the build zip file to the Switch microSD card. Make sure to use Atmosphere because this sysmodule isn't tested with other CFWs.

After that, make sure you have Python3 installed and open cmd on the location of the extracted "pc" folder from the build zip file and execute
Code:
py -3 -m pip install inputs
(you'll have to do this step only once). Once inputs is installed, you can then connect to your switch by using
Code:
python3 input_pc.py {SWITCH IP}
replacing {SWITCH IP} with the IP address of your Switch (You can check it by going to Settings > Internet on your system) (Note: if using "python3" gives an error/prints an empty line, try using "py" instead. If that also gives issues, try reinstalling python making sure "add to paths" is enabled. If not even that works, try using the python3 path instead of using "python3" or "py".

If you did all the steps fine, your switch should now detect your controller as a Kirby colored Pro Controller (or a JoyCon, more details below).

You can modify the behaviour of the controller emulation on the python file by changing the conType values. If you set it to 0, you'll be able to disconnect the controller (useful if the Switch disconnects the controller for some reason). If you set it to 1, you'll be able to emulate a Pro Controller. If you set it to 2 or 3, you'll be able to use the experimental sideways joycon emulation, it has some issues but in some games such as Clubhouse Games, it'll be playable.

If for some reason you enter to the "Change Grip/Order" menu or when entering a game your controller is disconnected on the Switch, modify the python script, set the conType value of the disconnected controller to 0, execute the python script once, change the value back to 1 (or 2/3) and the controller will be functional again!​
Links:
Special Thanks to:
  • jakibaki - base and inspiration for this sysmodule (hid-mitm), a lot of the code comes from it
  • cathery - helping me with my dumb questions and issues
  • ReSwitched Discord Server - help in the support channels
  • Everyone using this sysmodule - thanks a lot!
 
Last edited by nachuz,

H0ly

New Member
Newbie
Joined
Sep 25, 2018
Messages
3
Trophies
0
Age
28
XP
47
Country
United States
im on linux, using an xbox one wired controller, all buttons work except the left and right joysticks up and down are opposite. Just fixed the problem

i fixed it by changing:

usedGamepad.dx_l = dx_l
usedGamepad.dx_r = dx_r
usedGamepad.dy_l = -dy_l
usedGamepad.dy_r = -dy_r

To:
usedGamepad.dx_l = dx_l
usedGamepad.dx_r = dx_r
usedGamepad.dy_l = dy_l
usedGamepad.dy_r = dy_r

also on xbox one wired control minus and plus are switched and x and y aswell i fixed it

thx for this great work.
 

zxr750j

Well-Known Member
Member
Joined
Sep 29, 2003
Messages
630
Trophies
0
Location
Utrecht
XP
1,847
Country
Netherlands
I'm trying to make a script that repeatedly bangs the A button (you've gotta start somewhere, it's my "Hello World"). I took a piece of the py and removed a lot of code and it kinda works but it only presses A ones. What am I doing wrong?

(renamed input_pc_simple.py to input_pc_simple.py.txt for uploading)
 

Attachments

  • input_pc_simple.py.txt
    2.2 KB · Views: 57
  • Like
Reactions: Julie_Pilgrim

enderer

Well-Known Member
Member
Joined
Jul 19, 2015
Messages
366
Trophies
0
Age
32
XP
1,191
Country
United States
Traceback (most recent call last):
File "input_pc.py", line 5, in <module>
from inputs import get_gamepad, devices
ModuleNotFoundError: No module named 'inputs'

EDIT: i'm still on fw 9.2. that might be the issue.

REEDIT: updated to 10.2 still getting the same error in cmd
 
Last edited by enderer,

Chrisssj2

Well-Known Member
Member
Joined
Feb 12, 2008
Messages
2,369
Trophies
0
XP
3,274
Country
Netherlands
I don't have a DS4 but if you are able to connect it to your pc and get x360ce to recognize it, there should be no problem.

I am planning to upload a tutorial later
I'd really appreciate a tutorial. I tried to have a friend join with his xbox 360 controller. and I see the input.py see his inputs. But it does say "P1" not sure if he should be seen as P2 as we would be both playing together.
But P1 or P2 regardless, my switch doesn't seem to receive it's input. I tried using x360ce, but not working either.
 
Last edited by Chrisssj2,

nachuz

Well-Known Member
OP
Member
Joined
May 21, 2017
Messages
634
Trophies
0
XP
2,008
Country
Chile
I'm trying to make a script that repeatedly bangs the A button (you've gotta start somewhere, it's my "Hello World"). I took a piece of the py and removed a lot of code and it kinda works but it only presses A ones. What am I doing wrong?

(renamed input_pc_simple.py to input_pc_simple.py.txt for uploading)
I made it work by doing something like this:
Code:
while(loopy):
    gamepadList0keys=1
    print(pack("<HHHQiiiiHQiiiiHQiiii", 0x3276, controllerCount, conType, gamepadList0keys, gamepadList0dx_l, gamepadList0dy_l, gamepadList0dx_r, gamepadList0dy_r ,twoConType,gamepadList1keys,gamepadList1dx_l,gamepadList1dy_l,gamepadList1dx_r,gamepadList1dy_r,threeConType ,gamepadList2keys,gamepadList2dx_l,gamepadList2dy_l,gamepadList2dx_r, gamepadList2dy_r),server_address)
    sock.sendto(pack("<HHHQiiiiHQiiiiHQiiii", 0x3276, controllerCount, conType, gamepadList0keys, gamepadList0dx_l, gamepadList0dy_l, gamepadList0dx_r, gamepadList0dy_r ,twoConType,gamepadList1keys,gamepadList1dx_l,gamepadList1dy_l,gamepadList1dx_r,gamepadList1dy_r,threeConType ,gamepadList2keys,gamepadList2dx_l,gamepadList2dy_l,gamepadList2dx_r, gamepadList2dy_r),server_address)
    sleep(1/60)
    gamepadList0keys=0
    print(pack("<HHHQiiiiHQiiiiHQiiii", 0x3276, controllerCount, conType, gamepadList0keys, gamepadList0dx_l, gamepadList0dy_l, gamepadList0dx_r, gamepadList0dy_r ,twoConType,gamepadList1keys,gamepadList1dx_l,gamepadList1dy_l,gamepadList1dx_r,gamepadList1dy_r,threeConType ,gamepadList2keys,gamepadList2dx_l,gamepadList2dy_l,gamepadList2dx_r, gamepadList2dy_r),server_address)
    sock.sendto(pack("<HHHQiiiiHQiiiiHQiiii", 0x3276, controllerCount, conType, gamepadList0keys, gamepadList0dx_l, gamepadList0dy_l, gamepadList0dx_r, gamepadList0dy_r ,twoConType,gamepadList1keys,gamepadList1dx_l,gamepadList1dy_l,gamepadList1dx_r,gamepadList1dy_r,threeConType ,gamepadList2keys,gamepadList2dx_l,gamepadList2dy_l,gamepadList2dx_r, gamepadList2dy_r),server_address)
    sleep(1/60)
#   loopy=False

--------------------- MERGED ---------------------------

Traceback (most recent call last):
File "input_pc.py", line 5, in <module>
from inputs import get_gamepad, devices
ModuleNotFoundError: No module named 'inputs'

EDIT: i'm still on fw 9.2. that might be the issue.

REEDIT: updated to 10.2 still getting the same error in cmd
you didn't install inputs correctly
execute this command:
Code:
py -3 -m pip install inputs
if you get an error, try reinstalling python (make sure you have add to PATH enabled when installing)
 

nachuz

Well-Known Member
OP
Member
Joined
May 21, 2017
Messages
634
Trophies
0
XP
2,008
Country
Chile
Nice tool, thanks man !

For people who have a problem with the line:
python3 input_pc.py SWITCH_IP

Just replacing python3 with py, it worked straight out for me! ;)
Nice! Added to the op guide

--------------------- MERGED ---------------------------

Wondeful to have the option to use the Controller you want to use ... without the in between dongles and stuff.
Thank you!
 

Shaddap

Member
Newcomer
Joined
Feb 14, 2016
Messages
13
Trophies
0
Age
40
XP
231
Country
United States
Nice! Added to the op guide

--------------------- MERGED ---------------------------


Thank you!
Any update on Home and Capture buttons working? This thing is amazing, by the way. My friend has been able to play Animal Crossing because of this and she is absolutely loving the experience, just that she can't catch screenshots as she plays.
 

Chrisssj2

Well-Known Member
Member
Joined
Feb 12, 2008
Messages
2,369
Trophies
0
XP
3,274
Country
Netherlands
Could someone please write a guide? This plugin is absolutely amazing. But it is very finicky to get to work properly.
Due to getting windows/switch to properly recognize controllers in the right way. P1, P2 etc.

What are the exact steps for it?
Example, I host a parsec session. Start sysdvr and input.py.
Friend joins, connects Xbox360 or dualshock controller and it works?
For me it doesn't work like that.
 
Last edited by Chrisssj2,

Hexalform

Well-Known Member
Newcomer
Joined
Jun 27, 2018
Messages
47
Trophies
0
XP
1,250
Country
United States
Could someone please write a guide? This plugin is absolutely amazing. But it is very finicky to get to work properly.
Due to getting windows/switch to properly recognize controllers in the right way. P1, P2 etc.

What are the exact steps for it?
Example, I host a parsec session. Start sysdvr and input.py.
Friend joins, connects Xbox360 or dualshock controller and it works?
For me it doesn't work like that.

I think you may have the steps a bit out of order (haven't tried it yet, but it reads my controller fine and will try this w/ friends later)

But try:

1) Reboot the Switch (just in case)

2) Start a Direct Parsec session, making sure everyone's controllers are already connected/detected/working (Parsec->Gamepad)

3) Open input.py, and it should detect both of your controllers (test it out by both of you moving a controller stick and seeing if moves on the physical Switch. You can also check in the "Controllers" option on the Switch (but do not open "Change Grip/Order" as this will disconnect them and it will just be easier to reboot the Switch and re-run input.py.)

4) Open SYSDVR and play

I think that would work?
 
  • Like
Reactions: Chrisssj2

Chrisssj2

Well-Known Member
Member
Joined
Feb 12, 2008
Messages
2,369
Trophies
0
XP
3,274
Country
Netherlands
I think you may have the steps a bit out of order (haven't tried it yet, but it reads my controller fine and will try this w/ friends later)

But try:

1) Reboot the Switch (just in case)

2) Start a Direct Parsec session, making sure everyone's controllers are already connected/detected/working (Parsec->Gamepad)

3) Open input.py, and it should detect both of your controllers (test it out by both of you moving a controller stick and seeing if moves on the physical Switch. You can also check in the "Controllers" option on the Switch (but do not open "Change Grip/Order" as this will disconnect them and it will just be easier to reboot the Switch and re-run input.py.)

4) Open SYSDVR and play

I think that would work?

Well, i start out in blanc situation and other person having controller already detected. and I DO see gamepads being detected in the input.py aswell, but NOT having controller recognised on the switch. So it just doesnt work MOST of the time. You shouldnt need 3rd party software like x360ce? I tried with and without, and got mixed results if I remember correctly.
Sometimes eventually I get it working, but only after many many tries ussually. (only once it worked out of the box)

If you or anyone cares, feel free to add me so we can test it.
Parsec:Reconhell#175230
Discord: CliffHearth#1974
 

Intronaut

A star maker
Member
Joined
Nov 18, 2014
Messages
772
Trophies
0
Age
28
XP
982
Country
Chile
Hi, maybe this is a little off-topic, but I have a question related to the use of Sysdvr and Parsec. Everything is working fine, even with audio. However, I am not streaming the audio through Sysdvr, but rather through an aux cable (from the headphones jack to the mic one in the computer).

But I am afraid that could damage my switch. Is that possible?
 

Chrisssj2

Well-Known Member
Member
Joined
Feb 12, 2008
Messages
2,369
Trophies
0
XP
3,274
Country
Netherlands
Hi, maybe this is a little off-topic, but I have a question related to the use of Sysdvr and Parsec. Everything is working fine, even with audio. However, I am not streaming the audio through Sysdvr, but rather through an aux cable (from the headphones jack to the mic one in the computer).

But I am afraid that could damage my switch. Is that possible?
Im using that way line in. I dont see how or why it would damage your switch.
I've always been using that to route audio. I did buy a ground loop isolator cuz It picked up noise from my desktop.
 

Chrisssj2

Well-Known Member
Member
Joined
Feb 12, 2008
Messages
2,369
Trophies
0
XP
3,274
Country
Netherlands
I got this working fine on my end locally but when a friend connects over parsec, it never finds their controller, despite the fact that it works in every thing else (Windows Game Controller test, RetroArch, etc.). Is there anything specific that needs to be changed? They attempted this with a dualshock 4, both wired and wireless, with and without ds4windows to no avail. Using Python 3.9 if that makes a difference.

EDIT: False alarm! Looks like the issue was that closing Parsec didn't actually close it, it just minimized it to the taskbar as a system icon. Just had to exit Parsec entirely, have ds4windows ready to go, and then launch Parsec.

On a side note, is there a way to map the Home and Capture buttons? Both aren't working for me.

Yeah im not getitng it to work AT ALL with a friend. Been trying for hours upon hours. rebooting all my systems, trying all sorts of stuff. Exactly like your describing, locally it is consistent. But as soon as I try with friends. It recognises their controller with "windows game controller test, x360ce, and the input.py" But NOT being able to join the games and being able to control them. It doesn't seem to matter if the controller is recognised as P1,P2,P3 in the Python script.

Can I please get some help on this.
@nachuz
 
Last edited by Chrisssj2,

Shaddap

Member
Newcomer
Joined
Feb 14, 2016
Messages
13
Trophies
0
Age
40
XP
231
Country
United States
I'll type out the exact method I used to get this working with friends using a dualshock and Elgato HD60 Pro, just to remind myself for future reference.

  • Install sys-hidplus on Switch, reboot.
  • Install python 3 on PC (I personally installed the current 3.9)
  • Went to python install directory (User\AppData\Local\Programs\Python\Python39) and renamed python.exe to python3.exe
  • Extracted input_pc.py to python39 folder (same location as python3.exe)
  • Opened command prompt window, installed inputs with command: py -3 -m pip install inputs
  • Friend connects dualshock 4 to PC over bluetooth/wired and runs latest DS4Windows
  • Friend enables Hide DS4 Controller in DS4Windows settings
  • Friend connects to me over Parsec (all settings default) and presses any button on controller to enable it on my PC
  • Test friend's controller in Windows' built-in Game Controllers settings to make sure it picks up all inputs
  • If successful, open command prompt in Python39 folder and run python3 input_pc.py [SWITCH IP] (replace [SWITCH IP] with whatever your console's IP is}
  • Open OBS/Elgato Game Capture HD software and confirm that it works (it should)
 
Last edited by Shaddap,

Intronaut

A star maker
Member
Joined
Nov 18, 2014
Messages
772
Trophies
0
Age
28
XP
982
Country
Chile
I'll type out the exact method I used to get this working with friends using a dualshock and Elgato HD60 Pro, just to remind myself for future reference.

  • Install sys-hidplus on Switch, reboot.
  • Install python 3 on PC (I personally installed the current 3.9)
  • Went to python install directory (User\AppData\Local\Programs\Python\Python39) and renamed python.exe to python3.exe
  • Extracted input_pc.py to python39 folder (same location as python3.exe)
  • Opened command prompt window, installed inputs with command: py -3 -m pip install inputs
  • Friend connects dualshock 4 to PC over bluetooth/wired and runs latest DS4Windows
  • Friend enables Hide DS4 Controller in DS4Windows settings
  • Friend connects to me over Parsec (all settings default) and presses any button on controller to enable it on my PC
  • Test friend's controller in Windows' built-in Game Controllers settings to make sure it picks up all inputs
  • If successful, open command prompt in Python39 folder and run python3 input_pc.py [SWITCH IP] (replace [SWITCH IP] with whatever your console's IP is}
  • Open OBS/Elgato Game Capture HD software and confirm that it works (it should)

I just wrote a tutorial but for sysdvr. Anyway, all the steps about changin python3 name are unnecessary. Just run this command: py input_pc.py SWITCH_IP
 

pehkay

New Member
Newbie
Joined
Nov 5, 2020
Messages
3
Trophies
0
Age
89
XP
108
Country
Singapore
A stupid question, how do you know if sys-hidplus is running on the Switch?

--------------------- MERGED ---------------------------
 
General chit-chat
Help Users
  • No one is chatting at the moment.
    Veho @ Veho: https://i.imgur.com/8Bj96q1.mp4