GithubHelp home page GithubHelp logo

linak-controller's Introduction

linak-controller

(Previously idasen-controller)

Linak make motorised standing desks. They can be controlled by a physical switch on the desks or via bluetooth using an phone app. This is a script to control Linak desks via bluetooth from any other device.

Note: This script may not work with all Linak desks - see below for comaptible models.

Set up

Prerequisites

  • Windows / Linux / Mac
  • The device should have Python 3
  • The desk should be paired to the device.

Working Desks

  • Ikea Idasen - works (my desk!)
  • iMovr Lander - reported working 43
  • Linak DPG1C - reported working 32
  • Linak DPG1M - reported working 32

If you find another desk model that works please make an issue to report it!

Install

Install using pip:

pip3 install linak-controller

Configuration

Configuration can be provided with a file, or via command line arguments. Use --help to see the command line arguments help. Edit <config_dir>/config.yaml if you prefer your config to be in a file. <config_dir> is normally:

  • ~/.config/linak-controller on Linux
  • C:\Users\<user>\AppData\Local\linak-controller\linak-controller on Windows
  • ~/Library/Application Support/linak-controller on MacOS

Config options:

Option Description Default
mac_address The MAC address (or UUID on MacOS) of the desk. This is required.
base_height The lowest possible height (mm) of the desk top from the floor By default this is read from the desk. null.
adapter_name The adapter name for the bluetooth adapter to use for the connection (Linux only). hci0
scan_timeout Timeout to scan for the device (seconds). 5
connection_timeout Timeout to obtain connection (seconds). 10
move_command_period Time between move commands when using move-to (seconds). 0.4
server_address The address the server should run at (if running server). 127.0.0.1
server_port The port the server should run on (if running server). 9123
favourites Favourite heights object where the key is the name and the value is the height { sit: 683, stand: 1040 }

All of these options (except favourites) can be set on the command line, just replace any _ with - e.g. mac_address becomes --mac-address.

Device MAC addresses

  • On Linux, device MAC addresses can be found using bluetoothctl and bluetooth adapter names can be found with hcitool dev
  • On Windows you can use Bluetooth LE Explorer.
  • On MacOS you can pair the device with Bluetility, but you must use the UUID instead of the Mac Address.

Usage

The script accepts a number of commands:

Command Description
Running without any command will print the current desk height
--watch Watch desk and print changes to height (and speed)
--move-to <value> Move the desk to a certain height (mm) above the floor
--scan List available bluetooth devices (using the configured adapter_name)
--server Run the script as a server, which will maintain the connection and provide quicker response times
--tcp-server Run the script as a simpler tcp only server
--forward <other commands> Send commands to a server
--config <path> Specify a path to a config file

Moving the desk

To move to a particular height you can run:

linak-controller --move-to 800

If you have configured favourite values in the config.yaml like this:

favourites:
  sit: 683
  stand: 1040

Then you can also pass the favourite name to the --move-to command:

linak-controller --move-to sit

Using the Server

You can run the script in a server mode. This will maintain a persistent connection to the desk and then listen on the specified port for commands. This has a number of uses, one of which is making the response time a lot quicker. Both the server and client will print the current height and speed of the desk as it moves.

Remember to ensure that the ports and IPs are configured in both the server and client config.yaml files (or provide them as command line arguments).

You can start the server like this:

linak-controller --server

And then on the same or different device:

linak-controller --forward --move-to 800

You can also use any of the favourites that are configured on the server:

linak-controller --forward --move-to stand

You can also directly post a JSON object to the server:

curl -X POST http://127.0.0.1:9123 --data '{"command": "move_to", "move_to": 640}'

There is also a simpler TCP server mode which you can with:

linak-controller --tcp-server

And then use any tool you like to send commands. For example you could use nc on linux:

echo '{"command": "move_to", "move_to": 640}' | nc -w 1 127.0.0.1 9123

If you use the linak-controller command to send commands to the server then you will receive live logging back from the server, which you will not receive if you post JSON or use the TCP server.

Troubleshooting

Connection failed

The initial connection can fail for a variety of reasons, here are some things to try if it happens repeatedly:

  • Try ensuring that the desk is paired but not connected before using the script.
  • Try increasing the scan-timeout and connection-timeout.

Connection / commands are slow

  • Try reducing the connection-timeout. I have found that it can work well set to just 1 second. You may find that a low connection timeout results in failed connections sometimes though.
  • Use the server mode. Run the script once with --server which will start a persistent server and maintain a connection to the desk. Then when sending commands (like --move-to sit or --move-to 800) just add the additional argument --forward to forward the command to the server. The server should already have a connection so the desk should respond much quicker.

Error message "abort" on MacOS

On MacOS the process may quit with a vague message like abort. This could be because the application running the process doesn't have access to Bluetooth. To provide access, open System Preferences -> Security & Privacy -> Privacy -> Bluetooth and drag the application running the process into the list (eg. Terminal or iTerm2). More info at the bleak issue

Scanning and connection issues on MacOS 12 (Monterey)

There was a bug with MacOS 12 that prevents connecting to bluetooth devices with this script see this issue or this bleak issue for more info.

You should update to MacOS 12.3 which fixes this issue.

Desk movement stuttering

Try lowering the move_command_period config value.

Recipes

There is a page with a few examples of different ways to use the script: RECIPES

Development

Install the dependencies with poetry:

poetry install

Then you can run the script with:

poetry run python -m linak_controller.main <command>

You can also install the project in editable/development mode with:

pip install -e .

To build the project for publishing run:

./scripts/build

And to publish the project to PyPi run:

./scripts/publish

Projects using this project

Other useful projects that make use of this one:

Attribution

Some ideas stolen from:

  • idasen-controller by @pfilipp for working out the functionality of the REFERENCE_INPUT characteristic which allows more accurate movement.
  • linak_bt_desk by @anetczuk (forked from @zewelor) for general information (particularly the initialisation though)

linak-controller's People

Contributors

jktjkt avatar joshuacameron avatar rcambrj avatar rhyst avatar ryancastro avatar smailzhu avatar subraizada3 avatar tomsb avatar voruti avatar zheaoli avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

linak-controller's Issues

No luck with Linak DPG1C

I've been trying a number of repo's on Github to get my Linak DPG1C working with no luck so far.

After getting this application up and running I'm able to successfully connect to the desk and can retrieve the desk height with no issue.

However when using the -sit command nothing happens and the python script sits there waiting.

I've had the same issue with other Idasen applications from Github. I'm guessing maybe my Linak controller must be using a different payload or something, even though the service and characteristic UUID's match exactly to what's in the code.

Is there a way to see some verbose logging of what's happening when Gatt sends the up/down commands to the BT controller?

Even better, can you explain how I might be able to sniff the packets that control it using the official Linak app (as that works without issue)?

Thanks for any assistance

PSA: Python 3.11 users need to use version 2.0.2rc3 of this package

Hi,
aiohttp 3.8.1, which is a dependency of 2.0.1 version marked as current on PyPI, has problems building on Python 3.11 - aio-libs/aiohttp#6600. It's fixed in 3.8.3 of the library and in 2.0.2 version of this project.
Unfortunately, version 2.0.2 is marked as a pre-release on PyPI and thus pip install idasen-controller installs 2.0.1, which fails to install (the dependency cannot be built), so I had to spend a while checking the problem.
Maybe it's time to bump the current version to 2.0.2?

If you need a small test report: seems to be working on Fedora 37 with Python 3.11 and Ikea Idasen desk.

Cannot move desk to base height

Hi,
just noticed I cannot move my desk to the base height of 640mm (read from desk), "script ends with struct.error: ushort format requires 0 <= number <= 65535". Not sure if this is expected behavior, but from the description of the base_height option I think it isn't. Script version is latest 1.1.0 but same behavior on 1.0.3. Running it on Raspberry Pi 3, Raspberry OS (Bookworm), and on Linak's DPG1C controller.

I suppose after implementing the kaml's fix this script works for me reliably for a few days. Previously I could only read from the desk, now I can move it nicely 👍🏼

pi@malina:~ $ linak-controller --mac-address ED:72:E6:E6:EB:0F --move-to 640
Connected ED:72:E6:E6:EB:0F
Capabilities: {'memSize': 4, 'autoUp': True, 'autoDown': True, 'bleAllow': True, 'hasDisplay': True, 'hasLight': True}
User ID: 01 2f d6 d1 2a f0 81 c9 61 14 68 c1 f6 19 2f 0b e8
Base height from desk: 640mm
Height: 900mm
Moving to height: 640

