前言
一直看到米家氛围灯带可以联动雷蛇灯效,买回一个尝试,发现不能做到每个LED灯珠单独控制,只能以20cm左右为一段控制颜色变化
分析
插入usb接口,发现设备管理器多出一个串口设备
安装CHROMA CONNECT和ZEERAY软件后可以联动雷蛇灯效,利用串口抓包工具分析发送数据为
set_rgb_pc {id_str} 00 64 {rgb1} 4 {rgb2} 4 {rgb3} 4 {rgb4} 4 {rgb5} 4\r\n
以及启动pc灯效联动时的命令
set_pc_available 1\r\n
set_usb_dim_time 20\r\n
set_power 1\r\n
set_pc_linkage 1\r\n
使用python代码模拟软件发送发现可以成功控制
将灯带同步至openrgb,实现更多自定义效果
import serial, sacn, time, random
class ser:
def __init__(self):
self.ser = serial.Serial("COM6", 230400, timeout=1)
self.id = 0
self.startSerial()
def startSerial(self):
self.ser.write("set_pc_available 1\r\n".encode())
print("Serial Started")
self.ser.read_until("\r\n".encode())
self.ser.write("set_usb_dim_time 20\r\n".encode())
x = self.ser.read_until("\r\n".encode())
self.set_pc_linkage(False)
time.sleep(1)
self.set_pc_linkage(True)
def open(self, flag):
if flag:
self.ser.write("set_power 1\r\n".encode())
print("Serial Opened")
else:
self.ser.write("set_power 0\r\n".encode())
print("Serial Closed")
def set_pc_linkage(self, flag):
if flag:
self.ser.write("set_pc_linkage 1\r\n".encode())
print("PC Linkage Set")
else:
self.ser.write("set_pc_linkage 0\r\n".encode())
print("PC Linkage Unset")
def send_data(self, data):
self.ser.write(data.encode())
print("Data Sent")
def change_color(self, rgb1, rgb2, rgb3, rgb4, rgb5):
print(rgb1, rgb2, rgb3, rgb4, rgb5)
self.id = 898
# 强制四位数
id_str = str(self.id)
while len(id_str) < 4:
id_str = "0" + id_str
self.ser.write(
f"set_rgb_pc {id_str} 00 64 {rgb1} 4 {rgb2} 4 {rgb3} 4 {rgb4} 4 {rgb5} 4\r\n".encode()
)
def ramdom_color(self):
return "".join([random.choice("0123456789abcdef") for i in range(6)])
rgb=[]
x=ser()
x.open(True)
def send():
try:
x.change_color(*rgb)
except:
pass
time.sleep(0.1)
if __name__ == "__main__":
receiver = sacn.sACNreceiver()
receiver.start()
@receiver.listen_on("universe", universe=1)
def callback(packet):
rgb=[]
for i in range(5):
one_rgb = packet.dmxData[i*3:i*3+3]
rgb.append("".join([f"{x:02x}" for x in one_rgb]))
x.change_color(*rgb)
receiver.join_multicast(1)
try:
while True:
send()
except KeyboardInterrupt:
x.set_pc_linkage(False)
receiver.stop()
print("Closed")
exit()
运行代码后,在openrgb添加E1.31设备