Skip to content

Commit

Permalink
Restructure the project for PyPi
Browse files Browse the repository at this point in the history
- Move some files and fix some minor issues
- Add setup.py for PyPi
- Add README
- Add .gitignore
- Add unittest test

First release - v1.0.0
  • Loading branch information
Aritzherrero4 committed Dec 23, 2020
1 parent 42c5022 commit eacce0b
Show file tree
Hide file tree
Showing 8 changed files with 184 additions and 28 deletions.
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
venv
__pycache__
.vscode
dist/
*.py[co]
*.egg-info/
*.egg
build/
93 changes: 93 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# trionesControl

This module implements the triones protocol reverse engineered by [madhead](https://github.com/madhead) with python, offering a programmatic way to control these kind of lights without needing the app on your phone. To learn more about the protocol, please read the following specification:

* [madhead - saberlight/protocols/Triones/protocol.md](https://github.com/madhead/saberlight/blob/master/protocols/Triones/protocol.md)

## Requirements

This package only works on Linux, it uses pygatt and depends on blueZ.

The package has been tested in python 3 (3.8.5) but it may work on previous versions, even python 2.7, as long as [pygatt requirements](https://github.com/peplin/pygatt#requirements) are met.

## Installation

Install ``trionesControl`` with pip from PyPI:

pip install trionesControl

This will install all the dependencies used by this package and ``pexpect``, an optional ``pygatt`` needed to use it's BlueZ backend.

## Documentation

### Connexion handling

* ``connect(MAC)``: Connect to the device with the mac address specified.

* ``disconnect(device)``: Disconnects from the specified device.

### LED Control

* ``powerOn(device)``: Powers on the device, the LEDs will turn on.

* ``powerOff(device)``: Powers off the device, the LEDs will turn off.

* ``setRGB(r: int, g: int, b: int, device)``: Sets the LED color configuration of the device to the r, g and b colors. (0-255)

* ``setWhite(intensity: int, device)``: Sets the device's LED to white with the specified intensiy. (0-255)

* ``setBuiltIn(mode: int, speed: int, device)``: Activates the selected predefined built-in mode at the selected speed (0-255). The built modes go from 37 to 56.

## Example use

The unittest code available in [tests/test.py](https://github.com/Aritzherrero4/python-trionesControl/blob/master/tests/test.py) can be used as a sample to use the available functions of the package. You can test your bulb / LED strip by using the following code too.

### Connect and power on the device

```python
import time
import trionesControl.trionesControl as tc

#Change the mac address to the one of your bulb or LED strip
device = tc.connect('00:00:00:00:00:00')
tc.powerOn(device)
```

### Change colors

```python
# RGB mode
tc.setRGB(100,100,100, device)
time.sleep(1)
tc.setRGB(255, 255, 255, device)
time.sleep(1)
tc.setRGB(255,0,0, device)
time.sleep(1)
tc.setRGB(0,255,0, device)

#White mode
time.sleep(10)
tc.setWhite(255, device)
```

### Built-in modes

```python
#Change built-in modes (37-56)
time.sleep(10)
tc.setBuiltIn(37, 1)
tc.time(10)
```

### Power off and disconnect

```python
tc.powerOff(device)
tc.disconnect(device)
```

## Licence

MIT Licence - Copyright 2020 Aritz Herrero

For more information, check [LICENCE](https://github.com/Aritzherrero4/python-trionesControl/blob/master/LICENSE) file.
26 changes: 26 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import setuptools

with open("README.md", "r") as fh:
long_description = fh.read()

setuptools.setup(
name="trionesControl",
version="1.0.0",
author="Aritz Herrero",
description="Simple python package to control smart lights using the Triones porotocol",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/Aritzherrero4/python-trionesControl",
license="MIT",
packages=setuptools.find_packages(exclude=("tests",)),
classifiers=[
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"License :: OSI Approved :: MIT License",
"Operating System :: POSIX :: Linux",
],
install_requires=["pygatt", "pexpect"],
python_requires='>=3.6'
)
26 changes: 0 additions & 26 deletions test.py

This file was deleted.

File renamed without changes.
55 changes: 55 additions & 0 deletions tests/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import time
from trionesControl import trionesControl as tc
import logging
import unittest

#Set the MAC address of the lights before executing
device = tc.connect('00:00:00:00:00:00')
chars = device.discover_characteristics()


log = logging.getLogger(__name__)
logging.basicConfig(level=20)

class fullTestCase(unittest.TestCase):
def powerOn(self):
tc.powerOn(device)

def colorChange(self):
tc.setRGB(100,100,100, device)
time.sleep(1)
tc.setRGB(255, 255, 255, device)
time.sleep(1)
tc.setRGB(255,0,0, device)
time.sleep(1)
tc.setRGB(0,255,0, device)
time.sleep(1)
tc.setRGB(0,0,255, device)
time.sleep(1)
tc.setRGB(0,0,255, device)
time.sleep(1)
tc.setRGB(150,0,150, device)
time.sleep(2)

def setWhite(self):
tc.setWhite(255, device)
time.sleep(10)

def builtIn(self):
tc.setBuiltIn(37, 1, device)
time.sleep(10)

def powerOff(self):
time.sleep(10)
tc.powerOff(device)
tc.disconnect(device)

def testLights(self):
self.powerOn()
self.colorChange()
self.setWhite()
self.builtIn()
self.powerOff()

if __name__ == '__main__':
unittest.main()
Empty file added trionesControl/__init__.py
Empty file.
4 changes: 2 additions & 2 deletions trionesControl.py → trionesControl/trionesControl.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def powerOff(device):
log.info("Device powered off")

def setRGB(r: int, g: int, b: int, device):
# Values for color shoud be between 0 and 255
# Values for color should be between 0 and 255
if r > 255: r = 255
if r < 0: r= 0
if g > 255: g = 255
Expand Down Expand Up @@ -71,7 +71,7 @@ def setWhite(intensity: int, device):
device.char_write_handle(0x0009, payload)
except pygatt.exceptions.NotConnectedError:
raise pygatt.exceptions.NotConnectedError("Device nor connected!")
log.info("White color set -- Intensiti %d", intensity)
log.info("White color set -- Intensity: %d", intensity)

def setBuiltIn(mode: int, speed: int, device):
if mode<37 | mode > 56:
Expand Down

0 comments on commit eacce0b

Please sign in to comment.