Something unexpected went wrong:
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.11/site-packages/linak_controller/main.py", line 210, in main
await run_command(client)
File "/home/pi/.local/lib/python3.11/site-packages/linak_controller/main.py", line 97, in run_command
await Desk.move_to(client, target)
File "/home/pi/.local/lib/python3.11/site-packages/linak_controller/desk.py", line 62, in move_to
data = ReferenceInputService.encode_height(target.value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pi/.local/lib/python3.11/site-packages/linak_controller/gatt.py", line 81, in encode_height
return bytearray(struct.pack("<H", int(height)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
struct.error: ushort format requires 0 <= number <= 65535

Is there a way to make the server auto-run and persist on macOS?

Thanks for a very useful piece of software!

I'm trying to get idasen-controller --server to launch at login, and persist. The prescribed method of doing this is by using a launchd.plist, which I have installed into ~/Library/LaunchAgents:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.example.idasen-controller</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/bin/idasen-controller</string>
		<string>--server</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
	<key>StandardOutPath</key>
	<string>/Users/jay/Library/Logs/idasen-controller.log</string>
	<key>StandardErrorPath</key>
	<string>/Users/jay//Library/Logs/idasen-controller.log</string>
</dict>
</plist>

Unfortunately, this generates a SIGABRT when run by launchd, but running idasen-controller --server in Terminal works just fine.

I tried specifying all the different process types, by adding a directive like this:

<key>ProcessType</key>
<string>Background</string>

And cycling through the other possible values of adaptive and interactive to no avail.

Unfortunately, I'm not even getting anything in StdOut or StdErr.

launchd describes its expectations ( man launchd.plist) as follows:

     Daemons or agents managed by launchd are expected to behave certain ways.

     A daemon or agent launched by launchd MUST NOT do the following in the process directly launched by launchd:

           •   Call daemon(3).
           •   Do the moral equivalent of daemon(3) by calling fork(2) and have the parent process exit(3) or _exit(2).

     A launchd daemon or agent should not perform the following as part of its initialization, as launchd will always
     implicitly perform them on behalf of the process.

           •   Redirect stdio(3) to /dev/null.

     A launchd daemon or agent need not perform the following as part of its initialization, since launchd can perform them on
     the process' behalf with the appropriate launchd.plist keys specified.

           •   Setup the user ID or group ID.
           •   Setup the working directory.
           •   chroot(2)
           •   setsid(2)
           •   Close "stray" file descriptors.
           •   Setup resource limits with setrlimit(2).
           •   Setup priority with setpriority(2).

Does launching idasen-controller --server meet launchd's expectations?

Error: module 'asyncio' has no attribute 'exceptions'.

Fiddling with the controler.
If I use the app to wake up the controller, I can now move the desk up and down, to any height asked. It handles limits (soft and hard) graciously, but now throws the following at the end:
_ERROR:root:A message handler raised an exception: module 'asyncio' has no attribute 'exceptions'.
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.7/site-packages/idasen_controller/main.py", line 246, in move_to
move_done.set_result(True)
asyncio.base_futures.InvalidStateError: invalid state

Bleak - Desk not Found

After upgrading to the latest master with Bleak, my desk is not found any more. Not sure what I can do to help investigating.

Steps

$ git checkout master
$ python3 main.py
Scanning - Desk FB:B4:B9:72:4C:F9 Not Found
Could not find desk FB:B4:B9:72:4C:F9

$ git checkout nobleak # commit defc47 with overridden mac_address in config.yaml
$ python3 main.py
Current height: 724.2mm

Environment

  • Linux (Solus 4.1)
  • Python 3.7.7
  • bleak-0.9.1

org.bluez.Error.AuthenticationRejected

Not really an Issue with this software, but I cannot seem to connect to the desk.

I followed these instructions because initially I could not find the desk the normal way: https://wiki.archlinux.org/title/Bluetooth#Device_does_not_show_up_in_scan

However, now when I try to pair I get the following errror:

[bluetooth]# pair .............
Attempting to pair with ...................
Failed to pair: org.bluez.Error.AuthenticationRejected

Does anyone else have this?

cant connect to the desk on multiple platforms

currently i have multiple os's on the same machine "windows & mac", if i tried to control the desk from one platform, the other wont work.

am not using the server option as its unrelaible, at least to the desk as the opend connection have to be forcefully killed other wise the desk will never accept connection to any other host including the phone app.

atm to get around that, i have to unpair/pair the desk to the host everytime i want to control it or i would get error like Something unexpected went wrong:

so is there anyway to get around that and make the desk connectable through mutiple platforms/devices ?

Running as server and receiving values in client

Would it (in theory) be possible to have the server return the values to the client?
That would allow us to just keep a server up for each desk and still let the clients handle value changes etc.

"Scanning - Desk Found" then quit

I'm getting this problem when using 1.0.5:

$ idasen-controller
Scanning - Desk Found

it seems to be fixed in 1.0.6 but that isn't published to PyPi, please could you publish it?

$ gco a7794fdbe19471b892341cd746696c16f5c6f697
Note: switching to 'a7794fdbe19471b892341cd746696c16f5c6f697'.
HEAD is now at a7794fd Bump version to 1.0.5

$ python3 idasen_controller/main.py
Scanning - Desk Found

$ gco master
Previous HEAD position was a7794fd Bump version to 1.0.5
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

$ python3 idasen_controller/main.py
Scanning - Desk Found
Connected 244C39A2-8606-4F3E-89C0-9076694D765F
Height: 1255mm
Disconnected

Controlling a DPG1C - crash when reaching limits, followed by a shift in displayed height

Hi there,
I have managed to control a DPG1C. I can monitor and and send to sit and stand position.
The heights displayed are not consistent with the height displayed on the DGP1C's screen or the app. Until a crash occurs, the offset seems consistent.
The problem is when the desk reaches a limit, physical or soft (limit set in the DPG1C itself), the script crashes, and the heights have sometimes a new offset.

When crashing the output is:

Height: 1196mm Target: 1092mm Speed: 0mm/s
Traceback (most recent call last):
File "/home/pi/.local/bin/idasen-controller", line 10, in
sys.exit(init())
File "/home/pi/.local/lib/python3.7/site-packages/idasen_controller/main.py", line 393, in init
asyncio.run(main())
File "/usr/lib/python3.7/asyncio/runners.py", line 43, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
return future.result()
File "/home/pi/.local/lib/python3.7/site-packages/idasen_controller/main.py", line 387, in main
await stop(client)
File "/home/pi/.local/lib/python3.7/site-packages/idasen_controller/main.py", line 201, in stop
await client.write_gatt_char(UUID_COMMAND, COMMAND_STOP)
File "/home/pi/.local/lib/python3.7/site-packages/bleak/backends/bluezdbus/client.py", line 815, in write_gatt_char
assert_reply(reply)
File "/home/pi/.local/lib/python3.7/site-packages/bleak/backends/bluezdbus/utils.py", line 23, in assert_reply
raise BleakDBusError(reply.error_name, reply.body)
bleak.exc.BleakDBusError: [org.bluez.Error.NotPermitted] Write acquired

DPG1C Support

Hi! I am not able to move my desk. When I try to run e.g. idasen-controller --sit my raspberry pi connects and gets the right height but nothing happens:

Connected D7:78:43:EE:CF:34
Height: 885mm
Timed out while waiting for desk
Final height: 885mm (Target: 683mm)
Disconnected

Is there anything I need to be aware of when using the script on a raspberry pi or with a linak desk?

support multiple heights / automatic heights

I use 2 standing heights (with and without balance board), but this would also be nice for situations where a desk is shared by two people. I imagine it wouldn't take much to make the height names in the config file generic so multiples could be added (sit1, sit2, user1-sit, etc).

My Linak DPG controller (looks identical to idåsen) also supports 4 saved memory points, so it would be cool if there was a way for idasen-controller to access these for positioning to them. It looks like https://github.com/anetczuk/LinakDeskApp (via https://github.com/anetczuk/linak_bt_desk/) supports these features.

Characteristic 99fa0002-338a-1024-8a49-009c0215f78a was not found

Hello, thanks for your work!

I am trying to use your program on my IKEA IDÅSEN desk, but it seems to not like something with it.
Having looked at the bluetooth services provided, 99fa0002-338a-1024-8a49-009c0215f78a is not one of them.

Am I running some odd firmware or something?

$ idasen-controller --mac-address 58:cb:52:4d:4a:4c
Connected 58:CB:52:4D:4A:4C
Traceback (most recent call last):
  File "/home/bluecmd/.local/bin/idasen-controller", line 8, in <module>
    sys.exit(init())
  File "/home/bluecmd/.local/lib/python3.8/site-packages/idasen_controller/main.py", line 416, in init
    asyncio.run(main())
  File "/usr/lib/python3.8/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "/home/bluecmd/.local/lib/python3.8/site-packages/idasen_controller/main.py", line 410, in main
    await stop(client)
  File "/home/bluecmd/.local/lib/python3.8/site-packages/idasen_controller/main.py", line 177, in stop
    await client.write_gatt_char(UUID_COMMAND, COMMAND_STOP)
  File "/home/bluecmd/.local/lib/python3.8/site-packages/bleak/backends/bluezdbus/client.py", line 587, in write_gatt_char
    raise BleakError("Characteristic {0} was not found!".format(char_specifier))
bleak.exc.BleakError: Characteristic 99fa0002-338a-1024-8a49-009c0215f78a was not found!

Thanks!

Unable to control Linak Desk - CBD6S Control Unit

I have a desk bought from a commercial furniture here in NZ, they are custom built to the user's requirements. It's not an "off the shelf" unit like an Ikea.

Note: I understand this is not on the list of supported devices. Just hoping there is something I can do to help get support added

The desk is using the following:

  • Linak CBD6SP00020A-009 (Controller)
  • LINAK DL6101BNE650560 (3-stage lifting column)
  • LINAK DPG1C32-000006 (Control)

I have SSH'd into my Homebridge where I have the idasen-controller setup and I tried to move the desk
stargate@stargate:~ $ idasen-controller --move-to 750 Connected E9:76:49:9A:08:DA Height: 794mm Moving to height: 750 Height: 794mm Speed: 0mm/s Final height: 794mm (Target: 750mm) Disconnected

I can also see when using BlueZ that the desk is connected:
[bluetooth]# paired-devices Device E9:76:49:9A:08:DA DESK 2266

config.yaml
mac_address: E9:76:49:9A:08:DA base_height: 690 movement_range: 340 scan_timeout: 5 connection_timeout: 10 movement_timeout: 30 adapter_name: hci0 server_address: "127.0.0.1" server_port: 9123 favourites: sit: 690 stand: 1030
IMG_7058
IMG_7059
IMG_7060

windows installation

Hey there, any ideas how to fix this?

C:\Users\Eugene-PC>pip3 install idasen-controller
Collecting idasen-controller
Using cached idasen_controller-1.0.5-py3-none-any.whl (11 kB)
Requirement already satisfied: attrs==20.3.0 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (20.3.0)
Requirement already satisfied: incremental==17.5.0 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (17.5.0)
Collecting Twisted==20.3.0
Using cached Twisted-20.3.0.tar.bz2 (3.1 MB)
Requirement already satisfied: idna==3.1 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (3.1)
Collecting txdbus==1.1.2
Using cached txdbus-1.1.2.tar.gz (61 kB)
Requirement already satisfied: zope.interface==5.2.0 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (5.2.0)
Requirement already satisfied: PyHamcrest==2.0.2 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (2.0.2)
Requirement already satisfied: six==1.15.0 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (1.15.0)
Collecting bleak==0.10.0
Using cached bleak-0.10.0-py2.py3-none-any.whl (103 kB)
Collecting PyYAML==5.4.1
Using cached PyYAML-5.4.1-cp39-cp39-win_amd64.whl (213 kB)
Requirement already satisfied: constantly==15.1.0 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (15.1.0)
Collecting appdirs==1.4.4
Using cached appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
Requirement already satisfied: hyperlink==21.0.0 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (21.0.0)
Requirement already satisfied: Automat==20.2.0 in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from idasen-controller) (20.2.0)
Collecting pythonnet
Using cached pythonnet-2.5.2.tar.gz (1.9 MB)
Requirement already satisfied: setuptools in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from zope.interface==5.2.0->idasen-controller) (56.0.0)
Requirement already satisfied: pycparser in c:\users\eugene-pc\appdata\local\programs\python\python39\lib\site-packages (from pythonnet->bleak==0.10.0->idasen-controller) (2.20)
Using legacy 'setup.py install' for Twisted, since package 'wheel' is not installed.
Using legacy 'setup.py install' for txdbus, since package 'wheel' is not installed.
Using legacy 'setup.py install' for pythonnet, since package 'wheel' is not installed.
Installing collected packages: Twisted, pythonnet, txdbus, PyYAML, bleak, appdirs, idasen-controller
Running setup.py install for Twisted ... error
ERROR: Command errored out with exit status 1:
command: 'c:\users\eugene-pc\appdata\local\programs\python\python39\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\Eugene-PC\AppData\Local\Temp\pip-install-clmldcg\twisted_7ec3ca1963ec436fa5d8a8eaf5e52e0f\setup.py'"'"'; file='"'"'C:\Users\Eugene-PC\AppData\Local\Temp\pip-install-clmldcg\twisted_7ec3ca1963ec436fa5d8a8eaf5e52e0f\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record 'C:\Users\Eugene-PC\AppData\Local\Temp\pip-record-i117nomr\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\eugene-pc\appdata\local\programs\python\python39\Include\Twisted'
cwd: C:\Users\Eugene-PC\AppData\Local\Temp\pip-install-clmldcg\twisted_7ec3ca1963ec436fa5d8a8eaf5e52e0f
Complete output (984 lines):
running install
running build
running build_py
creating build
creating build\lib.win-amd64-3.9
creating build\lib.win-amd64-3.9\twisted
copying src\twisted\copyright.py -> build\lib.win-amd64-3.9\twisted
copying src\twisted\plugin.py -> build\lib.win-amd64-3.9\twisted
copying src\twisted_version.py -> build\lib.win-amd64-3.9\twisted
copying src\twisted_init
.py -> build\lib.win-amd64-3.9\twisted
copying src\twisted_main
.py -> build\lib.win-amd64-3.9\twisted
creating build\lib.win-amd64-3.9\twisted\application
copying src\twisted\application\app.py -> build\lib.win-amd64-3.9\twisted\application
copying src\twisted\application\internet.py -> build\lib.win-amd64-3.9\twisted\application
copying src\twisted\application\reactors.py -> build\lib.win-amd64-3.9\twisted\application
copying src\twisted\application\service.py -> build\lib.win-amd64-3.9\twisted\application
copying src\twisted\application\strports.py -> build\lib.win-amd64-3.9\twisted\application
copying src\twisted\application_init
.py -> build\lib.win-amd64-3.9\twisted\application
creating build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\avatar.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\checkers.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\endpoints.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\error.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\interfaces.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\ls.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\manhole.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\manhole_ssh.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\manhole_tap.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\mixin.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\recvline.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\stdio.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\tap.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\telnet.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\ttymodes.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch\unix.py -> build\lib.win-amd64-3.9\twisted\conch
copying src\twisted\conch_init_.py -> build\lib.win-amd64-3.9\twisted\conch
creating build\lib.win-amd64-3.9\twisted\cred
copying src\twisted\cred\checkers.py -> build\lib.win-amd64-3.9\twisted\cred
copying src\twisted\cred\credentials.py -> build\lib.win-amd64-3.9\twisted\cred
copying src\twisted\cred\error.py -> build\lib.win-amd64-3.9\twisted\cred
copying src\twisted\cred\portal.py -> build\lib.win-amd64-3.9\twisted\cred
copying src\twisted\cred\strcred.py -> build\lib.win-amd64-3.9\twisted\cred
copying src\twisted\cred_digest.py -> build\lib.win-amd64-3.9\twisted\cred
copying src\twisted\cred_init_.py -> build\lib.win-amd64-3.9\twisted\cred
creating build\lib.win-amd64-3.9\twisted\enterprise
copying src\twisted\enterprise\adbapi.py -> build\lib.win-amd64-3.9\twisted\enterprise
copying src\twisted\enterprise_init_.py -> build\lib.win-amd64-3.9\twisted\enterprise
creating build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\abstract.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\address.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\asyncioreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\base.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\cfreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\default.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\defer.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\endpoints.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\epollreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\error.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\fdesc.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\gireactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\glib2reactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\gtk2reactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\gtk3reactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\inotify.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\interfaces.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\kqreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\main.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\pollreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\posixbase.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\process.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\protocol.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\pyuisupport.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\reactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\selectreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\serialport.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\ssl.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\stdio.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\task.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\tcp.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\testing.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\threads.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\tksupport.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\udp.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\unix.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\utils.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\win32eventreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\wxreactor.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet\wxsupport.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_baseprocess.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_dumbwin32proc.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_glibbase.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_idna.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_newtls.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_pollingfile.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_posixserialport.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_posixstdio.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_producer_helpers.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_resolver.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_signals.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_sslverify.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_threadedselect.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_win32serialport.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_win32stdio.py -> build\lib.win-amd64-3.9\twisted\internet
copying src\twisted\internet_init_.py -> build\lib.win-amd64-3.9\twisted\internet
creating build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_buffer.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_capture.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_file.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_filter.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_flatten.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_format.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_global.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_io.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_json.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_legacy.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_levels.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_logger.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_observer.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_stdlib.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_util.py -> build\lib.win-amd64-3.9\twisted\logger
copying src\twisted\logger_init_.py -> build\lib.win-amd64-3.9\twisted\logger
creating build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail\imap4.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail\interfaces.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail\pop3.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail\pop3client.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail\protocols.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail\relay.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail\smtp.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail_cred.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail_except.py -> build\lib.win-amd64-3.9\twisted\mail
copying src\twisted\mail_init_.py -> build\lib.win-amd64-3.9\twisted\mail
creating build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\authority.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\cache.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\client.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\common.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\dns.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\error.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\hosts.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\resolve.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\root.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\secondary.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\server.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\srvconnect.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names\tap.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names_rfc1982.py -> build\lib.win-amd64-3.9\twisted\names
copying src\twisted\names_init_.py -> build\lib.win-amd64-3.9\twisted\names
creating build\lib.win-amd64-3.9\twisted\pair
copying src\twisted\pair\ethernet.py -> build\lib.win-amd64-3.9\twisted\pair
copying src\twisted\pair\ip.py -> build\lib.win-amd64-3.9\twisted\pair
copying src\twisted\pair\raw.py -> build\lib.win-amd64-3.9\twisted\pair
copying src\twisted\pair\rawudp.py -> build\lib.win-amd64-3.9\twisted\pair
copying src\twisted\pair\testing.py -> build\lib.win-amd64-3.9\twisted\pair
copying src\twisted\pair\tuntap.py -> build\lib.win-amd64-3.9\twisted\pair
copying src\twisted\pair_init_.py -> build\lib.win-amd64-3.9\twisted\pair
creating build\lib.win-amd64-3.9\twisted\persisted
copying src\twisted\persisted\aot.py -> build\lib.win-amd64-3.9\twisted\persisted
copying src\twisted\persisted\crefutil.py -> build\lib.win-amd64-3.9\twisted\persisted
copying src\twisted\persisted\dirdbm.py -> build\lib.win-amd64-3.9\twisted\persisted
copying src\twisted\persisted\sob.py -> build\lib.win-amd64-3.9\twisted\persisted
copying src\twisted\persisted\styles.py -> build\lib.win-amd64-3.9\twisted\persisted
copying src\twisted\persisted_init_.py -> build\lib.win-amd64-3.9\twisted\persisted
creating build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\cred_anonymous.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\cred_file.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\cred_memory.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\cred_sshkeys.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\cred_unix.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_conch.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_core.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_ftp.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_inet.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_names.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_portforward.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_reactors.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_runner.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_socks.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_trial.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_web.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins\twisted_words.py -> build\lib.win-amd64-3.9\twisted\plugins
copying src\twisted\plugins_init_.py -> build\lib.win-amd64-3.9\twisted\plugins
creating build\lib.win-amd64-3.9\twisted\positioning
copying src\twisted\positioning\base.py -> build\lib.win-amd64-3.9\twisted\positioning
copying src\twisted\positioning\ipositioning.py -> build\lib.win-amd64-3.9\twisted\positioning
copying src\twisted\positioning\nmea.py -> build\lib.win-amd64-3.9\twisted\positioning
copying src\twisted\positioning_sentence.py -> build\lib.win-amd64-3.9\twisted\positioning
copying src\twisted\positioning_init_.py -> build\lib.win-amd64-3.9\twisted\positioning
creating build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\amp.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\basic.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\dict.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\finger.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\ftp.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\htb.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\ident.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\loopback.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\memcache.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\pcp.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\policies.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\portforward.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\postfix.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\sip.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\socks.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\stateful.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\tls.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols\wire.py -> build\lib.win-amd64-3.9\twisted\protocols
copying src\twisted\protocols_init_.py -> build\lib.win-amd64-3.9\twisted\protocols
creating build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\compat.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\components.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\constants.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\context.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\deprecate.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\failure.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\fakepwd.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\filepath.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\formmethod.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\htmlizer.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\lockfile.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\log.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\logfile.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\modules.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\monkey.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\procutils.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\randbytes.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\rebuild.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\reflect.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\release.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\roots.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\runtime.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\sendmsg.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\shortcut.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\syslog.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\systemd.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\text.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\threadable.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\threadpool.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\url.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\urlpath.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\usage.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\util.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\versions.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\win32.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\zippath.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python\zipstream.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_appdirs.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_inotify.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_oldstyle.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_release.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_setup.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_shellcomp.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_textattributes.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_tzhelper.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_url.py -> build\lib.win-amd64-3.9\twisted\python
copying src\twisted\python_init_.py -> build\lib.win-amd64-3.9\twisted\python
creating build\lib.win-amd64-3.9\twisted\runner
copying src\twisted\runner\inetd.py -> build\lib.win-amd64-3.9\twisted\runner
copying src\twisted\runner\inetdconf.py -> build\lib.win-amd64-3.9\twisted\runner
copying src\twisted\runner\inetdtap.py -> build\lib.win-amd64-3.9\twisted\runner
copying src\twisted\runner\procmon.py -> build\lib.win-amd64-3.9\twisted\runner
copying src\twisted\runner\procmontap.py -> build\lib.win-amd64-3.9\twisted\runner
copying src\twisted\runner_init_.py -> build\lib.win-amd64-3.9\twisted\runner
creating build\lib.win-amd64-3.9\twisted\scripts
copying src\twisted\scripts\htmlizer.py -> build\lib.win-amd64-3.9\twisted\scripts
copying src\twisted\scripts\trial.py -> build\lib.win-amd64-3.9\twisted\scripts
copying src\twisted\scripts\twistd.py -> build\lib.win-amd64-3.9\twisted\scripts
copying src\twisted\scripts_twistd_unix.py -> build\lib.win-amd64-3.9\twisted\scripts
copying src\twisted\scripts_twistw.py -> build\lib.win-amd64-3.9\twisted\scripts
copying src\twisted\scripts_init_.py -> build\lib.win-amd64-3.9\twisted\scripts
creating build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread\banana.py -> build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread\flavors.py -> build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread\interfaces.py -> build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread\jelly.py -> build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread\pb.py -> build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread\publish.py -> build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread\util.py -> build\lib.win-amd64-3.9\twisted\spread
copying src\twisted\spread_init_.py -> build\lib.win-amd64-3.9\twisted\spread
creating build\lib.win-amd64-3.9\twisted\tap
copying src\twisted\tap\ftp.py -> build\lib.win-amd64-3.9\twisted\tap
copying src\twisted\tap\portforward.py -> build\lib.win-amd64-3.9\twisted\tap
copying src\twisted\tap\socks.py -> build\lib.win-amd64-3.9\twisted\tap
copying src\twisted\tap_init_.py -> build\lib.win-amd64-3.9\twisted\tap
creating build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\crash_test_dummy.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\iosim.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\mock_win32process.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\myrebuilder1.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\myrebuilder2.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\plugin_basic.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\plugin_extra1.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\plugin_extra2.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_cmdline.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_echoer.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_fds.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_getargv.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_getenv.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_linger.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_reader.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_signal.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_stdinreader.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_tester.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_tty.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\process_twisted.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\proto_helpers.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\reflect_helper_IE.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\reflect_helper_VE.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\reflect_helper_ZDE.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\ssl_helpers.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_consumer.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_halfclose.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_hostpeer.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_lastwrite.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_loseconn.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_producer.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_write.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\stdio_test_writeseq.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\testutils.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_abstract.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_adbapi.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_amp.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_application.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_compat.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_context.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_cooperator.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_defer.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_defgen.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_dict.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_dirdbm.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_error.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_factories.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_failure.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_fdesc.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_finger.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_formmethod.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_ftp.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_ftp_options.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_htb.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_ident.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_internet.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_iosim.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_iutils.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_lockfile.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_log.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_logfile.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_loopback.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_main.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_memcache.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_modules.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_monkey.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_news.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_nooldstyle.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_paths.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_pcp.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_persisted.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_plugin.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_policies.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_postfix.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_process.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_protocols.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_randbytes.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_rebuild.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_reflect.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_roots.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_shortcut.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_sip.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_sob.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_socks.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_ssl.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_sslverify.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_stateful.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_stdio.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_strerror.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_strports.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_task.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_tcp.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_tcp_internals.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_text.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_threadable.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_threadpool.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_threads.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_tpfile.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_twistd.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_twisted.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_udp.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_unix.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_usage.py -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test_init_.py -> build\lib.win-amd64-3.9\twisted\test
creating build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial\itrial.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial\reporter.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial\runner.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial\unittest.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial\util.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial_asyncrunner.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial_asynctest.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial_synctest.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial_init_.py -> build\lib.win-amd64-3.9\twisted\trial
copying src\twisted\trial_main_.py -> build\lib.win-amd64-3.9\twisted\trial
creating build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\client.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\demo.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\distrib.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\domhelpers.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\error.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\guard.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\html.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\http.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\http_headers.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\iweb.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\microdom.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\proxy.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\resource.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\rewrite.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\script.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\server.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\static.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\sux.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\tap.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\template.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\twcgi.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\util.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\vhost.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\wsgi.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web\xmlrpc.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web_element.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web_flatten.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web_http2.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web_newclient.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web_responses.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web_stan.py -> build\lib.win-amd64-3.9\twisted\web
copying src\twisted\web_init_.py -> build\lib.win-amd64-3.9\twisted\web
creating build\lib.win-amd64-3.9\twisted\words
copying src\twisted\words\ewords.py -> build\lib.win-amd64-3.9\twisted\words
copying src\twisted\words\iwords.py -> build\lib.win-amd64-3.9\twisted\words
copying src\twisted\words\service.py -> build\lib.win-amd64-3.9\twisted\words
copying src\twisted\words\tap.py -> build\lib.win-amd64-3.9\twisted\words
copying src\twisted\words\xmpproutertap.py -> build\lib.win-amd64-3.9\twisted\words
copying src\twisted\words_init_.py -> build\lib.win-amd64-3.9\twisted\words
creating build\lib.win-amd64-3.9\twisted_threads
copying src\twisted_threads_convenience.py -> build\lib.win-amd64-3.9\twisted_threads
copying src\twisted_threads_ithreads.py -> build\lib.win-amd64-3.9\twisted_threads
copying src\twisted_threads_memory.py -> build\lib.win-amd64-3.9\twisted_threads
copying src\twisted_threads_pool.py -> build\lib.win-amd64-3.9\twisted_threads
copying src\twisted_threads_team.py -> build\lib.win-amd64-3.9\twisted_threads
copying src\twisted_threads_threadworker.py -> build\lib.win-amd64-3.9\twisted_threads
copying src\twisted_threads_init_.py -> build\lib.win-amd64-3.9\twisted_threads
creating build\lib.win-amd64-3.9\twisted\application\runner
copying src\twisted\application\runner_exit.py -> build\lib.win-amd64-3.9\twisted\application\runner
copying src\twisted\application\runner_pidfile.py -> build\lib.win-amd64-3.9\twisted\application\runner
copying src\twisted\application\runner_runner.py -> build\lib.win-amd64-3.9\twisted\application\runner
copying src\twisted\application\runner_init_.py -> build\lib.win-amd64-3.9\twisted\application\runner
creating build\lib.win-amd64-3.9\twisted\application\test
copying src\twisted\application\test\test_internet.py -> build\lib.win-amd64-3.9\twisted\application\test
copying src\twisted\application\test\test_service.py -> build\lib.win-amd64-3.9\twisted\application\test
copying src\twisted\application\test_init_.py -> build\lib.win-amd64-3.9\twisted\application\test
creating build\lib.win-amd64-3.9\twisted\application\twist
copying src\twisted\application\twist_options.py -> build\lib.win-amd64-3.9\twisted\application\twist
copying src\twisted\application\twist_twist.py -> build\lib.win-amd64-3.9\twisted\application\twist
copying src\twisted\application\twist_init_.py -> build\lib.win-amd64-3.9\twisted\application\twist
creating build\lib.win-amd64-3.9\twisted\application\runner\test
copying src\twisted\application\runner\test\test_exit.py -> build\lib.win-amd64-3.9\twisted\application\runner\test
copying src\twisted\application\runner\test\test_pidfile.py -> build\lib.win-amd64-3.9\twisted\application\runner\test
copying src\twisted\application\runner\test\test_runner.py -> build\lib.win-amd64-3.9\twisted\application\runner\test
copying src\twisted\application\runner\test_init_.py -> build\lib.win-amd64-3.9\twisted\application\runner\test
creating build\lib.win-amd64-3.9\twisted\application\twist\test
copying src\twisted\application\twist\test\test_options.py -> build\lib.win-amd64-3.9\twisted\application\twist\test copying src\twisted\application\twist\test\test_twist.py -> build\lib.win-amd64-3.9\twisted\application\twist\test
copying src\twisted\application\twist\test_init_.py -> build\lib.win-amd64-3.9\twisted\application\twist\test
creating build\lib.win-amd64-3.9\twisted\conch\client
copying src\twisted\conch\client\agent.py -> build\lib.win-amd64-3.9\twisted\conch\client
copying src\twisted\conch\client\connect.py -> build\lib.win-amd64-3.9\twisted\conch\client
copying src\twisted\conch\client\default.py -> build\lib.win-amd64-3.9\twisted\conch\client
copying src\twisted\conch\client\direct.py -> build\lib.win-amd64-3.9\twisted\conch\client
copying src\twisted\conch\client\knownhosts.py -> build\lib.win-amd64-3.9\twisted\conch\client
copying src\twisted\conch\client\options.py -> build\lib.win-amd64-3.9\twisted\conch\client
copying src\twisted\conch\client_init_.py -> build\lib.win-amd64-3.9\twisted\conch\client
creating build\lib.win-amd64-3.9\twisted\conch\insults
copying src\twisted\conch\insults\helper.py -> build\lib.win-amd64-3.9\twisted\conch\insults
copying src\twisted\conch\insults\insults.py -> build\lib.win-amd64-3.9\twisted\conch\insults
copying src\twisted\conch\insults\text.py -> build\lib.win-amd64-3.9\twisted\conch\insults
copying src\twisted\conch\insults\window.py -> build\lib.win-amd64-3.9\twisted\conch\insults
copying src\twisted\conch\insults_init_.py -> build\lib.win-amd64-3.9\twisted\conch\insults
creating build\lib.win-amd64-3.9\twisted\conch\openssh_compat
copying src\twisted\conch\openssh_compat\factory.py -> build\lib.win-amd64-3.9\twisted\conch\openssh_compat
copying src\twisted\conch\openssh_compat\primes.py -> build\lib.win-amd64-3.9\twisted\conch\openssh_compat
copying src\twisted\conch\openssh_compat_init_.py -> build\lib.win-amd64-3.9\twisted\conch\openssh_compat
creating build\lib.win-amd64-3.9\twisted\conch\scripts
copying src\twisted\conch\scripts\cftp.py -> build\lib.win-amd64-3.9\twisted\conch\scripts
copying src\twisted\conch\scripts\ckeygen.py -> build\lib.win-amd64-3.9\twisted\conch\scripts
copying src\twisted\conch\scripts\conch.py -> build\lib.win-amd64-3.9\twisted\conch\scripts
copying src\twisted\conch\scripts\tkconch.py -> build\lib.win-amd64-3.9\twisted\conch\scripts
copying src\twisted\conch\scripts_init_.py -> build\lib.win-amd64-3.9\twisted\conch\scripts
creating build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\address.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\agent.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\channel.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\common.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\connection.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\factory.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\filetransfer.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\forwarding.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\keys.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\service.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\session.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\sexpy.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\transport.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh\userauth.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh_kex.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
copying src\twisted\conch\ssh_init_.py -> build\lib.win-amd64-3.9\twisted\conch\ssh
creating build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\keydata.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\loopback.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_address.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_agent.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_cftp.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_channel.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_checkers.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_ckeygen.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_conch.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_connection.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_default.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_endpoints.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_filetransfer.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_forwarding.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_helper.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_insults.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_keys.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_knownhosts.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_manhole.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_manhole_tap.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_mixin.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_openssh_compat.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_recvline.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_scripts.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_session.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_ssh.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_tap.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_telnet.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_text.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_transport.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_unix.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_userauth.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test\test_window.py -> build\lib.win-amd64-3.9\twisted\conch\test
copying src\twisted\conch\test_init_.py -> build\lib.win-amd64-3.9\twisted\conch\test
creating build\lib.win-amd64-3.9\twisted\conch\ui
copying src\twisted\conch\ui\ansi.py -> build\lib.win-amd64-3.9\twisted\conch\ui
copying src\twisted\conch\ui\tkvt100.py -> build\lib.win-amd64-3.9\twisted\conch\ui
copying src\twisted\conch\ui_init_.py -> build\lib.win-amd64-3.9\twisted\conch\ui
creating build\lib.win-amd64-3.9\twisted\cred\test
copying src\twisted\cred\test\test_cramauth.py -> build\lib.win-amd64-3.9\twisted\cred\test
copying src\twisted\cred\test\test_cred.py -> build\lib.win-amd64-3.9\twisted\cred\test
copying src\twisted\cred\test\test_digestauth.py -> build\lib.win-amd64-3.9\twisted\cred\test
copying src\twisted\cred\test\test_simpleauth.py -> build\lib.win-amd64-3.9\twisted\cred\test
copying src\twisted\cred\test\test_strcred.py -> build\lib.win-amd64-3.9\twisted\cred\test
copying src\twisted\cred\test_init_.py -> build\lib.win-amd64-3.9\twisted\cred\test
creating build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor\abstract.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor\const.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor\interfaces.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor\reactor.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor\setup.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor\tcp.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor\udp.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\iocpreactor_init_.py -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
creating build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\connectionmixins.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\fakeendpoint.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\modulehelpers.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\process_cli.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\process_connectionlost.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\process_gireactornocompat.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\process_helper.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\reactormixins.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_abstract.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_address.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_asyncioreactor.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_base.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_baseprocess.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_core.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_coroutines.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_default.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_endpoints.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_epollreactor.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_error.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_fdset.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_filedescriptor.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_gireactor.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_glibbase.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_inlinecb.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_inotify.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_iocp.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_kqueuereactor.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_main.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_newtls.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_pollingfile.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_posixbase.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_posixprocess.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_process.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_protocol.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_resolver.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_serialport.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_sigchld.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_socket.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_stdio.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_tcp.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_testing.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_threads.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_time.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_tls.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_udp.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_udp_internals.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_unix.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_win32events.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test\test_win32serialport.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test_posixifaces.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test_win32ifaces.py -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test_init_.py -> build\lib.win-amd64-3.9\twisted\internet\test
creating build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_buffer.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_capture.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_file.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_filter.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_flatten.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_format.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_global.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_io.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_json.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_legacy.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_levels.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_logger.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_observer.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_stdlib.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test\test_util.py -> build\lib.win-amd64-3.9\twisted\logger\test
copying src\twisted\logger\test_init_.py -> build\lib.win-amd64-3.9\twisted\logger\test
creating build\lib.win-amd64-3.9\twisted\mail\scripts
copying src\twisted\mail\scripts\mailmail.py -> build\lib.win-amd64-3.9\twisted\mail\scripts
creating build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\mail\test\pop3testserver.py -> build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\mail\test\test_imap.py -> build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\mail\test\test_mailmail.py -> build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\mail\test\test_pop3.py -> build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\mail\test\test_pop3client.py -> build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\mail\test\test_smtp.py -> build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\mail\test_init_.py -> build\lib.win-amd64-3.9\twisted\mail\test
creating build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_cache.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_client.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_common.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_dns.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_examples.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_hosts.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_names.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_resolve.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_rfc1982.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_rootresolve.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_server.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_srvconnect.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_tap.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test\test_util.py -> build\lib.win-amd64-3.9\twisted\names\test
copying src\twisted\names\test_init_.py -> build\lib.win-amd64-3.9\twisted\names\test
creating build\lib.win-amd64-3.9\twisted\pair\test
copying src\twisted\pair\test\test_ethernet.py -> build\lib.win-amd64-3.9\twisted\pair\test
copying src\twisted\pair\test\test_ip.py -> build\lib.win-amd64-3.9\twisted\pair\test
copying src\twisted\pair\test\test_rawudp.py -> build\lib.win-amd64-3.9\twisted\pair\test
copying src\twisted\pair\test\test_tuntap.py -> build\lib.win-amd64-3.9\twisted\pair\test
copying src\twisted\pair\test_init_.py -> build\lib.win-amd64-3.9\twisted\pair\test
creating build\lib.win-amd64-3.9\twisted\persisted\test
copying src\twisted\persisted\test\test_styles.py -> build\lib.win-amd64-3.9\twisted\persisted\test
copying src\twisted\persisted\test_init_.py -> build\lib.win-amd64-3.9\twisted\persisted\test
creating build\lib.win-amd64-3.9\twisted\positioning\test
copying src\twisted\positioning\test\receiver.py -> build\lib.win-amd64-3.9\twisted\positioning\test
copying src\twisted\positioning\test\test_base.py -> build\lib.win-amd64-3.9\twisted\positioning\test
copying src\twisted\positioning\test\test_nmea.py -> build\lib.win-amd64-3.9\twisted\positioning\test
copying src\twisted\positioning\test\test_sentence.py -> build\lib.win-amd64-3.9\twisted\positioning\test
copying src\twisted\positioning\test_init_.py -> build\lib.win-amd64-3.9\twisted\positioning\test
creating build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_exceptions.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_info.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_interfaces.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_parser.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_v1parser.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_v2parser.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_wrapper.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
copying src\twisted\protocols\haproxy_init_.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy
creating build\lib.win-amd64-3.9\twisted\protocols\test
copying src\twisted\protocols\test\test_basic.py -> build\lib.win-amd64-3.9\twisted\protocols\test
copying src\twisted\protocols\test\test_tls.py -> build\lib.win-amd64-3.9\twisted\protocols\test
copying src\twisted\protocols\test_init_.py -> build\lib.win-amd64-3.9\twisted\protocols\test
creating build\lib.win-amd64-3.9\twisted\protocols\haproxy\test
copying src\twisted\protocols\haproxy\test\test_parser.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy\test
copying src\twisted\protocols\haproxy\test\test_v1parser.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy\test
copying src\twisted\protocols\haproxy\test\test_v2parser.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy\test
copying src\twisted\protocols\haproxy\test\test_wrapper.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy\test copying src\twisted\protocols\haproxy\test_init_.py -> build\lib.win-amd64-3.9\twisted\protocols\haproxy\test
creating build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\deprecatedattributes.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\modules_helpers.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\pullpipe.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_appdirs.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_components.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_constants.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_deprecate.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_dist3.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_fakepwd.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_htmlizer.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_inotify.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_release.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_runtime.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_sendmsg.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_setup.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_shellcomp.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_syslog.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_systemd.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_textattributes.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_tzhelper.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_url.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_urlpath.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_util.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_versions.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_zippath.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test\test_zipstream.py -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\python\test_init_.py -> build\lib.win-amd64-3.9\twisted\python\test
creating build\lib.win-amd64-3.9\twisted\runner\test
copying src\twisted\runner\test\test_inetdconf.py -> build\lib.win-amd64-3.9\twisted\runner\test
copying src\twisted\runner\test\test_procmon.py -> build\lib.win-amd64-3.9\twisted\runner\test
copying src\twisted\runner\test\test_procmontap.py -> build\lib.win-amd64-3.9\twisted\runner\test
copying src\twisted\runner\test_init_.py -> build\lib.win-amd64-3.9\twisted\runner\test
creating build\lib.win-amd64-3.9\twisted\scripts\test
copying src\twisted\scripts\test\test_scripts.py -> build\lib.win-amd64-3.9\twisted\scripts\test
copying src\twisted\scripts\test_init_.py -> build\lib.win-amd64-3.9\twisted\scripts\test
creating build\lib.win-amd64-3.9\twisted\spread\test
copying src\twisted\spread\test\test_banana.py -> build\lib.win-amd64-3.9\twisted\spread\test
copying src\twisted\spread\test\test_jelly.py -> build\lib.win-amd64-3.9\twisted\spread\test
copying src\twisted\spread\test\test_pb.py -> build\lib.win-amd64-3.9\twisted\spread\test
copying src\twisted\spread\test\test_pbfailure.py -> build\lib.win-amd64-3.9\twisted\spread\test
copying src\twisted\spread\test_init_.py -> build\lib.win-amd64-3.9\twisted\spread\test
creating build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\detests.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\erroneous.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\mockcustomsuite.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\mockcustomsuite2.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\mockcustomsuite3.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\mockdoctest.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\moduleself.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\moduletest.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\novars.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\ordertests.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\packages.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\sample.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\scripttest.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\skipping.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\suppression.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_assertions.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_asyncassertions.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_deferred.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_doctest.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_keyboard.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_loader.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_log.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_output.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_plugins.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_pyunitcompat.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_reporter.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_runner.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_script.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_suppression.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_testcase.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_tests.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_util.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\test_warning.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test\weird.py -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\trial\test_init_.py -> build\lib.win-amd64-3.9\twisted\trial\test
creating build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\distreporter.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\disttrial.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\managercommands.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\options.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\worker.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\workercommands.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\workerreporter.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist\workertrial.py -> build\lib.win-amd64-3.9\twisted\trial_dist
copying src\twisted\trial_dist_init_.py -> build\lib.win-amd64-3.9\twisted\trial_dist
creating build\lib.win-amd64-3.9\twisted\trial_dist\test
copying src\twisted\trial_dist\test\test_distreporter.py -> build\lib.win-amd64-3.9\twisted\trial_dist\test
copying src\twisted\trial_dist\test\test_disttrial.py -> build\lib.win-amd64-3.9\twisted\trial_dist\test
copying src\twisted\trial_dist\test\test_options.py -> build\lib.win-amd64-3.9\twisted\trial_dist\test
copying src\twisted\trial_dist\test\test_worker.py -> build\lib.win-amd64-3.9\twisted\trial_dist\test
copying src\twisted\trial_dist\test\test_workerreporter.py -> build\lib.win-amd64-3.9\twisted\trial_dist\test
copying src\twisted\trial_dist\test\test_workertrial.py -> build\lib.win-amd64-3.9\twisted\trial_dist\test
copying src\twisted\trial_dist\test_init_.py -> build\lib.win-amd64-3.9\twisted\trial_dist\test
creating build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\injectionhelpers.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\requesthelper.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_agent.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_cgi.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_client.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_distrib.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_domhelpers.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_error.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_flatten.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_html.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_http.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_http2.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_httpauth.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_http_headers.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_newclient.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_proxy.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_resource.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_script.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_stan.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_static.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_tap.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_template.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_util.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_vhost.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_web.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_webclient.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_web__responses.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_wsgi.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_xml.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test\test_xmlrpc.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test_util.py -> build\lib.win-amd64-3.9\twisted\web\test
copying src\twisted\web\test_init_.py -> build\lib.win-amd64-3.9\twisted\web\test
creating build\lib.win-amd64-3.9\twisted\web_auth
copying src\twisted\web_auth\basic.py -> build\lib.win-amd64-3.9\twisted\web_auth
copying src\twisted\web_auth\digest.py -> build\lib.win-amd64-3.9\twisted\web_auth
copying src\twisted\web_auth\wrapper.py -> build\lib.win-amd64-3.9\twisted\web_auth
copying src\twisted\web_auth_init_.py -> build\lib.win-amd64-3.9\twisted\web_auth
creating build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im\baseaccount.py -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im\basechat.py -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im\basesupport.py -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im\interfaces.py -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im\ircsupport.py -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im\locals.py -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im\pbsupport.py -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\im_init_.py -> build\lib.win-amd64-3.9\twisted\words\im
creating build\lib.win-amd64-3.9\twisted\words\protocols
copying src\twisted\words\protocols\irc.py -> build\lib.win-amd64-3.9\twisted\words\protocols
copying src\twisted\words\protocols_init_.py -> build\lib.win-amd64-3.9\twisted\words\protocols
creating build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_basechat.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_basesupport.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_domish.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_irc.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_ircsupport.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_irc_service.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabberclient.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabbercomponent.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabbererror.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabberjid.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabberjstrports.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabbersasl.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabbersaslmechanisms.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabberxmlstream.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_jabberxmppstringprep.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_service.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_tap.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_xishutil.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_xmlstream.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_xmpproutertap.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test\test_xpath.py -> build\lib.win-amd64-3.9\twisted\words\test
copying src\twisted\words\test_init_.py -> build\lib.win-amd64-3.9\twisted\words\test
creating build\lib.win-amd64-3.9\twisted\words\xish
copying src\twisted\words\xish\domish.py -> build\lib.win-amd64-3.9\twisted\words\xish
copying src\twisted\words\xish\utility.py -> build\lib.win-amd64-3.9\twisted\words\xish
copying src\twisted\words\xish\xmlstream.py -> build\lib.win-amd64-3.9\twisted\words\xish
copying src\twisted\words\xish\xpath.py -> build\lib.win-amd64-3.9\twisted\words\xish
copying src\twisted\words\xish\xpathparser.py -> build\lib.win-amd64-3.9\twisted\words\xish
copying src\twisted\words\xish_init_.py -> build\lib.win-amd64-3.9\twisted\words\xish
creating build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\client.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\component.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\error.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\ijabber.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\jid.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\jstrports.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\sasl.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\sasl_mechanisms.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\xmlstream.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber\xmpp_stringprep.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
copying src\twisted\words\protocols\jabber_init_.py -> build\lib.win-amd64-3.9\twisted\words\protocols\jabber
creating build\lib.win-amd64-3.9\twisted_threads\test
copying src\twisted_threads\test\test_convenience.py -> build\lib.win-amd64-3.9\twisted_threads\test
copying src\twisted_threads\test\test_memory.py -> build\lib.win-amd64-3.9\twisted_threads\test
copying src\twisted_threads\test\test_team.py -> build\lib.win-amd64-3.9\twisted_threads\test
copying src\twisted_threads\test\test_threadworker.py -> build\lib.win-amd64-3.9\twisted_threads\test
copying src\twisted_threads\test_init_.py -> build\lib.win-amd64-3.9\twisted_threads\test
running egg_info
writing src\Twisted.egg-info\PKG-INFO
writing dependency_links to src\Twisted.egg-info\dependency_links.txt
writing entry points to src\Twisted.egg-info\entry_points.txt
writing requirements to src\Twisted.egg-info\requires.txt
writing top-level names to src\Twisted.egg-info\top_level.txt
adding license file 'LICENSE' (matched pattern 'LICEN[CS]E*')
reading manifest file 'src\Twisted.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files matching '.misc' found under directory 'src\twisted'
warning: no previously-included files matching '
.bugfix' found under directory 'src\twisted'
warning: no previously-included files matching '.doc' found under directory 'src\twisted'
warning: no previously-included files matching '
.feature' found under directory 'src\twisted'
warning: no previously-included files matching '.removal' found under directory 'src\twisted'
warning: no previously-included files matching 'NEWS' found under directory 'src\twisted'
warning: no previously-included files matching 'README' found under directory 'src\twisted'
warning: no previously-included files matching 'newsfragments' found under directory 'src\twisted'
warning: no previously-included files found matching 'src\twisted\topfiles\CREDITS'
warning: no previously-included files found matching 'src\twisted\topfiles\ChangeLog.Old'
warning: no previously-included files found matching 'pyproject.toml'
warning: no previously-included files found matching 'codecov.yml'
warning: no previously-included files found matching 'appveyor.yml'
warning: no previously-included files found matching '.coveralls.yml'
warning: no previously-included files found matching '.circleci'
warning: no previously-included files matching '
' found under directory '.circleci'
no previously-included directories found matching 'bin'
no previously-included directories found matching 'admin'
no previously-included directories found matching '.travis'
no previously-included directories found matching '.github'
warning: no previously-included files found matching 'docs\historic\2003'
warning: no previously-included files matching '*' found under directory 'docs\historic\2003'
writing manifest file 'src\Twisted.egg-info\SOURCES.txt'
copying src\twisted\python\twisted-completion.zsh -> build\lib.win-amd64-3.9\twisted\python
creating build\lib.win-amd64-3.9\twisted\python_pydoctortemplates
copying src\twisted\python_pydoctortemplates\common.html -> build\lib.win-amd64-3.9\twisted\python_pydoctortemplates
copying src\twisted\python_pydoctortemplates\index.html -> build\lib.win-amd64-3.9\twisted\python_pydoctortemplates
copying src\twisted\python_pydoctortemplates\summary.html -> build\lib.win-amd64-3.9\twisted\python_pydoctortemplates
copying src\twisted\test\cert.pem.no_trailing_newline -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\key.pem.no_trailing_newline -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\server.pem -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\test\test_defer.py.3only -> build\lib.win-amd64-3.9\twisted\test
copying src\twisted\internet\iocpreactor\notes.txt -> build\lib.win-amd64-3.9\twisted\internet\iocpreactor
copying src\twisted\internet\test_awaittests.py.3only -> build\lib.win-amd64-3.9\twisted\internet\test
copying src\twisted\internet\test_yieldfromtests.py.3only -> build\lib.win-amd64-3.9\twisted\internet\test
creating build\lib.win-amd64-3.9\twisted\internet\test\fake_CAs
copying src\twisted\internet\test\fake_CAs\chain.pem -> build\lib.win-amd64-3.9\twisted\internet\test\fake_CAs
copying src\twisted\internet\test\fake_CAs\not-a-certificate -> build\lib.win-amd64-3.9\twisted\internet\test\fake_CAs
copying src\twisted\internet\test\fake_CAs\thing1.pem -> build\lib.win-amd64-3.9\twisted\internet\test\fake_CAs
copying src\twisted\internet\test\fake_CAs\thing2-duplicate.pem -> build\lib.win-amd64-3.9\twisted\internet\test\fake_CAs
copying src\twisted\internet\test\fake_CAs\thing2.pem -> build\lib.win-amd64-3.9\twisted\internet\test\fake_CAs
copying src\twisted\mail\test\rfc822.message -> build\lib.win-amd64-3.9\twisted\mail\test
copying src\twisted\python\test_deprecatetests.py.3only -> build\lib.win-amd64-3.9\twisted\python\test
copying src\twisted\trial\test_assertiontests.py.3only -> build\lib.win-amd64-3.9\twisted\trial\test
copying src\twisted\words\im\instancemessenger.glade -> build\lib.win-amd64-3.9\twisted\words\im
copying src\twisted\words\xish\xpathparser.g -> build\lib.win-amd64-3.9\twisted\words\xish
running build_ext
building 'twisted.test.raiser' extension
creating build\temp.win-amd64-3.9
creating build\temp.win-amd64-3.9\Release
creating build\temp.win-amd64-3.9\Release\src
creating build\temp.win-amd64-3.9\Release\src\twisted
creating build\temp.win-amd64-3.9\Release\src\twisted\test
D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DWIN32=1 -Ic:\users\eugene-pc\appdata\local\programs\python\python39\include -Ic:\users\eugene-pc\appdata\local\programs\python\python39\include -ID:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\cppwinrt /Tcsrc/twisted/test/raiser.c /Fobuild\temp.win-amd64-3.9\Release\src/twisted/test/raiser.obj
raiser.c
D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:c:\users\eugene-pc\appdata\local\programs\python\python39\libs /LIBPATH:c:\users\eugene-pc\appdata\local\programs\python\python39\PCbuild\amd64 /LIBPATH:D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\lib\x64 /LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64 /LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64 /EXPORT:PyInit_raiser build\temp.win-amd64-3.9\Release\src/twisted/test/raiser.obj /OUT:build\lib.win-amd64-3.9\twisted\test\raiser.cp39-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.9\Release\src/twisted/test\raiser.cp39-win_amd64.lib
Creating library build\temp.win-amd64-3.9\Release\src/twisted/test\raiser.cp39-win_amd64.lib and object build\temp.win-amd64-3.9\Release\src/twisted/test\raiser.cp39-win_amd64.exp
Generating code
Finished generating code
building 'twisted.internet.iocpreactor.iocpsupport' extension
creating build\temp.win-amd64-3.9\Release\src\twisted\internet
creating build\temp.win-amd64-3.9\Release\src\twisted\internet\iocpreactor
creating build\temp.win-amd64-3.9\Release\src\twisted\internet\iocpreactor\iocpsupport
D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DWIN32=1 -Ic:\users\eugene-pc\appdata\local\programs\python\python39\include -Ic:\users\eugene-pc\appdata\local\programs\python\python39\include -ID:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\cppwinrt /Tcsrc/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c /Fobuild\temp.win-amd64-3.9\Release\src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.obj
iocpsupport.c
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(2229): warning C4047: '=': '__pyx_t_11iocpsupport_HANDLE' differs in levels of indirection from 'HANDLE'
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(2377): warning C4022: 'CreateIoCompletionPort': pointer mismatch for actual parameter 1
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(2377): warning C4022: 'CreateIoCompletionPort': pointer mismatch for actual parameter 2
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(2377): warning C4047: '=': '__pyx_t_11iocpsupport_HANDLE' differs in levels of indirection from 'HANDLE'
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(2492): warning C4022: 'GetQueuedCompletionStatus': pointer mismatch for actual parameter 1
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(2838): warning C4022: 'PostQueuedCompletionStatus': pointer mismatch for actual parameter 1
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(2949): warning C4022: 'CloseHandle': pointer mismatch for actual parameter 1
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(3292): warning C4996: 'PyObject_AsReadBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(4932): warning C4996: 'PyObject_AsWriteBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(5149): warning C4996: 'PyObject_AsReadBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(5786): warning C4996: 'PyObject_AsWriteBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(6146): warning C4996: 'PyObject_AsWriteBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(6164): warning C4996: 'PyObject_AsWriteBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(6182): warning C4996: 'PyObject_AsWriteBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(6509): warning C4996: 'PyObject_AsReadBuffer': deprecated in 3.0
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(7614): error C2039: 'tp_print': is not a member of '_typeobject'
c:\users\eugene-pc\appdata\local\programs\python\python39\include\cpython/object.h(193): note: see declaration of '_typeobject'
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(8421): warning C4996: '_PyUnicode_get_wstr_length': deprecated in 3.3
src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c(8437): warning C4996: '_PyUnicode_get_wstr_length': deprecated in 3.3
error: command 'D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\cl.exe' failed with exit code 2
----------------------------------------
ERROR: Command errored out with exit status 1: 'c:\users\eugene-pc\appdata\local\programs\python\python39\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\Eugene-PC\AppData\Local\Temp\pip-install-_clmldcg\twisted_7ec3ca1963ec436fa5d8a8eaf5e52e0f\setup.py'"'"'; file='"'"'C:\Users\Eugene-PC\AppData\Local\Temp\pip-install-_clmldcg\twisted_7ec3ca1963ec436fa5d8a8eaf5e52e0f\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record 'C:\Users\Eugene-PC\AppData\Local\Temp\pip-record-i117nomr\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\eugene-pc\appdata\local\programs\python\python39\Include\Twisted' Check the logs for full command output.

Reducing\changing the speed of the motors before stop.

Dear rhyst,

First of all I want to thank you for the amazing project that you did, it is very useful and practical, no needs to buy an additional expensive panel to be able to adjust the height without holding the buttons.

You mention in the Desk Internals, Behaviour section on the main page that "If no move command is received the motors slows down towards the end and then stops". however my motor seems to not slow down before stop, they just stop very abruptly and it is annoying because the monitor and the speakers on my desk shake a little after such stops. this behavior is not related to your project because I have the same problem no matter if I use windows app or the original panel that came with the desk to adjust the height.

I was wondering if there is a way to control the speed of the motors with your code to slow down the motors before stop or to just reduce the speed somehow to reduce the stop impact.

Thanks in advance.

"abort"

I'm struggling to run this, perhaps you can help me?

pip3 install idasen-controller
DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Requirement already satisfied: idasen-controller in /usr/local/lib/python3.9/site-packages (1.0.5)
Requirement already satisfied: attrs==20.3.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (20.3.0)
Requirement already satisfied: idna==3.1 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (3.1)
Requirement already satisfied: Automat==20.2.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (20.2.0)
Requirement already satisfied: Twisted==20.3.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (20.3.0)
Requirement already satisfied: PyHamcrest==2.0.2 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (2.0.2)
Requirement already satisfied: txdbus==1.1.2 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (1.1.2)
Requirement already satisfied: zope.interface==5.2.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (5.2.0)
Requirement already satisfied: hyperlink==21.0.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (21.0.0)
Requirement already satisfied: six==1.15.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (1.15.0)
Requirement already satisfied: appdirs==1.4.4 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (1.4.4)
Requirement already satisfied: incremental==17.5.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (17.5.0)
Requirement already satisfied: constantly==15.1.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (15.1.0)
Requirement already satisfied: bleak==0.10.0 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (0.10.0)
Requirement already satisfied: PyYAML==5.4.1 in /usr/local/lib/python3.9/site-packages (from idasen-controller) (5.4.1)
Requirement already satisfied: pyobjc-core in /usr/local/lib/python3.9/site-packages (from bleak==0.10.0->idasen-controller) (7.3)
Requirement already satisfied: pyobjc-framework-CoreBluetooth in /usr/local/lib/python3.9/site-packages (from bleak==0.10.0->idasen-controller) (7.3)
Requirement already satisfied: pyobjc-framework-libdispatch in /usr/local/lib/python3.9/site-packages (from bleak==0.10.0->idasen-controller) (7.3)
Requirement already satisfied: setuptools in /usr/local/lib/python3.9/site-packages (from zope.interface==5.2.0->idasen-controller) (57.0.0)
Requirement already satisfied: pyobjc-framework-Cocoa>=7.3 in /usr/local/lib/python3.9/site-packages (from pyobjc-framework-CoreBluetooth->bleak==0.10.0->idasen-controller) (7.3)
idasen-controller
[1]    4255 abort      idasen-controller
python3 idasen_controller/main.py
[1]    4229 abort      python3 idasen_controller/main.py

I'm not super familiar with python, but I've managed to get this stack trace, maybe it's helpful?

python3 -X dev idasen_controller/main.py
Fatal Python error: Aborted

Thread 0x00000001142f5e00 (most recent call first):
  File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 316 in wait
  File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 574 in wait
  File "/usr/local/lib/python3.9/site-packages/bleak/backends/corebluetooth/CentralManagerDelegate.py", line 91 in init
  File "/usr/local/lib/python3.9/site-packages/bleak/backends/corebluetooth/scanner.py", line 37 in __init__
  File "~/projects/idasen/idasen-controller/idasen_controller/main.py", line 279 in scan
  File "~/projects/idasen/idasen-controller/idasen_controller/main.py", line 301 in connect
  File "~/projects/idasen/idasen-controller/idasen_controller/main.py", line 401 in main
  File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/events.py", line 80 in _run
  File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_events.py", line 1882 in _run_once
  File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_events.py", line 596 in run_forever
  File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_events.py", line 629 in run_until_complete
  File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/runners.py", line 44 in run
  File "~/projects/idasen/idasen-controller/idasen_controller/main.py", line 418 in init
  File "~/projects/idasen/idasen-controller/idasen_controller/main.py", line 423 in <module>
[1]    4275 killed     python3 -X dev idasen_controller/main.py

and line 316 of threading.py looks like this:

        if not self._is_owned():
            raise RuntimeError("cannot wait on un-acquired lock")
        waiter = _allocate_lock()
        waiter.acquire()
        self._waiters.append(waiter)
        saved_state = self._release_save()
        gotit = False
        try:    # restore state no matter what (e.g., KeyboardInterrupt)
            if timeout is None:
                waiter.acquire()
                gotit = True
            else:
                if timeout > 0:
                    gotit = waiter.acquire(True, timeout) <==== 316
                else:
                    gotit = waiter.acquire(False)
            return gotit
        finally:
            self._acquire_restore(saved_state)
            if not gotit:
                try:
                    self._waiters.remove(waiter)
                except ValueError:
                    pass

license

This is the first project I found, that controls my Idasen desk correctly 🙌 Thank's for making this public 🚀

I would like to create a simple HTTP server for my smart home system and was wondering what license this project is under and if I could take some of your code to use it in my server implementation?

Adding a license to this project would be great 🙌

Best regards,
Max

Weird error message: No notify session started

Hi, I love the work you did. I am planning to use it for some nice home automation.

Right now I'm experiencing one problem. The desk is working, but most of the times (after moving the desk which works) it ends with:

Something unexpected went wrong:
[org.bluez.Error.Failed] no notify session started

Do you know what I could do to prevent this error? Do you need other information? Thank you!

Locking computer stops table from moving

First of all, thank you for this script.

I use KDE running on Manjaro as well as the Linak DPG1C. The script runs fine until I lock my PC. After locking and unlocking, executing the script produces the following output:

Connected EA:69:XX:CE:XX:9C
Height:  641mm
Moving to favourite height: stand
Height:  641mm Speed:  0mm/s
Final height:  641mm (Target: 1116mm)
Disconnected 

I have only been able to fix it by connecting the phone app to my desk, moving it a centimeter, disconnecting, and executing the script again:

Connected EA:69:XX:CE:XX:9C
Height:  641mm
Moving to favourite height: stand
Height:  644mm Speed: 25mm/s
Height:  660mm Speed: 61mm/s
Height:  681mm Speed: 62mm/s
Height:  706mm Speed: 62mm/s
Height:  728mm Speed: 62mm/s
Height:  750mm Speed: 62mm/s
Height:  772mm Speed: 62mm/s
Height:  796mm Speed: 62mm/s
Height:  818mm Speed: 62mm/s
Height:  839mm Speed: 62mm/s
Height:  862mm Speed: 62mm/s
Height:  886mm Speed: 62mm/s
Height:  911mm Speed: 62mm/s
Height:  934mm Speed: 62mm/s
Height:  957mm Speed: 62mm/s
Height:  978mm Speed: 62mm/s
Height: 1001mm Speed: 62mm/s
Height: 1022mm Speed: 62mm/s
Height: 1045mm Speed: 62mm/s
Height: 1068mm Speed: 62mm/s
Height: 1091mm Speed: 62mm/s
Height: 1114mm Speed: 62mm/s
Height: 1116mm Speed:  0mm/s
Final height: 1116mm (Target: 1116mm)
Disconnected

Slow down the motor by itself at the end avoiding shaking of the desk

My problem is that my heavy monitor shakes a lot when movement stops. It isn't soft stop unfortunately.

I'm reading description and

If no move command is recieved in that second then the motor slows down towards the end and then stops.
If you send a move command late, then there will some stuttering as the desk may have already started
to slow the motors. You can stop the motion part way through by sending a stop command though
it sometimes does not respond immediately. 

so I assume that it can be done in a way where motor slows down itself softly, with proper moving commands timing.

This is feature request about implementing such soft stop if possible.

Thanks!

Error in bleak: invalid syntax

@aienabled

May I ask you what did you get it working on Windows, through the Windows Command line?

I tried to use git bash seem better but still getting errors.... I am not familiar with python it seems the exception is from colon symbol...variable cannot be declared with type..?
my python version
2020-11-26 18_02_11-__x_ikea_idasen-controller

When I run python main.py
2020-11-26 18_01_58-__x_ikea_idasen-controller

And I looked at the source code of bleak...
2020-11-26 18_01_50-client py -  C__Users_Roy_AppData_Local_Temp_client py  - D__Python_Python35-32_

Really want to get this working on Windows.

Originally posted by @zeroarst in #4 (comment)

Desk not found by idasen-controller (but paired with bluetooth) on Raspberry Pi

Hi again!

So my Raspberry Pi is paired to my desk but when I type idasen-controller I get the error Could not find desk e0:83:79:xx:xx:xx (I added it to the config.yaml). I confirmed that I am paired by typing bluetoothctl at the command line to open the Bluetooth Controller and then typed info e0:83:79:xx:xx:xx which tells me:

Device E0:83:79:xx:xx:xx (random)
        Name: Standing Desk
        Alias: Standing Desk
        Paired: yes
        Trusted: yes
        Blocked: no
        Connected: yes
        LegacyPairing: no
        UUID: Generic Access Profile    (xxxxxxxxxxxxxx)
        UUID: Generic Attribute Profile (xxxxxxxxxxxxxx)
        UUID: Vendor specific           (xxxxxxxxxxxxxx)
        UUID: Vendor specific           (xxxxxxxxxxxxxx)
        UUID: Vendor specific           (xxxxxxxxxxxxxx)
        UUID: Vendor specific           (xxxxxxxxxxxxxx)

(I scrambled some info above with 'xxx'; I'm not sure what is safe to include online)

finds desk, but nothing happens

When I run it, "python main.py --stand"
it says Scaning, and then Desk Found
Prints "connected + mac address"
then prints the height
and then nothing.

Read/set favorite values from the desk provided from the Linak Desk Control app

I just got an Ikea Idasen and I also installed the Desk Control app from Linak that is also compatible. The app allows you to set 3 predefined profiles and after that, you can use the controls on the desk to "snap" to those profiles while also allowing you to move between them.

Would "setting" profiles be something you're interested in implementing? Maybe even getting those profiles from the desk itself (like you're reading the height) so they are always in sync.

Let's say the desk is at height 741. You have a set a profile from the app to height 758 and another at 1152.
You pull the button up so you start raising the desk. It will keep rising until it reaches 758, then wait a second. If the button is still pressed, it will start rising again until it reaches 1152, at which point it will wait for a second again.

It would be really cool to have 3 profiles from the config sync with the 3 profiles set from the app, as well as being able to set new values from the CLI which can then be used with the hardware controls as well. This way, I can either control the desk and the profiles via it's hardware buttons, my personal laptop, or my phone when I'm using the work laptop.

Bleak connection issue from OrangePi at current version

Hello,

I've had an issue connecting to the Idasen desk from orange pi zero 2. It was identical to the problem described in #50. I solved the problem by changing the bleak version to 0.16.0. If there's no reason to keep it at 0.14.2, I would suggest updating this dependency.

If you'd like to investigate further, here are logs from bleak (0.14.2) when the problem occurs:

2023-02-03 20:09:59,638 bleak.backends.bluezdbus.client DEBUG: Connecting to device @ D1:C4:1A:04:ED:72 with hci0
2023-02-03 20:09:59,687 bleak.backends.bluezdbus.scanner DEBUG: cached devices: {'/org/bluez/hci0/dev_D1_C4_1A_04_ED_72': {'Address': 'D1:C4:1A:04:ED:72', 'AddressType': 'random', 'Name': 'Desk 0786', 'Alias': 'Desk 0786', 'Paired': True, 'Trusted': False, 'Blocked': False, 'LegacyPairing': False, 'Connected': False, 'UUIDs': ['00001800-0000-1000-8000-00805f9b34fb', '00001801-0000-1000-8000-00805f9b34fb', '99fa0001-338a-1024-8a49-009c0215f78a', '99fa0010-338a-1024-8a49-009c0215f78a', '99fa0020-338a-1024-8a49-009c0215f78a', '99fa0030-338a-1024-8a49-009c0215f78a'], 'Adapter': '/org/bluez/hci0', 'ServicesResolved': False}}
2023-02-03 20:09:59,712 bleak.backends.bluezdbus.scanner DEBUG: received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0): ['org.bluez.Adapter1', {'Discovering': <dbus_next.signature.Variant ('b', True)>}, []]
2023-02-03 20:09:59,745 bleak.backends.bluezdbus.scanner DEBUG: received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_D1_C4_1A_04_ED_72): ['org.bluez.Device1', {'RSSI': <dbus_next.signature.Variant ('n', -68)>, 'TxPower': <dbus_next.signature.Variant ('n', -8)>}, []]
2023-02-03 20:09:59,753 bleak.backends.bluezdbus.scanner DEBUG: received D-Bus signal: org.freedesktop.DBus.ObjectManager.InterfacesAdded (/): ['/org/bluez/hci0/dev_53_44_D3_03_B6_46', {'org.freedesktop.DBus.Introspectable': {}, 'org.bluez.Device1': {'Address': <dbus_next.signature.Variant ('s', 53:44:D3:03:B6:46)>, 'AddressType': <dbus_next.signature.Variant ('s', random)>, 'Alias': <dbus_next.signature.Variant ('s', 53-44-D3-03-B6-46)>, 'Paired': <dbus_next.signature.Variant ('b', False)>, 'Trusted': <dbus_next.signature.Variant ('b', False)>, 'Blocked': <dbus_next.signature.Variant ('b', False)>, 'LegacyPairing': <dbus_next.signature.Variant ('b', False)>, 'RSSI': <dbus_next.signature.Variant ('n', -57)>, 'Connected': <dbus_next.signature.Variant ('b', False)>, 'UUIDs': <dbus_next.signature.Variant ('as', [])>, 'Adapter': <dbus_next.signature.Variant ('o', /org/bluez/hci0)>, 'ManufacturerData': <dbus_next.signature.Variant ('a{qv}', {6: <dbus_next.signature.Variant ('ay', b'\x01\t \x02j\xb9?\xaf\xf3[U=\x87Q:\x0f\xcf\xac\x02\xa6\xf3{^p\xfdaC')>})>, 'ServicesResolved': <dbus_next.signature.Variant ('b', False)>}, 'org.freedesktop.DBus.Properties': {}}]
2023-02-03 20:09:59,762 bleak.backends.bluezdbus.scanner DEBUG: received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_53_44_D3_03_B6_46): ['org.bluez.Device1', {}, ['RSSI']]
2023-02-03 20:09:59,765 bleak.backends.bluezdbus.scanner DEBUG: received D-Bus signal: org.freedesktop.DBus.ObjectManager.InterfacesRemoved (/): ['/org/bluez/hci0/dev_53_44_D3_03_B6_46', ['org.freedesktop.DBus.Properties', 'org.freedesktop.DBus.Introspectable', 'org.bluez.Device1']]
2023-02-03 20:09:59,767 bleak.backends.bluezdbus.scanner DEBUG: received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_D1_C4_1A_04_ED_72): ['org.bluez.Device1', {}, ['TxPower', 'RSSI']]
2023-02-03 20:09:59,769 bleak.backends.bluezdbus.scanner DEBUG: received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0): ['org.bluez.Adapter1', {'Discovering': <dbus_next.signature.Variant ('b', False)>}, []]
2023-02-03 20:10:00,110 bleak.backends.bluezdbus.client DEBUG: received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_D1_C4_1A_04_ED_72): ['org.bluez.Device1', {'Connected': <dbus_next.signature.Variant ('b', True)>}, []]
2023-02-03 20:10:00,593 bleak.backends.bluezdbus.client DEBUG: Connection successful (/org/bluez/hci0/dev_D1_C4_1A_04_ED_72)
2023-02-03 20:10:00,594 bleak.backends.bluezdbus.client DEBUG: Waiting for ServicesResolved (/org/bluez/hci0/dev_D1_C4_1A_04_ED_72)
2023-02-03 20:10:05,602 bleak.backends.bluezdbus.client DEBUG: _cleanup_all(/org/bluez/hci0/dev_D1_C4_1A_04_ED_72)

