diff --git a/uhr.py b/uhr.py index d77c080..0feb723 100644 --- a/uhr.py +++ b/uhr.py @@ -1,33 +1,25 @@ #!/usr/bin/python3 -from datetime import datetime -from datetime import timedelta -import sys -import time +import datetime +import os import shlex import subprocess -import toml -import os +import sys import threading +import time + import gpiozero -import signal -sys.path.append("/home/pi/rpi_ws281x") -from neopixel import * +import toml +import neopixel +import board -# # # # # # # # # # -# LED strip configuration: -# # # # # # # # # # +# LED strip configuration LED_COUNT = 60 # Number of LED pixels. -LED_PIN = 18 # GPIO pin connected to the pixels (must support PWM!). +LED_PIN = board.D18 # GPIO pin connected to the pixels (must support PWM!). LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz) -LED_DMA = 5 # DMA channel to use for generating signal (try 5) -LED_INVERT = False # True to invert the signal (when using NPN transistor level shift) -LED_BRIGHTNESS = 4 # Set to 0 for darkest and 255 for brightest -LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53 -LED_STRIP = ws.WS2811_STRIP_GRB # Strip type and colour ordering - -standard_helligkeit = LED_BRIGHTNESS +LED_PIXEL_ORDER = neopixel.GRB # Strip type and colour ordering +LED_BRIGHTNESS = 0.2 # Zahl stellt den Wert in Minuten dar, wie lange kein Gerät erreichbar sein darf dass die Uhr "abgeschalten" wird ABSCHALTWERT = 4 @@ -51,9 +43,9 @@ stdliste = [std0, std1, std2, std3, std4, std5, std6, std7, std8, std9, std10, s # # # # # # # # # # # GPIO: # # # # # # # # # # -I_MODE_TASTER = 3 -I_PLUS_TASTER = 4 -I_MINUS_TASTER = 14 +I_MODE_TASTER = gpiozero.Button(3) +I_PLUS_TASTER = gpiozero.Button(4) +I_MINUS_TASTER = gpiozero.Button(14) # # # # # # # # # # @@ -69,13 +61,12 @@ def rgb_standard(): return rgbconf -def alle_led(r, g, b, strip): - for pos in range(strip.numPixels()): - strip.setPixelColorRGB(pos, r, g, b) - strip.show() +def alle_led(r, g, b, pixels): + pixels.fill(r, g, b) + pixels.show() -def led_calc(zeit, stdliste, rgbdict, led_gesetzt, strip): +def led_calc(zeit, stdliste, rgbdict, led_gesetzt, pixels): if zeit.hour > 11: index = zeit.hour - 12 else: @@ -98,62 +89,31 @@ def led_calc(zeit, stdliste, rgbdict, led_gesetzt, strip): if {minute} & {second}: for counter in range(0, 3): rgbdict["rgb_s"][counter] = int((rgbdict["rgb_min"][counter] + rgbdict["rgb_s"][counter]) / 2) - led_gesetzt = led_setzen(hour, minute, second, rgbdict, led_gesetzt, strip) + led_gesetzt = led_setzen(hour, minute, second, rgbdict, led_gesetzt, pixels) return zeit.second, led_gesetzt -def led_setzen(hour, minute, second, rgbdict, led_gesetzt, strip): +def led_setzen(hour, minute, second, rgbdict, led_gesetzt, pixels): if not isinstance(led_gesetzt, list): led_gesetzt = [led_gesetzt] # Stunden setzen for stunde in hour: - strip.setPixelColorRGB(stunde, rgbdict["rgb_std"][0], rgbdict["rgb_std"][1], rgbdict["rgb_std"][2]) - # print("Stunden setzen") - # print(stunde, rgbdict["rgb_std"][0], rgbdict["rgb_std"][1], rgbdict["rgb_std"][2]) + pixels[stunde] = rgbdict["rgb_std"][0], rgbdict["rgb_std"][1], rgbdict["rgb_std"][2] + # Minute setzen - strip.setPixelColorRGB(minute, rgbdict["rgb_min"][0], rgbdict["rgb_min"][1], rgbdict["rgb_min"][2]) - # print("Minute setzen") - # print(minute, rgbdict["rgb_min"][0], rgbdict["rgb_min"][1], rgbdict["rgb_min"][2]) + pixels[minute] = rgbdict["rgb_min"][0], rgbdict["rgb_min"][1], rgbdict["rgb_min"][2] + # Sekunde setzen - strip.setPixelColorRGB(second, rgbdict["rgb_s"][0], rgbdict["rgb_s"][1], rgbdict["rgb_s"][2]) - # print("Sekunde setzen") - # print(second, rgbdict["rgb_s"][0], rgbdict["rgb_s"][1], rgbdict["rgb_s"][2]) + pixels[second] = rgbdict["rgb_s"][0], rgbdict["rgb_s"][1], rgbdict["rgb_s"][2] + # Neue Leere LED berechnen led_gesetzt_neu = set(hour) | {minute} | {second} leerliste = list(set(led_gesetzt) - led_gesetzt_neu) for leer in leerliste: - strip.setPixelColorRGB(leer, rgbdict["rgb_leer"][0], rgbdict["rgb_leer"][1], rgbdict["rgb_leer"][2]), - # print("Leer setzen") - # print(leer, rgbdict["rgb_leer"][0], rgbdict["rgb_leer"][1], rgbdict["rgb_leer"][2]) - strip.show() - return list(led_gesetzt_neu) - - -def taster_callback(button): - start = datetime.now() - ende = datetime.now() - while button.is_pressed: - ende = datetime.now() - dauer = ende - start - dauer = dauer + timedelta(seconds=0.3) - pin_num = check_taster(button) - - if pin_num == I_MODE_TASTER: - handler_mode_taster(dauer) - - -def check_taster(button): - pin_num = "" - for i in str(button.pin): - if i.isdigit(): - pin_num = pin_num + str(i) - pin_num = int(pin_num) - return pin_num + pixels[leer] = rgbdict["rgb_leer"][0], rgbdict["rgb_leer"][1], rgbdict["rgb_leer"][2] - -def handler_mode_taster(dauer): - if dauer > timedelta(seconds=3): - shutdown() + pixels.show() + return list(led_gesetzt_neu) def shutdown(): @@ -162,10 +122,8 @@ def shutdown(): subprocess.call(cmd) -# # # # # # # # # # # Threads -# # # # # # # # # # -def check_anwesenheit(strip): +def check_anwesenheit(pixels): """Funktion, welche als eigener Thread laeuft, um selbststaendig in einem gewissenen Intervall alle Geraete in der Toml Liste zu pingen arg: Objekt des neopixel LED Ringes @@ -191,12 +149,11 @@ def check_anwesenheit(strip): with open(configfile) as conffile: wlanliste = toml.loads(conffile.read()) status_anwesend_liste = [] - delta = timedelta(seconds=301) - last = datetime.now() + delta = datetime.timedelta(seconds=301) + last = datetime.datetime.now() status = {} - global standard_helligkeit while True: - now = datetime.now() + now = datetime.datetime.now() # Status der IP Adressen ermitteln if delta.seconds > 300: for key_status in wlanliste.keys(): @@ -215,7 +172,7 @@ def check_anwesenheit(strip): status[key_status] = False if status["anwesend"]: status_anwesend_liste = [] # Geraet von anwesend erreichbar - helligkeit = standard_helligkeit + helligkeit = LED_BRIGHTNESS 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"]) @@ -223,40 +180,36 @@ def check_anwesenheit(strip): if len(status_anwesend_liste) > ABSCHALTWERT: helligkeit = 0 if status["dimmen"]: - helligkeit = standard_helligkeit * 0.5 + helligkeit = LED_BRIGHTNESS * 0.5 if now.hour < 5 and not status["dimmen"]: helligkeit = 0 - strip.setBrightness(int(helligkeit)) - last = datetime.now() + pixels.brightness = helligkeit + last = datetime.datetime.now() delta = now - last time.sleep(30) def main(): - mode_taster = gpiozero.Button(I_MODE_TASTER, hold_time=0.3) - mode_taster.when_pressed = taster_callback - lastsecond = None led_gesetzt = 0 rgbconf = rgb_standard() - strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, - LED_CHANNEL, LED_STRIP) - strip.begin() - strip.setBrightness(255) - thread_check_wlan = threading.Thread(target=check_anwesenheit, args=(strip,)) + pixels = neopixel.NeoPixel(LED_PIN, LED_COUNT, brightness=LED_BRIGHTNESS, + auto_write=False, pixel_order=LED_PIXEL_ORDER) + + thread_check_wlan = threading.Thread(target=check_anwesenheit, args=(pixels,)) thread_check_wlan.start() - alle_led(rgbconf["rgb_leer"][0], rgbconf["rgb_leer"][1], rgbconf["rgb_leer"][2], strip) + alle_led(rgbconf["rgb_leer"][0], rgbconf["rgb_leer"][1], rgbconf["rgb_leer"][2], pixels) while True: try: rgbconf = rgb_standard() - now = datetime.now() + now = datetime.datetime.now() if lastsecond != now.second: - lastsecond, led_gesetzt = led_calc(now, stdliste, rgbconf, led_gesetzt, strip) + lastsecond, led_gesetzt = led_calc(now, stdliste, rgbconf, led_gesetzt, pixels) time.sleep(0.2) except KeyboardInterrupt: print("KeyboardInterrupt") - strip.setBrightness(0) - alle_led(0, 0, 0, strip) + pixels.brightness = 0 + alle_led(0, 0, 0, pixels) sys.exit()