From ef06a70925ee136b0af120d2bcfffb96ac8f6979 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Sat, 25 Jan 2025 13:18:27 +0100 Subject: [PATCH] Fix config arg parsing (#14) CLI args always took precedence, even when not provided. Also improve polling interval accuracy. --- b2500/b2500.py | 64 ++++++++++++++++++++++++++++++-------------------- main.py | 20 +++++++++++++--- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/b2500/b2500.py b/b2500/b2500.py index 22c43e7..d9ab73b 100644 --- a/b2500/b2500.py +++ b/b2500/b2500.py @@ -74,6 +74,7 @@ def value(self, value): def udp_server(self): udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_sock.bind(("", self._udp_port)) + print("UDP server is listening...") try: while not self._stop: @@ -81,12 +82,14 @@ def udp_server(self): decoded = data.decode() current_time = time.time() + print(f"Received '{decoded}' ({data.hex()}) from {addr}") if decoded == "hame": if ( addr not in self._last_response_time or (current_time - self._last_response_time[addr]) > self.dedupe_time_window ): + print(f"Received 'hame' from {addr}") response_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) local_ip = udp_sock.getsockname()[0] response_sock.bind((local_ip, 0)) @@ -100,7 +103,8 @@ def udp_server(self): f"Received 'hame' from {addr} but ignored due to dedupe window" ) else: - print(f"Received unknown UDP message: {decoded}") + print(f"Ignoring unknown message") + finally: udp_sock.close() @@ -115,34 +119,42 @@ def handle_tcp_client(self, conn, addr): if self.on_connect: self.on_connect(addr) + last_send_time = 0 while not self._stop: - if self.before_send: - self.before_send(addr) - - with self._value_mutex: - value1, value2, value3 = self.value - - value1 = round(value1) - value2 = round(value2) - value3 = round(value3) - - value1 = abs(value1) - value2 = abs(value2) - value3 = abs(value3) - - message = f"HM:{value1}|{value2}|{value3}" - try: - conn.send(message.encode()) - print(f"Sent message to {addr}: {message}") - if self.after_send: - self.after_send(addr) - - time.sleep(self.poll_interval) - except BrokenPipeError: + current_time = time.time() + time_since_last_send = current_time - last_send_time + + if time_since_last_send >= self.poll_interval: + if self.before_send: + self.before_send(addr) + + with self._value_mutex: + value1, value2, value3 = self.value + + value1 = round(value1) + value2 = round(value2) + value3 = round(value3) + + message = f"HM:{value1}|{value2}|{value3}" + try: + conn.send(message.encode()) + last_send_time = current_time + print(f"Sent message to {addr}: {message}") + if self.after_send: + self.after_send(addr) + + time.sleep(self.poll_interval) + except BrokenPipeError: + print( + f"Connection with {addr} broken. Waiting for a new connection." + ) + break + else: print( - f"Connection with {addr} broken. Waiting for a new connection." + f"Waiting for {self.poll_interval - time_since_last_send} seconds" ) - break + # Sleep a small amount to prevent busy waiting + time.sleep(0.01) else: print(f"Received unknown TCP message: {decoded}") finally: diff --git a/main.py b/main.py index 32d2018..fb7b60b 100644 --- a/main.py +++ b/main.py @@ -32,13 +32,21 @@ def main(): type=str, ) parser.add_argument( - "-s", "--disable-sum", help="Disable sum of all phases", type=bool + "-s", "--disable-sum", help="Disable sum of all phases", type=bool, default=None ) parser.add_argument( - "-a", "--disable-absolute", help="Disable absolute values", type=bool + "-a", + "--disable-absolute", + help="Disable absolute values", + type=bool, + default=None, ) parser.add_argument( - "-t", "--skip-powermeter-test", help="Skip powermeter test on start", type=bool + "-t", + "--skip-powermeter-test", + help="Skip powermeter test on start", + type=bool, + default=None, ) parser.add_argument( "-p", "--poll-interval", help="Poll interval in seconds", type=int @@ -70,6 +78,12 @@ def main(): else cfg.getint("GENERAL", "POLL_INTERVAL", fallback=1) ) + print(f"General Settings:") + print(f"Disable Sum Phases: {disable_sum_phases}") + print(f"Disable Absolute Values: {disable_absolut_values}") + print(f"Skip Test: {skip_test}") + print(f"Poll Interval: {poll_interval}") + # Fetch powermeter values once to check if the configuration is correct if not skip_test: test_powermeter(powermeter)