Something unexpected went wrong:

I couldn't find anything useful. Seems like it's connecting and throws an error for no reason. Also, every time after running this script, I can see that I am connected to the desk, despite the error (I am not connected before running it).

I believe this issue might be related. I've modified a code to show a traceback and had a very similar error, as described in the issue, in await asyncio.wait_for(self._services_resolved_event.wait(), 5).

Configurable BaseHeight & MaxHeight

Hi there,

I plan to add configurable BaseHeight & MaxHeight to my HomeBridge Plugin.
It would be nice if I could pass these values to your idasen-controller.
The perfect way for me would be with argument flags like these:

Idasen-controller --move-to 850 --base-height 600 --max-height 1300

As it stands right now, when I try to send the desk down to lets say 580mm, your script would prevent that (because it's lower than the desk height).

What is your stance on this?

Edit: I just saw #29 and I think if we could add the max-height as well this could be the perfect solution.

A small lack of precision—a dynamic and/or configurable target height tolerance is necessary

Hello!
For me, the default height tolerance results in overshooting by 8-18 mm. Sometimes it's performing a separate additional drive-up command after stop (e.g. raised to 1198 instead of 1080 mm; stopped around 1080 but then issued another raise command).
Perhaps the tolerance constant in the has_reached_target check should be configurable. I believe no single magic number will be good here as it depends on the drive speed and the drive speed depends on various factors such as the desk load (reportedly Idasen drive speed is two times slower when under a maximum specified load of around 70 kg for EU model) or the drive power.

In my case, changing the constant from 20 to 75 improved precision significantly—it's accurate up to 3 mm now (and consistenly within 1 mm in the most cases) instead of 8-18 mm for both lowering and raising the desk. By the way, the reported peak speed is 62.08 but I'm not sure if it's accurate (perhaps the script should measure the speed itself instead of trusting to the desk Bluetooth reporting?) as it takes 11 seconds to drive from 1080 to 670 mm in my case so the actual speed is around 37 mm/second (though it takes about two seconds to reach the max velocity so the peak speed is definitely higher). Anyway, here is my log after changing the height tolerance constant from 20 to 75:

python main.py --stand
...
Stopping at height: 1074.8mm (target: 1080.0mm)
Stopping at height: 1076.8mm (target: 1080.0mm)
Stopping at height: 1079.2mm (target: 1080.0mm)
...
python main.py
...
Initial height: 1080.9mm
...
python main.py --sit
...
Stopping at height: 675.8mm (target: 670.0mm)
Stopping at height: 673.3mm (target: 670.0mm)
Stopping at height: 671.0mm (target: 670.0mm)
...
python main.py
...
Initial height: 669.7mm

I think for the best precision the height tolerance should depend on the actual desk speed. Plus additional configurable constant.

Additionally, I think logging for every height event would be useful. I've added a line to do this:

print("Current height: {}mm (target: {}mm) speed {}mm/s".format(rawToMM(height), rawToMM(target), rawToSpeed(speed)))

it should be right after these lines:

def _move_to(sender, data):
       global count
       height, speed = struct.unpack("<Hh", data)
       count = count + 1

Also, it would be useful to log the final height after the height adjustment procedure completed so it's no longer necessary to call python main.py to get it.

Regards!

Extra libraries needed

Thanks for publishing this - it is working great so far. Just wanted to make note that I needed the following in order to get this working on my Ubuntu 19 install

sudo apt-get install libdbus-1-dev

I also noticed that you have a py-cairo requirement in your requirements.txt file yet it doesn't seem to be used in the project. To get that to install I had to run sudo apt-get install libcairo2-dev libjpeg-dev libgif-dev (but I suspect I may not have needed all of these maybe only the first). Afterwards I realized it doesn't seem to be used for anything anyway so I wound up removing it.

Cannot install

Hello, I have Python 3.10 installed on a Windows 11 pc but cannot get the installer to complete. I get a lot of errors and one of them is
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/

Bu I cannot install hat version since there is a newer installed

I also get this error..

ERROR: Command errored out with exit status 1:
command: 'C:\Users\UserName\AppData\Local\Programs\Python\Python310\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\UserName\AppData\Local\Temp\pip-install-lvysg19b\twisted_5d5952f5542d4b7fb0e29c24c66611d8\setup.py'"'"'; file='"'"'C:\Users\UserName\AppData\Local\Temp\pip-install-lvysg19b\twisted_5d5952f5542d4b7fb0e29c24c66611d8\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record 'C:\Users\UserName\AppData\Local\Temp\pip-record-dff81iw4\install-record.txt' --single-version-externally-managed --compile --install-headers 'C:\Users\UserName\AppData\Local\Programs\Python\Python310\Include\Twisted'
cwd: C:\Users\UserName\AppData\Local\Temp\pip-install-lvysg19b\twisted_5d5952f5542d4b7fb0e29c24c66611d8\

All this when running installer..

pip3 install idasen-controller

Hope you can help or have some ideas...

Keep connection alive

Hi,

is there a way to always keep the desk connected so that move-commands can be sped up?

Sadly I am using Windows 10, so I don't get the pickling-benefits.

Dockerized version and MQTT wrapper to easily integrate with Home Assistant

Hello!

I wanted to say a tremendous THANK YOU for this script 🙏!

I've spent an entire hackday trying to connect to my desk using many libraries... But none of these worked reliably until I found out your project 🎉 (and I didn't want to buy an ESP32 device to get something reliable up and running with https://github.com/j5lien/esphome-idasen-desk-controller)

My ultimate goal was to be able to have some kind of nice automation built with Home Assistant using the desk (toggle sitting/standing position with an NFC tag, integrate with the crazy good looking lovelace card and have the desk go up automatically for daily standup 😄...). Possibilities are really endless with Home Assistant!

The server mode is 🔥! It allows me to keep the connection up and running at all time

  • avoiding disconnections
  • making the time to respond to a command really fast
  • allowing me to send a monitor command every minute, which will emit the current desk height, which will make Home Assistant consider that the desk is "connected" properly (by avoiding a timeout)

So thank you very much for the outstanding work :)!

