@@ -179,7 +179,10 @@ def send_dmx_data(self, universe_id: int, dmx_data: bytearray) -> bool:
179179 # Start streaming task if not already running
180180 if universe_state .stream_task is None or universe_state .stream_task .done ():
181181 log .debug (f"Universe { universe_id } : creating new streaming task" )
182- universe_state .stream_task = self .hass .async_create_task (self ._stream_universe_data (universe_id ))
182+ universe_state .stream_task = self .hass .async_create_background_task (
183+ self ._stream_universe_data (universe_id ),
184+ name = f"sACN stream universe { universe_id } " ,
185+ )
183186
184187 self .hass .async_create_task (self ._send_pending_frame (universe_id ))
185188
@@ -394,32 +397,42 @@ def datagram_received(self, data: bytes, addr: tuple[str, int]) -> None:
394397 try :
395398 packet = SacnPacket .deserialize (data )
396399
397- if packet .universe in self .subscribed_universes :
398- log .debug (
399- f"Received sACN data for universe { packet .universe } from { addr [0 ]} "
400- f"(source: '{ packet .source_name } ', seq: { packet .sequence_number } , "
401- f"priority: { packet .priority } , channels: { len (packet .dmx_data )} )"
402- )
403-
404- # Ignore packets from our own sACN server to prevent feedback loops
405- if self .own_source_name and packet .source_name == self .own_source_name :
406- return
407-
408- if self .data_callback :
409- port_address = PortAddress (0 , 0 , packet .universe )
410- self .data_callback (port_address , packet .dmx_data , packet .source_name )
411- else :
412- log .warning ("No data callback configured for sACN receiver" )
400+ if packet .start_code == 0x00 :
401+ self ._handle_dmx_packet (packet , addr )
413402 else :
414403 log .debug (
415- f"Ignoring sACN data for universe { packet . universe } from { addr [ 0 ] } "
416- f"(not subscribed, subscribed universes: { self . subscribed_universes } )"
404+ f"Ignoring sACN packet with unsupported start code 0x { packet . start_code :02X } "
405+ f"for universe { packet . universe } from { addr [ 0 ] } (source: ' { packet . source_name } ' )"
417406 )
418407
419408 except Exception as e :
420409 log .warning (f"Error processing sACN packet from { addr [0 ]} :{ addr [1 ]} ({ len (data )} bytes): { e } " )
421410 log .debug (f"Raw packet data: { data [:50 ].hex ()} { '...' if len (data ) > 50 else '' } " )
422411
412+ def _handle_dmx_packet (self , packet : SacnPacket , addr : tuple [str , int ]) -> None :
413+ """Handle a DMX512-A data packet (start code 0x00)."""
414+ if self .own_source_name and packet .source_name == self .own_source_name :
415+ return
416+
417+ if packet .universe not in self .subscribed_universes :
418+ log .debug (
419+ f"Ignoring sACN data for universe { packet .universe } from { addr [0 ]} "
420+ f"(not subscribed, subscribed universes: { self .subscribed_universes } )"
421+ )
422+ return
423+
424+ log .debug (
425+ f"Received sACN DMX data for universe { packet .universe } from { addr [0 ]} "
426+ f"(source: '{ packet .source_name } ', seq: { packet .sequence_number } , "
427+ f"priority: { packet .priority } , channels: { len (packet .channel_data )} )"
428+ )
429+
430+ if self .data_callback :
431+ port_address = PortAddress (0 , 0 , packet .universe )
432+ self .data_callback (port_address , packet .channel_data , packet .source_name )
433+ else :
434+ log .warning ("No data callback configured for sACN receiver" )
435+
423436 def subscribe_universe (self , universe_id : int ) -> None :
424437 if not (1 <= universe_id <= 63999 ):
425438 log .error (f"Invalid universe ID: { universe_id } " )
0 commit comments