Skip to main content

Python library and command line interface to control Twinkly - Smart Decoration LED lights for Christmas.

Project description

XLED - unofficial control Twinkly - Smart Decoration LED lights

XLED is python library and command line interface (CLI) to control Twinkly. Creators describe Twinkly project page of Kickstarter:

Twinkly is a Christmas tree light string, controlled via smartphone: “internet of things” meets extraordinary light effects! Created by ledworks

Library and CLI are free software available under MIT license.

Documentation for library can be found on https://xled.readthedocs.io.

Use of library:

>>> import xled
>>> discovered_device = xled.discover.discover()
>>> discovered_device.name
'Twinkly_33AAFF'
>>> control = xled.ControlInterface(discovered_device.ip_address, discovered_device.hw_address)
>>> control.set_mode('movie')
>>> control.get_mode()['mode']
u'movie'
>>> control.get_device_info()['number_of_led']
105

Use of CLI:

$ xled on
Looking for any device...
Working on device: Twinkly_33AAFF
Turned on.

Unofficial documentation of private protocol and API is available online.

Why?

I have Twinkly 105 LEDs starter light set. That is latest available model in 2017: TW105S-EU. As of December 2017 there are only two ways to control lights - mobile app on Android or iOS or hardware button on the cord.

Android application didn’t work as advertised on my Xiaomi Redmi 3S phone. On first start it connected and disconnected in very fast pace (like every 1-2 seconds) to the hardware. I wasn’t able to control anything at all. Later I wanted to connect it to my local WiFi network. But popup dialog that shouldn’t have appear never did so.

Public API was promised around Christmas 2016 for next season. Later update from October 2016 it seems API won’t be available any time soon:

API for external control are on our dev check list, we definitely need some feedback from the community to understand which could be a proper core set to start with.

It turned out that application uses HTTP to control lights. I ended up with capturing network traffic and documented this private API. In the end I’m able to configure the device pretty easilly.

Credits

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

History

0.5.0 (2018-12-09)

  • CLI to update firmware

  • Example of library call and CLI usage

  • Option to select device by hostname in CLI and ping in discovery

  • New HighControlInterface() to aggregate and abstract low-level calls

  • CLI and HighControlInterface way to set static single color

  • Other bugfixes and improvements:

    • Fix typo in CLI error message

    • Print message before discovery on CLI

    • Refactor: join consecutive strings on same line

    • Print better message after device has been discovered over CLI

    • Regenerate documentation index of a package

    • Fix typo in control.set_mode() documentation

    • Return named tuple in discover.discover()

    • Use discovery and named tuple in example of library use

    • Do not assert return value in ControlInterface.set_led_movie_full()

    • Return ApplicationResponse for ControlInterface.set_led_movie_config()

    • Return ApplicationResponse for control.ControlInterface.led_reset()

    • Remove unneeded debug message from DiscoveryInterface.__init__()

0.4.0 (2018-12-03)

  • Support Python 3.6 and 3.7 including tests and documentation

  • Python 3 support with pyzmq >= 17.0 and Tornado 5

  • Remove redundant udplib

  • Other Python 3 compatibility:

    • In Python 3+ import Mapping from collections.abc

    • Python 3 compatible encoding of discovered IP and HW address and name

    • Make xled.security.xor_strings() compatible with Python 2 and 3

    • Treat PING_MESSAGE as bytes to simplify handling Python 2 and 3

  • Other bugfixes and improvements:

    • Remove mention of PyPy from docs as it wasn’t ever tested on it

    • Improve robustness with sending messages from agent to interface

    • Escape display of binary challenge in debug log of xled.auth

    • Ignore (usually own) PING_MESSAGE on network when handling responses

0.3.1 (2018-11-27)

  • Update changelog for version 0.3.0

  • Update description in setup.py to refer to CLI

  • Fix JSON payload sent to server for firmware update.

0.3.0 (2018-11-27)

  • CLI interface

  • Discovery interface - currently works only on Python 2

  • Add support for API led/movie/full and corresponding CLI upload-movie

  • New Authentication mechanism - use session

  • Rename authentication module from long challenge_response_auth to auth

  • Change interface of ApplicationResponse to collections.Mapping

  • Python files reformatted with Black

  • Other bugfixes and improvements:

    • Really show ApplicationResponse status in repr() when available

    • Catch JSONDecodeError in Python 3.5+ in ApplicationResponse

    • New shortcut method ok() of ApplicationResponse

    • Make ApplicationResponse’s attribute status_code @property

    • Improve error reporting during parsing of ApplicationResponse

    • If repr() of ApplicationResponse is called parse response first

    • Check status of underlying requests’ Response if requested

    • Accept requests’ response as attribute to class ApplicationResponse

    • Move generate_challenge to security module

    • Unit tests for control interface

    • Run unit tests on supported python versions with tox and Travis

    • Configuration for pre-commit-hooks

    • Initial pyup configuration

    • Don’t run Tox on Travis on Python 3.3

    • Update coverage

0.2.1 (2018-01-02)

  • Add missing MANIFEST.in

  • Configure Travis for automatic deployment to PyPI

0.2.0 (2018-01-02)

  • First Python control interface.

0.1.0 (2017-12-17)

  • Low level control interface.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xled-0.5.0.tar.gz (37.4 kB view hashes)

Uploaded Source

Built Distribution

xled-0.5.0-py2.py3-none-any.whl (26.5 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page