In case anyone is interested: https://github.com/maxime1992/linak-2-mqtt

Desk stutters when moving

Hello! I'm trying out the program and I'm finding that the desk tends to move a bit then stop and resume moving, until it reaches the desired height. On the example below, the desk only at times reaches the full speed -62)

This is running on a Raspberry Pi 4 on Python 3.8, through Docker. It's an Ikea Idasen. Is there anything else I can provide to help out?

# idasen-controller --forward --move-to 670
Height:  970mm
Moving to height: 670
Height:  964mm Speed: -33mm/s
Height:  938mm Speed: -62mm/s
Height:  926mm Speed: -37mm/s
Height:  915mm Speed: -37mm/s
Height:  904mm Speed: -34mm/s
Height:  875mm Speed: -62mm/s
Height:  865mm Speed: -35mm/s
Height:  841mm Speed: -62mm/s
Height:  814mm Speed: -62mm/s
Height:  788mm Speed: -62mm/s
Height:  761mm Speed: -62mm/s
Height:  731mm Speed: -62mm/s
Height:  720mm Speed: -36mm/s
Height:  693mm Speed: -62mm/s
Height:  682mm Speed: -35mm/s
Height:  670mm Speed:  0mm/s

Provide an example docker image

Hello 👋

First of all... thank you for the project. I've spent so much time today trying different libs to connect to my desk and none of these worked or were reliable except yours.

