Skip to content

Commit 498b584

Browse files
committed
slight refactoring
added __eq__ and __hash__ implementations to Controller discovery is now executed multiple times internally to improve result consistency and accuracy
1 parent 7eb39f1 commit 498b584

File tree

2 files changed

+59
-29
lines changed

2 files changed

+59
-29
lines changed

sunix_ledstrip_controller_client/client.py

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,47 +32,71 @@ def discover_controllers(self) -> [Controller]:
3232
"""
3333
discovered_controllers = []
3434

35-
cs = socket.socket(AF_INET, SOCK_DGRAM)
36-
cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
37-
cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
35+
# use discovery multiple times as controllers sometimes just don't respond
36+
for i in range(3):
37+
discovered_controllers = self.__merge_controllers(
38+
self._discover_controllers(),
39+
discovered_controllers)
3840

39-
# send a local broadcast via udp with a "magic packet"
40-
cs.sendto(self._discovery_message, ('255.255.255.255', self._discovery_port))
41+
return discovered_controllers
4142

42-
cs.setblocking(True)
43-
cs.settimeout(1)
44-
received_messages = []
45-
try:
46-
while True:
47-
data, address = cs.recvfrom(4096)
48-
received_messages.append(data.decode())
43+
@staticmethod
44+
def __merge_controllers(new, old) -> [Controller]:
45+
merged = set(new)
46+
merged.update(old)
4947

50-
except socket.timeout:
51-
if len(received_messages) <= 0:
52-
return discovered_controllers
48+
return list(merged)
5349

54-
for message in received_messages:
55-
try:
56-
# parse received message
57-
data = str.split(message, ",")
50+
def _discover_controllers(self) -> [Controller]:
51+
"""
52+
Internally used discovery method
53+
:return: list of discovered devices
54+
"""
55+
56+
discovered_controllers = []
57+
with socket.socket(AF_INET, SOCK_DGRAM) as cs:
58+
cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
59+
cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
5860

59-
# check validity
60-
if len(data) == 3:
61-
# extract data
62-
ip = data[0]
63-
hw_id = data[1]
64-
model = data[2]
61+
# send a local broadcast via udp with a "magic packet"
62+
cs.sendto(self._discovery_message, ('255.255.255.255', self._discovery_port))
6563

66-
# create a Controller object representation
67-
controller = Controller(self, ip, Controller.DEFAULT_PORT, hw_id, model)
68-
print(controller)
64+
cs.setblocking(True)
65+
cs.settimeout(1)
66+
received_messages = []
67+
try:
68+
while True:
69+
data, address = cs.recvfrom(4096)
70+
received_messages.append(data.decode())
71+
72+
except socket.timeout:
73+
if len(received_messages) <= 0:
74+
return []
6975

70-
discovered_controllers.append(controller)
76+
for message in received_messages:
77+
try:
78+
controller = self._parse_discovery_response(message)
79+
discovered_controllers.append(controller)
7180
except:
7281
print("Error parsing discovery message: %s" % message)
82+
return None
7383

7484
return discovered_controllers
7585

86+
def _parse_discovery_response(self, message: str) -> Controller or None:
87+
# parse received message
88+
data = str.split(message, ",")
89+
90+
# check validity
91+
if len(data) == 3:
92+
# extract data
93+
ip = data[0]
94+
hw_id = data[1]
95+
model = data[2]
96+
97+
# create a Controller object representation
98+
return Controller(self, ip, Controller.DEFAULT_PORT, hw_id, model)
99+
76100
def get_time(self, host: str, port: int) -> datetime:
77101
"""
78102
Receives the current time of the specified controller

sunix_ledstrip_controller_client/controller.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ def __init__(self, api: 'LEDStripControllerClient', host: str, port: int = DEFAU
5050

5151
self.update_state()
5252

53+
def __hash__(self):
54+
return hash((self._host, self._port, self._device_name, self._hardware_id))
55+
56+
def __eq__(self, other):
57+
return other is not None and self._host == other.get_host() and self._port == other._port and self._device_name == other._device_name and self._hardware_id == other._hardware_id
58+
5359
def __str__(self):
5460
return ("Host: %s\n" % (self.get_host()) +
5561
"Port: %s\n" % (self.get_port()) +

0 commit comments

Comments
 (0)