ArtNetNode.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import time
  2. import socket
  3. import struct
  4. import random
  5. class ArtNetNode():
  6. """simple Object to generate ArtNet Network packages
  7. works in Python2 and Python3 2021-12-05
  8. """
  9. def __init__(self, to="10.10.10.255",univ=7,port=6454):
  10. try:
  11. univ = int(univ)
  12. except:
  13. print("errror univ",univ ,"is not int ... set to 7")
  14. univ = 7
  15. self.univ=univ
  16. self.sendto = to
  17. self.portto = port
  18. print(__name__,"bind",to,port,univ)
  19. self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  20. self.s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  21. self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  22. self.stamp = time.time()
  23. self.test_stamp = time.time()
  24. self.dmx=[33]*512
  25. self.v=0
  26. self.d=1
  27. def head(self):
  28. self._header = []
  29. self._header.append(b"Art-Net\x00") # Name, 7byte + 0x00
  30. self._header.append(struct.pack('<H', 0x5000)) # OpCode ArtDMX -> 0x5000, Low Byte first
  31. self._header.append(struct.pack('>H', 14)) # Protocol Version 14, High Byte first
  32. self._header.append(b"\x00") # Order -> nope -> 0x00
  33. self._header.append(struct.pack('B',1)) # Eternity Port
  34. # Address
  35. #if 0 <= universe <= 15 and 0 <= net <= 127 and 0 <= subnet <= 15
  36. net, subnet, universe = (0,0,self.univ) #address
  37. self._header.append(struct.pack('<H', net << 8 | subnet << 4 | universe))
  38. self._header = b"".join(self._header)
  39. def send(self,dmx=None,port=''):
  40. if dmx is None:
  41. dmx = self.dmx
  42. else:
  43. self.dmx = dmx
  44. self.head()
  45. c=[self._header]
  46. c.append( struct.pack('>H', len(dmx) ) )
  47. #print([c])
  48. dmx_count = 0
  49. for v in dmx:
  50. if not (type(v) is int or type(v) is float):
  51. v=0
  52. v = int(v)
  53. if v > 255: # max dmx value 255
  54. v = 255
  55. elif v < 0: # min dmx value 0
  56. v = 0
  57. dmx_count += 1
  58. c.append(struct.pack("B",v))
  59. c = b"".join(c)
  60. self._data = c
  61. if port:
  62. self.s.sendto(c, (self.sendto, port)) # default 6454
  63. else:
  64. self.s.sendto(c, (self.sendto, self.portto)) # default 6454
  65. #print(self.v)
  66. time.sleep(0.0001)
  67. return c
  68. def _test_frame(self):
  69. if self.test_stamp+(.01) < time.time():
  70. self.test_stamp = time.time()
  71. #dmx = [0]*512
  72. self.dmx[201-1] = self.v
  73. #self.dmx = dmx
  74. if self.v >= 255:
  75. self.d=0
  76. elif self.v <=0:
  77. self.d=1
  78. if self.d:
  79. self.v+=1
  80. else:
  81. self.v-=1
  82. #print( self.v)
  83. #time.sleep(1/30.)
  84. def next(self):
  85. if self.stamp + (1/30.) < time.time():
  86. self.send()
  87. def artnet_test():
  88. #artnet = ArtNetNode(to="127.0.0.1",port=6555,univ=12)
  89. #artnet = ArtNetNode(to="127.0.0.1",port=6555,univ=0)
  90. artnet = ArtNetNode(to="10.10.10.255",univ=0)
  91. #artnet = ArtNetNode(to="2.0.0.255",univ=0)
  92. #artnet = ArtNetNode(to="10.10.10.255",univ=1)
  93. while 1:
  94. artnet._test_frame()
  95. artnet.next()
  96. time.sleep(0.01)
  97. if __name__ == "__main__":
  98. artnet_test()