I'm trying to dockerize your project, I've noticed that you made a comment at some point mentioning that you built a docker to test from a fresh install: #1 (comment)

Here's what I've got so far:

FROM ubuntu

RUN apt update -y && apt upgrade -y

RUN apt install python3 python3-pip -y

ENV TZ=Europe/Paris

RUN ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone

RUN apt install bluez -y

RUN pip3 install idasen-controller

COPY config.yaml .
COPY run.sh .

and run.sh has the following content:

#!/bin/bash

service dbus start
bluetoothd &

/bin/bash

I wonder if instead of killing bluetoothd on the host and running run.sh there is a way to get the exact config of bluethoothctl from the host as that's where I've got my bluetooth devices... That'd be much cleaner.

Also... It currently doesn't work and I get

root@ubuntu:/# bash run.sh
root@ubuntu:/# idasen-controller --config config.yaml
Traceback (most recent call last):
  File "/usr/local/bin/idasen-controller", line 5, in <module>
    from idasen_controller.main import init
  File "/usr/local/lib/python3.8/dist-packages/idasen_controller/main.py", line 139, in <module>
    config.update(config_file)
TypeError: 'NoneType' object is not iterable

Here's how I've launched the container:

docker build -t bluetooth-project .
docker run -it --rm --privileged --cap-add=SYS_ADMIN --cap-add=NET_ADMIN --net=host bluetooth-project

