66import os
77import re
88from typing import Optional
9+ from dotenv import load_dotenv
910
1011from signalduino .constants import SDUINO_CMD_TIMEOUT
1112from signalduino .controller import SignalduinoController
1213from signalduino .transport import SerialTransport , TCPTransport
1314from signalduino .types import DecodedMessage
1415
1516# Konfiguration des Loggings
16- logging .basicConfig (
17- level = logging .INFO ,
18- format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ,
19- handlers = [
20- logging .StreamHandler (sys .stdout )
21- ]
22- )
17+ def initialize_logging (log_level_str : str ):
18+ """Initialisiert das Logging basierend auf dem übergebenen String."""
19+ level = getattr (logging , log_level_str .upper (), logging .INFO )
20+
21+ # Konfiguration des Loggings
22+ logging .basicConfig (
23+ level = level ,
24+ format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ,
25+ handlers = [
26+ logging .StreamHandler (sys .stdout )
27+ ]
28+ )
29+
30+ # Initialisiere das Logging mit dem LOG_LEVEL aus der Umgebungsvariable (falls vorhanden)
31+ initialize_logging (os .environ .get ("LOG_LEVEL" , "INFO" ))
2332
2433logger = logging .getLogger ("main" )
2534
@@ -46,39 +55,55 @@ def message_callback(message: DecodedMessage):
4655 print ("=" * 50 + "\n " )
4756
4857def main ():
58+ # .env-Datei laden. Umgebungsvariablen werden gesetzt, aber CLI-Argumente überschreiben diese.
59+ load_dotenv ()
60+
61+ # ENV-Variablen für Standardwerte abrufen
62+ # Transport
63+ DEFAULT_SERIAL_PORT = os .environ .get ("SIGNALDUINO_SERIAL_PORT" )
64+ DEFAULT_TCP_HOST = os .environ .get ("SIGNALDUINO_TCP_HOST" )
65+ DEFAULT_BAUD = int (os .environ .get ("SIGNALDUINO_BAUD" , 57600 ))
66+ DEFAULT_TCP_PORT = int (os .environ .get ("SIGNALDUINO_TCP_PORT" , 23 ))
67+
68+ # MQTT
69+ DEFAULT_MQTT_HOST = os .environ .get ("MQTT_HOST" )
70+ DEFAULT_MQTT_PORT = int (os .environ .get ("MQTT_PORT" , 1883 )) if os .environ .get ("MQTT_PORT" ) else None
71+ DEFAULT_MQTT_USERNAME = os .environ .get ("MQTT_USERNAME" )
72+ DEFAULT_MQTT_PASSWORD = os .environ .get ("MQTT_PASSWORD" )
73+ DEFAULT_MQTT_TOPIC = os .environ .get ("MQTT_TOPIC" )
74+
75+ # Logging
76+ DEFAULT_LOG_LEVEL = os .environ .get ("LOG_LEVEL" , "INFO" )
77+
4978 parser = argparse .ArgumentParser (description = "Signalduino Python Controller" )
5079
5180 # Verbindungseinstellungen
52- group = parser .add_mutually_exclusive_group (required = True )
53- group .add_argument ("--serial" , help = "Serieller Port (z.B. /dev/ttyUSB0)" )
54- group .add_argument ("--tcp" , help = "TCP Host (z.B. 192.168.1.10)" )
81+ # required=True entfernt, da Konfiguration aus ENV stammen kann
82+ group = parser .add_mutually_exclusive_group (required = False )
83+ group .add_argument ("--serial" , default = DEFAULT_SERIAL_PORT , help = f"Serieller Port (z.B. /dev/ttyUSB0). Standard: { DEFAULT_SERIAL_PORT or 'Kein Default' } " )
84+ group .add_argument ("--tcp" , default = DEFAULT_TCP_HOST , help = f"TCP Host (z.B. 192.168.1.10). Standard: { DEFAULT_TCP_HOST or 'Kein Default' } " )
5585
56- parser .add_argument ("--baud" , type = int , default = 57600 , help = "Baudrate für serielle Verbindung (Standard: 57600)" )
57- parser .add_argument ("--port" , type = int , default = 23 , help = "Port für TCP Verbindung (Standard: 23)" )
58- parser .add_argument ("--debug" , action = "store_true" , help = "Debug-Logging aktivieren" )
86+ parser .add_argument ("--baud" , type = int , default = DEFAULT_BAUD , help = f"Baudrate für serielle Verbindung (Standard: { DEFAULT_BAUD } )" )
87+ parser .add_argument ("--port" , type = int , default = DEFAULT_TCP_PORT , help = f"Port für TCP Verbindung (Standard: { DEFAULT_TCP_PORT } )" )
5988
60- # MQTT Einstellungen (optional via CLI, sonst via ENV)
61- parser .add_argument ("--mqtt-host" , help = "MQTT Broker Host" )
62- parser .add_argument ("--mqtt-port" , type = int , help = "MQTT Broker Port" )
63- parser .add_argument ("--mqtt-username" , help = "MQTT Broker Benutzername" )
64- parser .add_argument ("--mqtt-password" , help = "MQTT Broker Passwort" )
89+ # MQTT Einstellungen
90+ parser .add_argument ("--mqtt-host" , default = DEFAULT_MQTT_HOST , help = f"MQTT Broker Host. Standard: { DEFAULT_MQTT_HOST or 'Kein Default' } " )
91+ parser .add_argument ("--mqtt-port" , type = int , default = DEFAULT_MQTT_PORT , help = f"MQTT Broker Port. Standard: { DEFAULT_MQTT_PORT or 'Kein Default' } " )
92+ parser .add_argument ("--mqtt-username" , default = DEFAULT_MQTT_USERNAME , help = f"MQTT Broker Benutzername. Standard: { '*Vorhanden*' if DEFAULT_MQTT_USERNAME else 'Kein Default' } " )
93+ parser .add_argument ("--mqtt-password" , default = DEFAULT_MQTT_PASSWORD , help = f"MQTT Broker Passwort. Standard: { '*Vorhanden*' if DEFAULT_MQTT_PASSWORD else 'Kein Default' } " )
94+ parser .add_argument ("--mqtt-topic" , default = DEFAULT_MQTT_TOPIC , help = f"MQTT Basis Topic. Standard: { DEFAULT_MQTT_TOPIC or 'Kein Default' } " )
95+
96+ # Logging Einstellung
97+ parser .add_argument ("--log-level" , default = DEFAULT_LOG_LEVEL , choices = ["DEBUG" , "INFO" , "WARNING" , "ERROR" , "CRITICAL" ], help = f"Logging Level. Standard: { DEFAULT_LOG_LEVEL } " )
6598
6699 args = parser .parse_args ()
67100
68- # Logging Level anpassen
69- if args .debug :
70- logging .getLogger ().setLevel (logging .DEBUG )
71- logger .debug ("Debug-Modus aktiviert" )
72-
73- # MQTT Umgebungsvariablen setzen, falls über CLI übergeben
74- if args .mqtt_host :
75- os .environ ["MQTT_HOST" ] = args .mqtt_host
76- if args .mqtt_port :
77- os .environ ["MQTT_PORT" ] = str (args .mqtt_port )
78- if args .mqtt_username :
79- os .environ ["MQTT_USERNAME" ] = args .mqtt_username
80- if args .mqtt_password :
81- os .environ ["MQTT_PASSWORD" ] = args .mqtt_password
101+ # Logging Level anpassen (aus CLI oder ENV Default)
102+ if args .log_level .upper () != DEFAULT_LOG_LEVEL :
103+ initialize_logging (args .log_level )
104+ logger .debug (f"Logging Level auf { args .log_level .upper ()} angepasst." )
105+
106+ # Manuelle Zuweisung von MQTT ENV Variablen ist nicht mehr nötig, da argparse sie für die gesamte Laufzeit setzt
82107
83108 # Transport initialisieren
84109 transport = None
@@ -89,8 +114,9 @@ def main():
89114 logger .info (f"Initialisiere TCP Verbindung zu { args .tcp } :{ args .port } ..." )
90115 transport = TCPTransport (host = args .tcp , port = args .port )
91116
117+ # Wenn weder --serial noch --tcp (oder deren ENV-Defaults) gesetzt sind
92118 if not transport :
93- logger .error ("Kein gültiger Transport konfiguriert." )
119+ logger .error ("Kein gültiger Transport konfiguriert. Bitte geben Sie --serial oder --tcp an oder setzen Sie SIGNALDUINO_SERIAL_PORT / SIGNALDUINO_TCP_HOST in der Umgebung. " )
94120 sys .exit (1 )
95121
96122 # Controller initialisieren
@@ -124,7 +150,7 @@ def signal_handler(sig, frame):
124150 version = controller .send_command (
125151 "V" ,
126152 expect_response = True ,
127- timeout = SDUINO_CMD_TIMEOUT ,
153+ timeout = 15.0 , # Erhöhe den Timeout für den initialen V-Befehl
128154 response_pattern = version_pattern ,
129155 )
130156 if version :
0 commit comments