{ "info": { "author": "Pavol Babin\u010d\u00e1k", "author_email": "scroolik@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "===============================================================\nXLED - unofficial control Twinkly - Smart Decoration LED lights\n===============================================================\n\nXLED is python library and command line interface (CLI) to control Twinkly.\nCreators describe Twinkly `project page of Kickstarter`_:\n\n Twinkly is a Christmas tree light string, controlled via smartphone:\n \"internet of things\" meets extraordinary light effects! Created by ledworks\n\nLibrary and CLI are free software available under MIT license.\n\nDocumentation for library can be found on https://xled.readthedocs.io.\n\nUse of library:\n\n.. code-block:: python\n\n >>> import xled\n >>> discovered_device = xled.discover.discover()\n >>> discovered_device.name\n 'Twinkly_33AAFF'\n >>> control = xled.ControlInterface(discovered_device.ip_address, discovered_device.hw_address)\n >>> control.set_mode('movie')\n >>> control.get_mode()['mode']\n u'movie'\n >>> control.get_device_info()['number_of_led']\n 105\n\nUse of CLI:\n\n.. code-block:: console\n\n $ xled on\n Looking for any device...\n Working on device: Twinkly_33AAFF\n Turned on.\n\nUnofficial documentation of private protocol and API is `available online`_.\n\n\nWhy?\n----\n\nI have Twinkly 105 LEDs starter light set. That is latest available model in\n2017: TW105S-EU. As of December 2017 there are only two ways to control lights\n- mobile app on Android or iOS or hardware button on the cord.\n\nAndroid application didn't work as advertised on my Xiaomi Redmi 3S phone. On\nfirst start it connected and disconnected in very fast pace (like every 1-2\nseconds) to the hardware. I wasn't able to control anything at all. Later I\nwanted to connect it to my local WiFi network. But popup dialog that shouldn't\nhave appear never did so.\n\nPublic API was `promised around Christmas 2016`_ for next season. Later update\nfrom October 2016 it seems `API won't be available any time soon`_:\n\n API for external control are on our dev check list, we definitely need some\n feedback from the community to understand which could be a proper core set\n to start with.\n\nIt turned out that application uses HTTP to control lights. I ended up with\ncapturing network traffic and `documented this private API`_. In the end I'm\nable to configure the device pretty easilly.\n\nCredits\n---------\n\nThis package was created with Cookiecutter_ and the\n`audreyr/cookiecutter-pypackage`_ project template.\n\n.. _`project page of Kickstarter`: https://www.kickstarter.com/projects/twinkly/twinkly-smart-decoration-for-your-christmas\n.. _`available online`: https://xled-docs.readthedocs.io\n.. _`documented this private API`: https://xled-docs.readthedocs.io\n.. _`promised around Christmas 2016`: https://www.kickstarter.com/projects/twinkly/twinkly-smart-decoration-for-your-christmas/comments?cursor=15497325#comment-15497324\n.. _`API won't be available any time soon`: https://www.kickstarter.com/projects/twinkly/twinkly-smart-decoration-for-your-christmas/comments?cursor=14619713#comment-14619712\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`documented this private API`: https://xled-docs.readthedocs.io\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\n=======\nHistory\n=======\n\n0.5.0 (2018-12-09)\n------------------\n\n* CLI to update firmware\n* Example of library call and CLI usage\n* Option to select device by hostname in CLI and ping in discovery\n* New HighControlInterface() to aggregate and abstract low-level calls\n* CLI and HighControlInterface way to set static single color\n* Other bugfixes and improvements:\n\n * Fix typo in CLI error message\n * Print message before discovery on CLI\n * Refactor: join consecutive strings on same line\n * Print better message after device has been discovered over CLI\n * Regenerate documentation index of a package\n * Fix typo in control.set_mode() documentation\n * Return named tuple in discover.discover()\n * Use discovery and named tuple in example of library use\n * Do not assert return value in ControlInterface.set_led_movie_full()\n * Return ApplicationResponse for ControlInterface.set_led_movie_config()\n * Return ApplicationResponse for control.ControlInterface.led_reset()\n * Remove unneeded debug message from DiscoveryInterface.__init__()\n\n0.4.0 (2018-12-03)\n------------------\n\n* Support Python 3.6 and 3.7 including tests and documentation\n* Python 3 support with pyzmq >= 17.0 and Tornado 5\n* Remove redundant udplib\n* Other Python 3 compatibility:\n\n * In Python 3+ import Mapping from collections.abc\n * Python 3 compatible encoding of discovered IP and HW address and name\n * Make xled.security.xor_strings() compatible with Python 2 and 3\n * Treat PING_MESSAGE as bytes to simplify handling Python 2 and 3\n\n* Other bugfixes and improvements:\n\n * Remove mention of PyPy from docs as it wasn't ever tested on it\n * Improve robustness with sending messages from agent to interface\n * Escape display of binary challenge in debug log of xled.auth\n * Ignore (usually own) PING_MESSAGE on network when handling responses\n\n0.3.1 (2018-11-27)\n------------------\n\n* Update changelog for version 0.3.0\n* Update description in setup.py to refer to CLI\n* Fix JSON payload sent to server for firmware update.\n\n0.3.0 (2018-11-27)\n------------------\n\n* CLI interface\n* Discovery interface - currently works only on Python 2\n* Add support for API led/movie/full and corresponding CLI upload-movie\n* New Authentication mechanism - use session\n* Rename authentication module from long challenge_response_auth to auth\n* Change interface of ApplicationResponse to collections.Mapping\n* Python files reformatted with Black\n* Other bugfixes and improvements:\n\n * Really show ApplicationResponse status in repr() when available\n * Catch JSONDecodeError in Python 3.5+ in ApplicationResponse\n * New shortcut method ok() of ApplicationResponse\n * Make ApplicationResponse's attribute status_code @property\n * Improve error reporting during parsing of ApplicationResponse\n * If repr() of ApplicationResponse is called parse response first\n * Check status of underlying requests' Response if requested\n * Accept requests' response as attribute to class ApplicationResponse\n * Move generate_challenge to security module\n * Unit tests for control interface\n * Run unit tests on supported python versions with tox and Travis\n * Configuration for pre-commit-hooks\n * Initial pyup configuration\n * Don't run Tox on Travis on Python 3.3\n * Update coverage\n\n0.2.1 (2018-01-02)\n------------------\n\n* Add missing MANIFEST.in\n* Configure Travis for automatic deployment to PyPI\n\n0.2.0 (2018-01-02)\n------------------\n\n* First Python control interface.\n\n0.1.0 (2017-12-17)\n------------------\n\n* Low level control interface.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/scrool/xled", "keywords": "xled,twinkly", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "xled", "package_url": "https://pypi.org/project/xled/", "platform": "", "project_url": "https://pypi.org/project/xled/", "project_urls": { "Homepage": "https://github.com/scrool/xled" }, "release_url": "https://pypi.org/project/xled/0.5.0/", "requires_dist": [ "arpreq", "click-log", "Click (>=6.0)", "cryptography", "netaddr", "pyzmq (>=17)", "requests", "tornado (>=5.0.0)", "requests-toolbelt", "ipaddress" ], "requires_python": "", "summary": "Python library and command line interface to control Twinkly - Smart Decoration LED lights for Christmas.", "version": "0.5.0" }, "last_serial": 4578369, "releases": { "0.2.0": [], "0.2.1": [ { "comment_text": "", "digests": { "md5": "780b79f48ece42796ee843323da52147", "sha256": "31afd9dadbbb7f237803741370c92bcee0f88631f4d5d2960669b11ad2eb4fa3" }, "downloads": -1, "filename": "xled-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "780b79f48ece42796ee843323da52147", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13037, "upload_time": "2018-01-02T20:07:29", "url": "https://files.pythonhosted.org/packages/ae/ec/342a332e459d3379a2accd1f736cb68ab69fb33fe2d2f9dfa99d04e102d1/xled-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "598695a1765562f08cc8af2ab1690245", "sha256": "6782de632a048e77112e2d8301b6dd4f42fbbcbd539029f705baa1cd8fd5e1d7" }, "downloads": -1, "filename": "xled-0.2.1.tar.gz", "has_sig": false, "md5_digest": "598695a1765562f08cc8af2ab1690245", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22790, "upload_time": "2018-01-02T20:07:34", "url": "https://files.pythonhosted.org/packages/bf/d4/5265995746b74652dc1c8a02a0f845da623608a5eb4b1917d547b37208b1/xled-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "e86df66e8b38114c1371c797bf706974", "sha256": "97807222385d9f0803b412deee4d624432ff93bb38f2054b635f06699302d3df" }, "downloads": -1, "filename": "xled-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e86df66e8b38114c1371c797bf706974", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23271, "upload_time": "2018-11-27T00:59:41", "url": "https://files.pythonhosted.org/packages/73/83/be6f011dec932f5a87b1dc7fb008546bcc4939b10b2e5e83623cb6d101d6/xled-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "374480d1afffdeed6714e3d03d3774c4", "sha256": "2bf636f55951b6d08f6a597a16765b809831bc62f46c670b7a8726aa6fd08a2c" }, "downloads": -1, "filename": "xled-0.3.0.tar.gz", "has_sig": false, "md5_digest": "374480d1afffdeed6714e3d03d3774c4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30384, "upload_time": "2018-11-27T00:59:42", "url": "https://files.pythonhosted.org/packages/61/2f/62d14faaf91edab6534033b3bea5b790dbcdf2f935b20e73b442fab944f0/xled-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "081ac8e60040b1b1cc96d7f419a4db80", "sha256": "d8b9e8b32680ffa432bc520b3c4e42f40df42dce297657608922ac36967d711c" }, "downloads": -1, "filename": "xled-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "081ac8e60040b1b1cc96d7f419a4db80", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23857, "upload_time": "2018-11-27T18:46:59", "url": "https://files.pythonhosted.org/packages/49/56/483b820a4a6364a0415a5322a3adf68f559ffd0f549e0f47fac0c8e18f76/xled-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7aa5b8c189b72ba2a3d74ae2e292dc76", "sha256": "d50bae69de9f0cf9cfd1b24574268ee1d196b2dc22ad73d65801222951aa5c2d" }, "downloads": -1, "filename": "xled-0.3.1.tar.gz", "has_sig": false, "md5_digest": "7aa5b8c189b72ba2a3d74ae2e292dc76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31644, "upload_time": "2018-11-27T18:47:00", "url": "https://files.pythonhosted.org/packages/9b/ca/53d04ea257d38c07a0df033144cc943e47e33a1b596d29f070399950f3b9/xled-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "7ed40066cfcf466c9ec60267e7191d85", "sha256": "e7387f023b1269564d05ffdf5add5de2709ddfc39b7a489fd690981eae892de4" }, "downloads": -1, "filename": "xled-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7ed40066cfcf466c9ec60267e7191d85", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23902, "upload_time": "2018-12-03T01:09:54", "url": "https://files.pythonhosted.org/packages/89/9d/78fb535dff83d6d679a0c506c0679619613cc927e0c57fd6580f3d27304a/xled-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ed620bab11f6b60c994cd151b9c4f11a", "sha256": "ea28d074f8b20e10fa065a42695cf864e8c5ac16dc886b980c00716c4640bc1f" }, "downloads": -1, "filename": "xled-0.4.0.tar.gz", "has_sig": false, "md5_digest": "ed620bab11f6b60c994cd151b9c4f11a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33263, "upload_time": "2018-12-03T01:09:56", "url": "https://files.pythonhosted.org/packages/42/ba/5958aeb4c1b28d2c770c7edf32300ce96226f6ac22e487ce4f2d301431c2/xled-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "8eaa710d74c7df06a247852c10147d37", "sha256": "4ee90a76a3ac3bbaf76fe175b9ccd695fd6cb3fb7ba8761f1a22cd8c8fa0aaf1" }, "downloads": -1, "filename": "xled-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8eaa710d74c7df06a247852c10147d37", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26499, "upload_time": "2018-12-09T22:55:46", "url": "https://files.pythonhosted.org/packages/22/ee/5cc1ac2704c97df34d6ac932a068d0ab9bf79bf50cd7f25e848d53e418ed/xled-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ebf0ecf02d01352ebb7d699f319e527", "sha256": "b45cca2161c47b1a6d8ea272cd5ca252d0b1a6408ea8390234336fcdc5100410" }, "downloads": -1, "filename": "xled-0.5.0.tar.gz", "has_sig": false, "md5_digest": "2ebf0ecf02d01352ebb7d699f319e527", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37413, "upload_time": "2018-12-09T22:55:47", "url": "https://files.pythonhosted.org/packages/ef/6b/aa51e86c75c178c4fd49e8c75f03c887a7120a42b1bc59c892a1f57db085/xled-0.5.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8eaa710d74c7df06a247852c10147d37", "sha256": "4ee90a76a3ac3bbaf76fe175b9ccd695fd6cb3fb7ba8761f1a22cd8c8fa0aaf1" }, "downloads": -1, "filename": "xled-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8eaa710d74c7df06a247852c10147d37", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26499, "upload_time": "2018-12-09T22:55:46", "url": "https://files.pythonhosted.org/packages/22/ee/5cc1ac2704c97df34d6ac932a068d0ab9bf79bf50cd7f25e848d53e418ed/xled-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ebf0ecf02d01352ebb7d699f319e527", "sha256": "b45cca2161c47b1a6d8ea272cd5ca252d0b1a6408ea8390234336fcdc5100410" }, "downloads": -1, "filename": "xled-0.5.0.tar.gz", "has_sig": false, "md5_digest": "2ebf0ecf02d01352ebb7d699f319e527", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37413, "upload_time": "2018-12-09T22:55:47", "url": "https://files.pythonhosted.org/packages/ef/6b/aa51e86c75c178c4fd49e8c75f03c887a7120a42b1bc59c892a1f57db085/xled-0.5.0.tar.gz" } ] }