And from my host:

$ bluetoothctl 
Agent registered
[CHG] Controller XX:XX:XX:XX:XX:XX Pairable: yes
[bluetooth]# devices
Device XX:XX:XX:XX:XX:XX Desk 7734

and from the container

root@ubuntu:/# bluetoothctl 
Waiting to connect to bluetoothd...dbus[10]: arguments to dbus_connection_get_object_path_data() were incorrect, assertion "connection != NULL" failed in file ../../../dbus/dbus-connection.c line 5905.
This is normally a bug in some application using the D-Bus library.

  D-Bus not built with -rdynamic so unable to print a backtrace
Aborted (core dumped)

So clearly something's wrong here...

Any idea? :)

Thanks!

Linak CBD6S Controller

Hi,
i get an lift table with linak motion system and CBD6S Controller on the website they sell for 40€ a bluethooth adapter that says its compatible with my controller unit.
and i'm thinking of to tinker a selfmade Bluethooth / wifi adapter with an esp32 and would ask if its worst the time or not

Windows compatibility

Hello,
as far as I've researched python3-dbus is not available for Windows as it's intended only for Linux and Mac. I wish to know if there is a workaround. If not, perhaps it would be best to mention this in the README file.

Regards!

Installation not working on Raspberry Pi (can't find requirements.txt)

Hi, thanks a lot for putting this script together, looking forward to using it.

On my Raspberry Pi, I first tried to install by typing pip install idasen-controller, however I get the error shown below

Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting idasen-controller
  Downloading https://files.pythonhosted.org/packages/cd/d8/61d788f1661b5f2664ca0026d30d76d6745ffeb7ff55a4c30a95d5fd8f5d/idasen-controller-1.0.2.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-hIWMOj/idasen-controller/setup.py", line 4, in <module>
        with open('requirements.txt') as f:
    IOError: [Errno 2] No such file or directory: 'requirements.txt'
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-hIWMOj/idasen-controller/

How should I proceed?

Many thanks,
Tom

Raspberry Pi Zero - Task exception was never retrieved error

Device: raspberry pi zero
bluetoothctl -v: 5.6.2

Error:

Unhandled Error
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/txdbus/protocol.py", line 140, in dataReceived
    self.rawDBusMessageReceived(raw_msg)
  File "/home/pi/.local/lib/python3.7/site-packages/txdbus/protocol.py", line 266, in rawDBusMessageReceived
    self.signalReceived(m)
  File "/home/pi/.local/lib/python3.7/site-packages/txdbus/client.py", line 642, in signalReceived
    self.router.routeMessage(msig)
  File "/home/pi/.local/lib/python3.7/site-packages/txdbus/router.py", line 128, in routeMessage
    r.match(m)
--- <exception caught here> ---
  File "/home/pi/.local/lib/python3.7/site-packages/txdbus/router.py", line 67, in match
    self.callback(m)
  File "/home/pi/.local/lib/python3.7/site-packages/bleak/backends/bluezdbus/client.py", line 867, in _properties_changed_callback
    message.path, message.body[1]
  File "/home/pi/.local/lib/python3.7/site-packages/bleak/backends/bluezdbus/client.py", line 894, in args_parser
    return func(char_map.get(sender, sender), bytearray(data.get("Value")))
  File "/home/pi/Desktop/idasen-controller/idasen_controller/main.py", line 224, in _move_to
    except asyncio.exceptions.InvalidStateError:
builtins.AttributeError: module 'asyncio' has no attribute 'exceptions'

Task exception was never retrieved
future: <Task finished coro=<unsubscribe() done, defined at /home/pi/Desktop/idasen-controller/idasen_controller/main.py:187> exception=RemoteError('org.bluez.Error.Failed')>
Traceback (most recent call last):
  File "/home/pi/Desktop/idasen-controller/idasen_controller/main.py", line 189, in unsubscribe
    await client.stop_notify(uuid)
  File "/home/pi/.local/lib/python3.7/site-packages/bleak/backends/bluezdbus/client.py", line 776, in stop_notify
    ).asFuture(asyncio.get_event_loop())
