# Python library for controlling BLEDOM devices
> This library is still in development. Functionality hasn't fully been tested yet. If you find bugs or "stub" messages, please [create an issue](https://github.com/thegreatrazz/pybledom/issues).
## Demo Program
This library comes with a demo program.
```bash
python -m bledom
```
## API
### Run API
You can let the library do the Bluetooth set up for you by creating a main function which the library will call after having set up the Bluetooth device.
```python
from time import sleep
from bledom import BleLedDevice, run_sync
async def main(device: BleLedDevice):
while True:
sleep(2)
await device.set_color(randint(0, 255),
randint(0, 255),
randint(0, 255))
run_sync(main)
```
### Device API
#### Creating a device from with a BleakClient
> Reading the [Bleak documentation](https://bleak.readthedocs.io/en/latest/) is recommended for connecting to a device manually.
A device connection can be created with a Bleak client. See [main.py](src/bledom/main.py) for an example.
```
device = BleLedDevice.new(client)
```
The device will be powered on and have it's time synced on when it gets connected.
#### Modes
* **`device.power_on(self)`** \
Powers on the device
* **`device.set_color(128, 64, 255)`** \
Sets a static colour
* **`device.set_brightness(64)`** \
Sets a static brightness (0-100)
* **`device.set_effect(Effects.CROSSFADE_RED_GREEN_BLUE)`** \
Sets an effect
* **`device.set_effect_speed(64)`** \
Sets the effect speed
#### Time and Schedule
* **`device.sync_time()`** \
Syncs the device to the system time. Gets called on connection.
* **`device.set_custom_time(datetime.now())`** \
Syncs the device to the given [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime).
* **`device.set_schedule_on(Days.TUESDAY | Days.THURSDAY, 7, 30, True)`** \
Schedules LED to turn on on Tuesday and Thursday at 7:30 AM. Set last argument to `False` to disable.
* **`device.set_schedule_off(Days.ALL, 0, 0, True)`** \
Schedules LED to turn off everyday at midnight (12:00 AM). Set last argument to `False` to disable.
The `Days` enum has the days `MONDAY` through `SUNDAY` as well as `WEEK_DAY` (Monday through Friday), `WEEKEND_DAYS` (Saturday and Sunday) and `ALL` for all days.
#### Effects
For `device.set_effect(...)`, the following effects are available:
* `Effects.JUMP_RED_GREEN_BLUE`
* `Effects.JUMP_RED_GREEN_BLUE_YELLOW_CYAN_MAGENTA_WHITE`
* `Effects.CROSSFADE_RED`
* `Effects.CROSSFADE_GREEN`
* `Effects.CROSSFADE_BLUE`
* `Effects.CROSSFADE_YELLOW`
* `Effects.CROSSFADE_CYAN`
* `Effects.CROSSFADE_MAGENTA`
* `Effects.CROSSFADE_WHITE`
* `Effects.CROSSFADE_RED_GREEN`
* `Effects.CROSSFADE_RED_BLUE`
* `Effects.CROSSFADE_GREEN_BLUE`
* `Effects.CROSSFADE_RED_GREEN_BLUE`
* `Effects.CROSSFADE_RED_GREEN_BLUE_YELLOW_CYAN_MAGENTA_WHITE`
* `Effects.BLINK_RED`
* `Effects.BLINK_GREEN`
* `Effects.BLINK_BLUE`
* `Effects.BLINK_YELLOW`
* `Effects.BLINK_CYAN`
* `Effects.BLINK_MAGENTA`
* `Effects.BLINK_WHITE`
* `Effects.BLINK_RED_GREEN_BLUE_YELLOW_CYAN_MAGENTA_WHITE`
## Acknowledgements
This library is a port of [a Rust library written by TheSylex][rust-lib].
Salutations to [Joel](https://github.com/jxeldotdev).
[rust-lib]: https://github.com/TheSylex/ELK-BLEDOM-bluetooth-led-strip-controller