From 4c6689007dc085539e221ec903c0cd0f39e4abc7 Mon Sep 17 00:00:00 2001 From: DasMoorhuhn Date: Wed, 28 Aug 2024 22:06:50 +0200 Subject: [PATCH] Replace prints with logger --- .env | 0 Dockerfile | 2 +- python/src/ble_discovery.py | 10 ++++++---- python/src/check_update.py | 17 +++++++++-------- python/src/find_gateways.py | 36 +++++++++++++++++++----------------- python/src/log_data.py | 8 +++++--- python/src/logger.py | 18 ++++++++++++++++++ python/src/loop.py | 4 +++- python/src/main.py | 25 +++++++++++++------------ 9 files changed, 74 insertions(+), 46 deletions(-) create mode 100644 .env create mode 100644 python/src/logger.py diff --git a/.env b/.env new file mode 100644 index 0000000..e69de29 diff --git a/Dockerfile b/Dockerfile index 7fb1781..c795367 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,7 +38,7 @@ FROM python:3.12-alpine3.20 WORKDIR /src COPY ./python/src/ . COPY ./python/docker_entrypoint.sh / -RUN mkdir data +RUN mkdir -p data/log VOLUME /src/data RUN apk add --no-cache sudo bluez tzdata diff --git a/python/src/ble_discovery.py b/python/src/ble_discovery.py index 7d8b17f..5cecc10 100644 --- a/python/src/ble_discovery.py +++ b/python/src/ble_discovery.py @@ -3,6 +3,8 @@ from bluepy.btle import Scanner from data_class import Data from devices import get_device +from logger import get_logger +logger = get_logger(__name__) # This is the list, where the responses will be stored from the `handleDiscovery` devices = [] @@ -38,9 +40,9 @@ class ScanDelegate(DefaultDelegate): device_from_config = get_device(dev) - try:print(f"Device: {dev.addr.upper()} ({dev.addrType}), RSSI: {dev.rssi}dB, Room: {device_from_config.room}") - except:print(f"Device: {dev.addr.upper()} ({dev.addrType}), RSSI: {dev.rssi}dB, Room: ?") - print(f'\tTemp: {data_obj.temperature}°C, Humid: {data_obj.humidity}%, Batt: {data_obj.battery_percent}%\n') + try:logger.info(f"Device: {dev.addr.upper()} ({dev.addrType}), RSSI: {dev.rssi}dB, Room: {device_from_config.room}") + except:logger.info(f"Device: {dev.addr.upper()} ({dev.addrType}), RSSI: {dev.rssi}dB, Room: ?") + logger.info(f'\tTemp: {data_obj.temperature}°C, Humid: {data_obj.humidity}%, Batt: {data_obj.battery_percent}%') return True @@ -52,7 +54,7 @@ def cleanup(): def start_discovery(timeout=20): cleanup() global devices - print(f'Start discovery with timout {timeout}s...') + logger.info(f'Start discovery with timout {timeout}s...') scanner = Scanner().withDelegate(ScanDelegate()) scanner.scan(timeout=timeout, passive=False) diff --git a/python/src/check_update.py b/python/src/check_update.py index 63759f3..9efb65a 100644 --- a/python/src/check_update.py +++ b/python/src/check_update.py @@ -1,8 +1,10 @@ import os import json import requests +from logger import get_logger -DEBUG = True if os.environ.get('DEBUG') is not None else False +DEBUG = os.getenv('DEBUG') == 'true' +logger = get_logger(__name__) class State: @@ -28,7 +30,7 @@ class Release: def check_for_update(): try: version_current = int(os.getenv('VERSION').replace("-", "")) except: - print("Error getting current version") + logger.error("Error getting current version") return project_id = 58341398 request = f"https://gitlab.com/api/v4/projects/{project_id}/releases" @@ -43,7 +45,7 @@ def check_for_update(): if release.version_int > latest[0]: latest[0] = release.version_int latest[1] = release - print(repr(latest)) if DEBUG else {} + logger.debug(repr(latest)) release = latest[1] if release.version_int > version_current: @@ -64,11 +66,10 @@ def check_for_update(): def print_state(state:State): if state is None: return - print(f"Current version: {os.getenv('VERSION')}") + logger.info(f"Current version: {os.getenv('VERSION')}") if state.update_available: - print(f"Update available: {state.version_str}") + logger.info(f"Update available: {state.version_str}") if state.up_to_date: - print(f"Up to date") + logger.info(f"Up to date") if state.development: - print(f"Development Version") - print("") + logger.info(f"Development Version") diff --git a/python/src/find_gateways.py b/python/src/find_gateways.py index 969c194..481bac9 100644 --- a/python/src/find_gateways.py +++ b/python/src/find_gateways.py @@ -4,18 +4,20 @@ import os import FindMyIP from socket import * from helpers import get_unix_time +from logger import get_logger DEBUG = True if os.environ.get('DEBUG') is not None else False DISCOVERY_ACK = 'IP_DISCOVERY_ACK'.encode() # ACK for broadcast DISCOVERY_RSP_GTW = 'IP_DISCOVERY_RSP_GTW'.encode() # RSP for gateway DISCOVERY_RSP_MSH = 'IP_DISCOVERY_RSP_MSH'.encode() # RSP for mesh -DISCOVERY_TIMEOUT = 20 -SOCKET_TIMEOUT = 5 +DISCOVERY_TIMEOUT = 1 +SOCKET_TIMEOUT = 0.2 PORT_SERVER = 9434 PORT_CLIENT = 9435 def start_discovery_server(): + logger = get_logger(__name__) sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) @@ -23,22 +25,22 @@ def start_discovery_server(): local_ip = FindMyIP.internal() try: sock.bind(server_address) - print("Started discovery socket") + logger.info("Started discovery socket") while True: data, addr = sock.recvfrom(4096) - print(f"Received a packet from {addr}") - print(f"{addr[0]} | {local_ip}") - print(f"{data} | {DISCOVERY_ACK}") + logger.debug(f"Received a packet from {addr}") + logger.debug(f"{addr[0]} | {local_ip}") + logger.debug(f"{data} | {DISCOVERY_ACK}") if data == DISCOVERY_ACK: - print("ACK accepted") + logger.debug("ACK accepted") if str(addr[0]) == str(local_ip): continue - print("IP accepted") + logger.debug("IP accepted") sock.sendto(DISCOVERY_RSP_GTW, (addr[0], PORT_CLIENT)) - print(f"Send ACK to {addr}") + logger.debug(f"Send ACK to {addr}") except Exception as err: - print(err) + logger.error(err) sock.close() @@ -49,27 +51,27 @@ def start_discovery_client(): sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) sock.settimeout(SOCKET_TIMEOUT) server_address = ('255.255.255.255', PORT_SERVER) - local_ip = FindMyIP.internal() start_time_stamp = get_unix_time() delta = round(get_unix_time() - start_time_stamp, 2) discovered_devices = [] try: sock.bind(('', PORT_CLIENT)) - while True: + while delta <= DISCOVERY_TIMEOUT: delta = round(get_unix_time() - start_time_stamp, 2) - print(delta) sock.sendto(DISCOVERY_ACK, server_address) data, addr = sock.recvfrom(4096) - print('IP: ' + str(addr[0])) - if data == DISCOVERY_RSP_GTW or data == DISCOVERY_RSP_GTW and addr[0] not in discovered_devices: + if data == DISCOVERY_RSP_GTW or data == DISCOVERY_RSP_MSH: + if str(addr[0]) in discovered_devices: continue print('IP: ' + str(addr[0])) - discovered_devices.append(addr[0]) + discovered_devices.append(str(addr[0])) except Exception as err: print(err) finally: sock.close() + return discovered_devices -# start_discovery_client() +# devices = start_discovery_client() +# print(f"Devices: {devices}") diff --git a/python/src/log_data.py b/python/src/log_data.py index a198d52..032471a 100644 --- a/python/src/log_data.py +++ b/python/src/log_data.py @@ -3,8 +3,10 @@ import sys import json from data_class import Data from devices import Device +from logger import get_logger +logger = get_logger(__name__) -DEBUG = True if os.getenv('DEBUG') == 'true' else False +DEBUG = os.getenv('DEBUG') == 'true' def log_to_json(devices): @@ -15,7 +17,7 @@ def log_to_json(devices): data_obj: Data from_config: Device file_name = f'{workdir}/data/{str(data_obj.mac).replace(":", "-")}.json' - print(file_name) if DEBUG else {} + logger.debug(f"Save to {file_name}") try: with open(file_name, 'r') as file: data = json.load(file) @@ -35,7 +37,7 @@ def log_to_json(devices): } data.append(measurements) - print(measurements) if DEBUG else {} + logger.debug(measurements) with open(file_name, 'w') as file: file.write(json.dumps(data, indent=2)) diff --git a/python/src/logger.py b/python/src/logger.py new file mode 100644 index 0000000..8dfc870 --- /dev/null +++ b/python/src/logger.py @@ -0,0 +1,18 @@ +import os +import logging + + +def get_logger(logger_name:str, log_file='gateway.log'): + logger_name = logger_name.replace('__', '') + DEBUG = os.getenv('DEBUG') == 'true' + logger = logging.getLogger(logger_name) + logger.setLevel(logging.DEBUG) if DEBUG else logger.setLevel(logging.INFO) + handler = logging.FileHandler(filename=f'data/{log_file}', encoding='utf-8', mode='a') + formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(name)s|:%(message)s') + handler.setFormatter(formatter) + stream_handler = logging.StreamHandler() + stream_handler.setFormatter(formatter) + logger.addHandler(stream_handler) + logger.addHandler(handler) + logger.info(f"Logger {logger_name} init done") + return logger diff --git a/python/src/loop.py b/python/src/loop.py index d3625f5..b75c2bf 100644 --- a/python/src/loop.py +++ b/python/src/loop.py @@ -1,10 +1,12 @@ from time import sleep from log_data import log_to_json from ble_discovery import start_discovery +from logger import get_logger +logger = get_logger(__name__) def start_loop(interval=40, timeout=20): - print(f"Starting loop with interval {interval}s") + logger.info(f"Starting loop with interval {interval}s") while True: devices = start_discovery(timeout=timeout) log_to_json(devices) diff --git a/python/src/main.py b/python/src/main.py index 0f7ecac..7b0cdf9 100644 --- a/python/src/main.py +++ b/python/src/main.py @@ -1,4 +1,5 @@ import os +from logger import get_logger from ble_discovery import start_discovery from log_data import log_to_json from loop import start_loop @@ -7,27 +8,27 @@ from check_update import print_state INTERVAL = 40 TIMEOUT = 20 -DOCKER = True if os.getenv('DOCKER') == 'true' else False -DEBUG = True if os.getenv('DEBUG') == 'true' else False +DOCKER = os.getenv('DOCKER') == 'true' +DEBUG = os.getenv('DEBUG') == 'true' interval = os.getenv('LOOP') timeout = os.getenv('TIMEOUT') -if DEBUG: - print(f"INTERVAL: {INTERVAL}") - print(f"TIMEOUT: {TIMEOUT}") - print(f"interval: {interval}") - print(f"timeout: {timeout}") - print(f"DOCKER: {DOCKER}") - print(f"DEBUG: {DEBUG}") - print(f"VERSION: {os.getenv('VERSION')}") - print("") +logger = get_logger(__name__) + +logger.debug(f"INTERVAL: {INTERVAL}") +logger.debug(f"TIMEOUT: {TIMEOUT}") +logger.debug(f"interval: {interval}") +logger.debug(f"timeout: {timeout}") +logger.debug(f"DOCKER: {DOCKER}") +logger.debug(f"DEBUG: {DEBUG}") +logger.debug(f"VERSION: {os.getenv('VERSION')}") update_state = check_for_update() print_state(update_state) if DOCKER: - print("Running in docker") + logger.info('Running in Docker') try:INTERVAL = int(interval) except:pass