txdbus.error.RemoteError: org.bluez.Error.Failed: No notify session started
ConnectingConnected F2:7D:17:78:73:80
Height:  675mm
Final height:  811mm (Target: 1050mm)
DisconnectingDisconnected

Any ideas? I was getting the same error before updating bluetoothctl when it was at v5.5.

Unable to connect using MacOS Monterey

I have created a config.yaml file in the library folder, but when I run the command:
idasen-controller --config "/Library/Application Support/idasen-controller/config.yaml"
I receive the error:
Scanning - Desk D8-7D-63-0D-91-32 Not Found

config.yaml looks like this:
mac_address: D8-7D-63-0D-91-32
stand_height: 1040
sit_height: 683
height_tolerance: 2.0
scan_timeout: 5
connection_timeout: 10
movement_timeout: 30
adapter_name: hci0
server_address": "127.0.0.1"
server_port: 9123

Thank you!

Not really an issue, just wanted to thank you!
Have been using the IKEA desk for some years now, did not cross my mind i could controll it from my linux box.
God bless you!
Where can I donate? :)

[org.bluez.Error.Failed] No notify session started

Thanks for the great work you did here!

idasen-controller --move-to 1180
Connected CE:41:99:2E:BA:4D
Height: 1000mm
Moving to height: 1180
Height: 1004mm Speed: 29mm/s
Height: 1016mm Speed: 33mm/s
Height: 1030mm Speed: 38mm/s
Height: 1044mm Speed: 38mm/s
Height: 1059mm Speed: 39mm/s
Height: 1073mm Speed: 39mm/s
Height: 1086mm Speed: 39mm/s
Height: 1100mm Speed: 39mm/s
Height: 1114mm Speed: 40mm/s
Height: 1127mm Speed: 39mm/s
Height: 1142mm Speed: 39mm/s
Height: 1156mm Speed: 41mm/s
Height: 1170mm Speed: 39mm/s
Height: 1180mm Speed:  0mm/s

