Skip to content

Commit cf8bf3c

Browse files
committed
feature: Konfiguration mittels Umgebungsvariablen
1 parent 18c4db9 commit cf8bf3c

2 files changed

Lines changed: 62 additions & 35 deletions

File tree

main.py

Lines changed: 60 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,29 @@
66
import os
77
import re
88
from typing import Optional
9+
from dotenv import load_dotenv
910

1011
from signalduino.constants import SDUINO_CMD_TIMEOUT
1112
from signalduino.controller import SignalduinoController
1213
from signalduino.transport import SerialTransport, TCPTransport
1314
from 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

2433
logger = logging.getLogger("main")
2534

@@ -46,39 +55,55 @@ def message_callback(message: DecodedMessage):
4655
print("="*50 + "\n")
4756

4857
def 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:

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pyserial
22
requests
3-
paho-mqtt
3+
paho-mqtt
4+
python-dotenv

0 commit comments

Comments
 (0)