From 98dbc27835308575a242046a2df7759202324015 Mon Sep 17 00:00:00 2001 From: Hofei Date: Mon, 30 Dec 2019 14:44:30 +0100 Subject: [PATCH] =?UTF-8?q?Logging=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++ setup_logging.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ uhr.py | 20 ++++++++++-- uhr.service | 10 ++++++ 4 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 README.md create mode 100644 setup_logging.py create mode 100644 uhr.service diff --git a/README.md b/README.md new file mode 100644 index 0000000..592caf2 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Uhr + +## Benötigte Software + + apt install iputils-arping python3-systemd + + +Pythonmodule + + sudo pip3 install toml gpiozero adafruit-circuitpython-neopixel \ No newline at end of file diff --git a/setup_logging.py b/setup_logging.py new file mode 100644 index 0000000..8b0817a --- /dev/null +++ b/setup_logging.py @@ -0,0 +1,81 @@ +#!/usr/bin/python3 +""" +Beschreibung: +Hilfskript zum Erstellen einer logging Instanz in Abhängigkeit, ob das Skript manuell gestartet worden ist oder +ob das Skript per Service Unit gestartet wurde +Abhängig dessen wird entweder die Logging Instanz mit einem JournalHandler erstellt (Service Unit) +oder mit einem StreamHandler (manuell) +Author: Hofei +Datum: 03.08.2018 +Version: 0.1 +""" +import logging +import os +import shlex +import subprocess + +from systemd import journal + + +def __setup_logging(loglevel, frm, startmethode, unitname): + """ + Erstellt die Logger Instanz für das Skript + """ + logger = logging.getLogger() + logger.setLevel(loglevel) + logger.handlers = [] + if startmethode == "auto": + log_handler = journal.JournalHandler(SYSLOG_IDENTIFIER=unitname) + + else: + log_handler = logging.StreamHandler() + log_handler.setLevel(loglevel) + log_handler.setFormatter(frm) + logger.addHandler(log_handler) + return logger + + +def __get_service_unit_pid(unitname): + """Ermittelt ob das ausführende Skript mit einer Service Unit gestartet worden ist, wenn ja so ist das + Ergebnis (pid_service_unit) != 0""" + cmd = "systemctl show -p MainPID {}".format(unitname) + cmd = shlex.split(cmd) + antwort = subprocess.run(cmd, stdout=subprocess.PIPE) + ausgabe = antwort.stdout + # strip entfernt \n, split teilt am = in eine Liste und [1] weißt die Zahl in die Variable zu + pid_service_unit = int(ausgabe.decode().strip().split("=")[1]) + return pid_service_unit + + +def __get_startmethode(unitname): + """Verglicht die PID vom skript mit der pid Service Unit Prüfung + wenn die Nummern gleich sind wird auf auto gestellt, wenn nicht auf manuell""" + pid_service_unit = __get_service_unit_pid(unitname) + pid_skript = os.getpid() + if pid_service_unit == pid_skript: + startmethode = "auto" + else: + startmethode = "manuell" + return startmethode + + +def __set_loggerformat(startmethode): + """Stellt die passende Formattierung ein""" + if startmethode == "auto": + frm = logging.Formatter("%(levelname)s: %(message)s", "%d.%m.%Y %H:%M:%S") + else: + frm = logging.Formatter("%(asctime)s %(levelname)s: %(message)s", "%d.%m.%Y %H:%M:%S") + return frm + + +def create_logger(unitname, loglevel): + """Dies ist die aufzurufende Funktion bei der Verwendung des Moduls von außen + Liefert die fertige Logging Instanz zurück""" + startmethode = __get_startmethode(unitname) + frm = __set_loggerformat(startmethode) + return __setup_logging(loglevel, frm, startmethode, unitname) + + +if __name__ == "__main__": + logger = create_logger("testunit", 10) + logger.debug("Testnachricht") \ No newline at end of file diff --git a/uhr.py b/uhr.py index 7839784..92aefc7 100644 --- a/uhr.py +++ b/uhr.py @@ -13,6 +13,9 @@ import toml import neopixel import board +import setup_logging + + SKRIPTPFAD = os.path.abspath(os.path.dirname(__file__)) @@ -24,7 +27,7 @@ def load_config(pfad=SKRIPTPFAD): CONFIG = load_config() - +LOGGER = setup_logging.create_logger("uhr", CONFIG["loglevel"]) # LED strip configuration LED_COUNT = 60 # Number of LED pixels. LED_PIN = board.D18 # GPIO pin connected to the pixels (must support PWM!). @@ -63,11 +66,13 @@ class Uhr: self.mode_geaendert = now alle_led(0, 0, 0, self.pixels) self.mode_control(now) + LOGGER.info(f"Mode geändert auf: {self.mode} um {self.mode_geaendert}Uhr") def set_helligkeit(self, helligkeit): self.helligkeit = helligkeit self.pixels.brightness = self.helligkeit self.helligkeit_geaendert = datetime.datetime.now() + LOGGER.info(f"Helligkeit geändert auf: {self.helligkeit} um {self.helligkeit_geaendert}Uhr") def helligkeit_erhoehen(self): self.helligkeit += 0.05 @@ -119,7 +124,12 @@ class Uhr: sonstige_leds = [0] leer_leds = [0] rgbdict = self.rgb_farben_lesen() - + LOGGER.debug(f"stunden_leds: {stunden_leds}\n" + f"minuten_leds: {minuten_leds}\n" + f"sekunden_leds: {sekunden_leds}\n" + f"leer_leds: {leer_leds}\n" + f"sonstige_leds: {sonstige_leds}\n" + f"rgbdict: {rgbdict}") led_setzen(stunden_leds, minuten_leds, sekunden_leds, leer_leds, sonstige_leds, rgbdict, self.pixels) @@ -133,6 +143,7 @@ def config_schreiben(pfad=SKRIPTPFAD): configfile = os.path.join(pfad, "uhr_cfg.toml") with open(configfile, "w") as conffile: conffile.write(toml.dumps(CONFIG)) + LOGGER.info(f"Schreibe Config: {CONFIG}") def alle_led(r, g, b, pixels): @@ -273,6 +284,7 @@ def check_anwesenheit(uhr, pixels): """pingt die IP 2x an return (0 | !0) 0 wenn erreichbar""" befehl = "ping -c2 -W1 {}".format(ip) + LOGGER.debug(f"Pinge: {befehl}") cmd = shlex.split(befehl) return subprocess.call(cmd) @@ -280,6 +292,7 @@ def check_anwesenheit(uhr, pixels): """pingt die IP 2x an return (0 | !0) 0 wenn erreichbar""" befehl = "sudo /usr/bin/l2ping -c1 -t1 {}".format(bt) + LOGGER.debug(f"Pinge: {befehl}") cmd = shlex.split(befehl) return subprocess.call(cmd) @@ -288,6 +301,7 @@ def check_anwesenheit(uhr, pixels): return (0 | !0) 0 wenn erreichbar """ befehl = "/usr/bin/arping -q -c 3 -w 10 -b -f -I {interface} {ip}".format(interface=interface, ip=ip) + LOGGER.debug(f"Pinge: {befehl}") cmd = shlex.split(befehl) return subprocess.call(cmd) @@ -324,7 +338,7 @@ def check_anwesenheit(uhr, pixels): elif not status["anwesend"] and not status["dimmen"]: # Wenn kein Geraet erreichbar ist if len(status_anwesend_liste) < ABSCHALTWERT + 1: status_anwesend_liste.append(status["anwesend"]) - print("Nichts los daheim die ", len(status_anwesend_liste), ".") + LOGGER.debug(f"Nichts los daheim die {len(status_anwesend_liste)}.") if len(status_anwesend_liste) > ABSCHALTWERT: helligkeit = 0 if status["dimmen"]: diff --git a/uhr.service b/uhr.service new file mode 100644 index 0000000..20c137c --- /dev/null +++ b/uhr.service @@ -0,0 +1,10 @@ +# /etc/systemd/system/uhr.service +[Unit] +Description=Uhr starten + +[Service] +Type=simple +ExecStart=/usr/bin/python3 /home/pi/uhr/uhr.py + +[Install] +WantedBy=multi-user.target \ No newline at end of file