Initial commit

This commit is contained in:
jpk 2018-03-16 14:53:34 +01:00
commit 81fcc1ec40
2 changed files with 196 additions and 0 deletions

152
lw12.py Normal file
View File

@ -0,0 +1,152 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8:ts=8:et:sw=4:sts=4
#
# Copyright © 2017 jpk <jpk@goatpr0n.de>
#
# Distributed under terms of the MIT license.
"""
"""
from struct import (pack, unpack, calcsize)
from enum import Enum
import socket
from collections import namedtuple
_LW12_PKT_LEN = 9
_LW12_PKT_FMT = 'c6sxc'
_LW12_PKT_PAYLOAD_FMT = 'cccccc'
_LW12_PKT_HEAD = b'\x7e'
_LW12_PKT_TAIL = b'\xef'
class LW12_MODE(Enum):
LIGHT = b'\x04'
COLOR = b'\x05'
IGNORE = b'\xff'
class LW12_LIGHT(Enum):
BRIGHTNESS = b'\x01'
FLASH = b'\x02'
SET = b'\x03'
POWER = b'\x04'
class LW12_POWER(Enum):
ON = b'\x01'
OFF = b'\x00'
class LW12_COLOR_STATIC(Enum):
RED = b'\x80'
BLUE = b'\x81'
GREEN = b'\x82'
CYAN = b'\x83'
YELLOW = b'\x84'
PURPLE = b'\x85'
WHITE = b'\x86'
class LW12_COLOR_JUMP(Enum):
TRICOLOR = b'\x87'
SEVENCOLOR = b'\x88'
class LW12_COLOR_GRADIENT(Enum):
TRICOLOR = b'\x89'
SEVENCOLOR = b'\x8a'
RED = b'\x8b'
GREEN = b'\x8c'
BLUE = b'\x8d'
YELLOW = b'\x8e'
CYAN = b'\x8f'
PURPLE = b'\x90'
WHITE = b'\x91'
RED_GREEN = b'\x92'
RED_BLUE = b'\x93'
GREEN_BLUE = b'\x94'
class LW12_COLOR_FLASH(Enum):
SEVENCOLOR = b'\x95'
RED = b'\x96'
GREEN = b'\x97'
BLUE = b'\x98'
YELLOW = b'\x99'
CYAN = b'\x9a'
PURPLE = b'\x9b'
WHITE = b'\x9c'
LW12_Packet = namedtuple('Packet', 'head data tail')
LW12_Payload = namedtuple('Payload', 'mode option value r g b')
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
class LW12Controller(object):
def __init__(self, host, port):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.host = host
self.port = port
def get_remote_socket(self):
return (self.host, self.port)
def send(self, payload, sock=None):
data = self._compile_packet(payload)
packet = pack(_LW12_PKT_FMT, _LW12_PKT_HEAD, data, _LW12_PKT_TAIL)
if len(packet) != 9:
raise Exception('Invalid data length. Packet malformed')
try:
return self.socket.sendto(packet, sock or self.get_remote_socket())
except OSError as oserr:
if oserr.errno == 101:
print('Network is unreachable')
def _compile_packet(self, payload):
if len(payload) != 6:
raise Exception('Invalid payload length. Packet malformed')
try:
raw_value = payload.value.value
except AttributeError:
raw_value = payload.value
return pack(_LW12_PKT_PAYLOAD_FMT,
payload.mode.value, payload.option.value, raw_value,
payload.r.value, payload.g.value, payload.b.value)
def light_off(self):
payload = LW12_Payload(r=LW12_MODE.IGNORE, g=LW12_MODE.IGNORE, b=LW12_MODE.IGNORE,
mode=LW12_MODE.LIGHT,
option=LW12_LIGHT.POWER,
value=LW12_POWER.OFF)
self.send(payload)
def light_on(self):
payload = LW12_Payload(r=LW12_MODE.IGNORE, g=LW12_MODE.IGNORE, b=LW12_MODE.IGNORE,
mode=LW12_MODE.LIGHT,
option=LW12_LIGHT.POWER,
value=LW12_POWER.ON)
self.send(payload)
def set_effect_color(self, color):
payload = LW12_Payload(r=LW12_LIGHT.SET, g=LW12_MODE.IGNORE, b=LW12_MODE.IGNORE,
mode=LW12_MODE.LIGHT,
option=LW12_LIGHT.SET,
value=color)
self.send(payload)
def set_light_option(self, option, value):
# Fail safe handling for integers > 100
if 0 < value > 100:
value = int(value / 255 * 100)
payload = LW12_Payload(r=LW12_MODE.IGNORE, g=LW12_MODE.IGNORE, b=LW12_MODE.IGNORE,
mode=LW12_MODE.LIGHT,
option=option,
value=bytes([value]))
self.send(payload)

44
test.py Normal file
View File

@ -0,0 +1,44 @@
#!/usr/bin/env python
from lw12 import *
import time
lw12 = LW12Controller('192.168.178.24', 5000)
print('[+] LW12 LIGHT OFF')
lw12.light_off()
time.sleep(.500)
print('[+] LW12 LIGHT ON')
lw12.light_on()
time.sleep(.500)
print('[+] LW12_COLOR_STATIC')
for color in LW12_COLOR_STATIC:
print(' {}'.format(color))
lw12.set_effect_color(color)
time.sleep(.250)
print('[+] LW12_LIGHT.BRIGHTNESS')
for brightness in range(0, 101, 5):
print(' brightness={}'.format(brightness))
lw12.set_light_option(LW12_LIGHT.BRIGHTNESS, brightness)
time.sleep(.250)
print('[+] LW12_LIGHT.FLASH')
print(' speed=100')
lw12.set_light_option(LW12_LIGHT.FLASH, 100)
print('[+] LW12_COLOR_JUMP')
for color in LW12_COLOR_JUMP:
print(' {}'.format(color))
lw12.set_effect_color(color)
time.sleep(2)
print('[+] LW12_COLOR_FLASH')
for color in LW12_COLOR_FLASH:
print(' {}'.format(color))
lw12.set_effect_color(color)
time.sleep(2)
print('[+] LW12_COLOR_GRADIENT')
for color in LW12_COLOR_GRADIENT:
print(' {}'.format(color))
lw12.set_effect_color(color)
time.sleep(2)
lw12.set_effect_color(LW12_COLOR_STATIC.PURPLE)
lw12.set_light_option(LW12_LIGHT.BRIGHTNESS, 10)