|
|
|
@ -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()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|