122 lines
3.7 KiB
Python
122 lines
3.7 KiB
Python
import serial
|
|
import time
|
|
|
|
class WLEDController:
|
|
def __init__(self, port: str, baud_rate: int = 115200, timeout: float = 1.0):
|
|
"""
|
|
Initialize the WLEDController.
|
|
|
|
:param port: The serial port to which the ESP32 is connected (e.g., '/dev/ttyUSB0').
|
|
:param baud_rate: The baud rate for the serial connection.
|
|
:param timeout: The timeout for serial communication in seconds.
|
|
"""
|
|
self.port = port
|
|
self.baud_rate = baud_rate
|
|
self.timeout = timeout
|
|
self.connection = None
|
|
|
|
def connect(self):
|
|
"""Establish the serial connection."""
|
|
try:
|
|
self.connection = serial.Serial(
|
|
self.port, self.baud_rate, timeout=self.timeout
|
|
)
|
|
print(f"Connected to {self.port}")
|
|
except serial.SerialException as e:
|
|
print(f"Failed to connect to {self.port}: {e}")
|
|
|
|
def disconnect(self):
|
|
"""Close the serial connection."""
|
|
if self.connection and self.connection.is_open:
|
|
self.connection.close()
|
|
print(f"Disconnected from {self.port}")
|
|
|
|
def send_command(self, command: str):
|
|
"""
|
|
Send a command to the WLED device.
|
|
|
|
:param command: The JSON command string to send.
|
|
"""
|
|
if not self.connection or not self.connection.is_open:
|
|
raise ConnectionError("Serial connection is not open.")
|
|
try:
|
|
self.connection.write(command.encode('utf-8'))
|
|
print(f"Sent command: {command}")
|
|
except serial.SerialException as e:
|
|
print(f"Failed to send command: {e}")
|
|
|
|
def switch_to_red(self):
|
|
"""Switch the light to red."""
|
|
self.send_command('{"ps":"1"}')
|
|
|
|
def switch_to_yellow(self):
|
|
"""Switch the light to yellow."""
|
|
self.send_command('{"ps":"2"}')
|
|
|
|
def switch_to_green(self):
|
|
"""Switch the light to green."""
|
|
self.send_command('{"ps":"3"}')
|
|
|
|
def turn_off_all(self):
|
|
"""Turn off all lights."""
|
|
self.send_command('{"ps":"4"}')
|
|
|
|
def blink_yellow(self):
|
|
"""Blink in yellow."""
|
|
self.send_command('{"ps":"5"}')
|
|
|
|
def blink_red(self):
|
|
"""blink in red."""
|
|
self.send_command('{"ps":"7"}')
|
|
|
|
def blink_green(self):
|
|
"""blink in green."""
|
|
self.send_command('{"ps":"6"}')
|
|
|
|
def map_color_to_led(self, color):
|
|
"""
|
|
Map an RGB color to the corresponding WLED action based on predefined ranges.
|
|
|
|
:param color: A tuple of (R, G, B) values, where each component is an integer between 0 and 255.
|
|
"""
|
|
red, green, blue = color
|
|
|
|
# Check if the color is red (high R, low G and B)
|
|
if red > 200 and green < 100 and blue < 100:
|
|
self.switch_to_red()
|
|
|
|
# Check if the color is green (high G, low R and B)
|
|
elif red < 100 and green > 200 and blue < 100:
|
|
self.switch_to_green()
|
|
|
|
# Check if the color is yellow (high R and G, low B)
|
|
elif red > 200 and green > 200 and blue < 100:
|
|
self.switch_to_yellow()
|
|
|
|
# If none of the above, turn off the LEDs
|
|
else:
|
|
self.turn_off_all()
|
|
|
|
# Example usage:
|
|
if __name__ == "__main__":
|
|
controller = WLEDController(port="/dev/serial/by-path/pci-0000:00:14.0-usbv2-0:1:1.0-port0")
|
|
controller.connect()
|
|
|
|
try:
|
|
controller.switch_to_red()
|
|
time.sleep(2) # Wait for 2 seconds
|
|
|
|
controller.switch_to_yellow()
|
|
time.sleep(2) # Wait for 2 seconds
|
|
|
|
controller.switch_to_green()
|
|
time.sleep(2) # Wait for 2 seconds
|
|
|
|
controller.change_effect()
|
|
time.sleep(2) # Wait for 2 seconds
|
|
|
|
controller.turn_off_all()
|
|
time.sleep(2) # Wait for 2 seconds
|
|
|
|
finally:
|
|
controller.disconnect() |