You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.9 KiB
55 lines
1.9 KiB
import socket
|
|
import struct
|
|
import time
|
|
|
|
def send_dmx(universe=0, num_channels=512, fade_time=5):
|
|
UDP_IP = '255.255.255.255' # Broadcast address
|
|
UDP_PORT = 6454
|
|
|
|
# Create UDP socket
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
|
|
|
sequence = 0
|
|
physical = 0
|
|
|
|
# Fading parameters
|
|
fade_steps = 100
|
|
fade_interval = fade_time / fade_steps
|
|
|
|
try:
|
|
while True:
|
|
# Fade up
|
|
for value in range(0, 256):
|
|
dmx_data = [value] * num_channels
|
|
dmx_packet = build_artdmx_packet(sequence, physical, universe, dmx_data)
|
|
sock.sendto(dmx_packet, (UDP_IP, UDP_PORT))
|
|
time.sleep(fade_interval / 256)
|
|
|
|
# Fade down
|
|
for value in range(255, -1, -1):
|
|
dmx_data = [value] * num_channels
|
|
dmx_packet = build_artdmx_packet(sequence, physical, universe, dmx_data)
|
|
sock.sendto(dmx_packet, (UDP_IP, UDP_PORT))
|
|
time.sleep(fade_interval / 256)
|
|
|
|
except KeyboardInterrupt:
|
|
print("DMX transmission stopped.")
|
|
finally:
|
|
sock.close()
|
|
|
|
def build_artdmx_packet(sequence, physical, universe, dmx_data):
|
|
header = b'Art-Net\x00' # Protocol identifier
|
|
opcode = struct.pack('<H', 0x5000) # OpCode: ArtDMX (0x5000), little endian
|
|
protocol_version = struct.pack('>H', 14) # Protocol version (14 for Art-Net)
|
|
sequence = struct.pack('B', sequence) # Sequence
|
|
physical = struct.pack('B', physical) # Physical port
|
|
universe = struct.pack('<H', universe) # Universe, little endian
|
|
length = struct.pack('>H', len(dmx_data)) # Data length, big endian
|
|
data = bytes(dmx_data) # DMX data
|
|
|
|
packet = header + opcode + protocol_version + sequence + physical + universe + length + data
|
|
return packet
|
|
|
|
if __name__ == '__main__':
|
|
send_dmx()
|