Something unexpected went wrong:
[org.bluez.Error.Failed] No notify session started
Disconnected   

Do you know why I get this error message?

Something unexpected went wrong or Address not found

Hi

Issue :
image
image

Pre-requisites : (Windows 10 up to date)

image

image

image

image

image

image

Maybe wierd ?

  1. If i'm not clicking on the desk bluetooth button (desk not appearing)
    image
  2. If i'm clicking on the button (desk appearing)
    image
  3. I dont know if thats expected, but the Desk does not stay connected to the PC. When registering the device, it goes to register->connected->paired

PS : Tried changing to connection_timeout: 30, still not working.

stop command | homebridge plugin

Hey @rhyst

After buying a new Ikea Idasen I immediately wanted to integrate it into HomeKit.
I found your work an started integrating it into a homebridge plugin.
I'm just spawning your controller as a child_process.

There is no real readme for now but I'll make sure to credit you.
Here is a link to the repo:
https://github.com/vniehues/linak-homebridge

The one thing that im missing from your script is a way to immediately stop any movement of the desk.
When I kill the movement process, the desk keeps moving.
Is there any way you could integrate something like that in your controller? Is that even possible?

Thank you for your work!
It is outstanding :)

Cheers

alias/rename/document this also works with brand name Linak controllers

I recently got an iMovr Lander desk, which uses the official Linak controller that is rebranded for Idåsen desks. I am able to successfully connect and control the desk (once I realized that I needed UUID instead of MAC ... that callout in the readme isn't visible enough).

Yes, I will probably just create myself a symlink 😉. Mostly I just wanted to suggest mentioning that this works with other Linak controllers.

Support for get_desk Height in server mode

Hello,

I've made a 3 button device, that connects to the desk, via one raspberrypi 2w.
I am using your idasen-controller, to send commands to the desk ( and thank you very much for that).
However would like one feature, and that is to be able to print the desk height when running in server mode.
For example idasen-controller --forward --get_height I would like it to return the current desk height in mm.

Is it, please, possible to add it to the allowed commands?

I will mention that I am using the server mode, as a way to get a fast response time to the desk when I press a button and ignore the ever so annoying:
idasen-controller Connecting failed Device with address D6:48:E7:10:EF:27 was not found.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.