Hallo zusammen,
Skript steckt noch in der Entwicklung, deswegen sind auch die Kommentare sehr spärlich gesät. Für mich hat sich jetzt gerade dabei folgende Fragen/Problematik ergeben:
Muss ich hier Threading verwenden, oder gibts hier eine andere Lösung um nicht auf Threading setzen zu müssen (Threading ist noch das unbetretenen Stück Python, oder ist die Zeit gekommen wo ich da jetzt durch muss?)
Das Skript macht steuert einen 60er LED (WS2812) Kreis an, welches eine Uhr werden soll. Alle 5 Minuten wollte ich bestimmte IP welche in einer Toml Datei hinterlegt sind anpingen, und je nach Ergebnis die LEDs dimmen (Fernseher läuft) oder komplett abschalten (Handy zu Hause).
Jetzt wenn ich aber pinge, bleibt mir mein Sekundenzeiger stehen. Gibts eine andere Möglichkeit oder am besten Threading einsetzen? (Ok eine Lösung wüsst ich auch noch mit einem zusäztlichen Skript was dann nur die Zustände in einem seperaten toml File hinterlegt)
Sofern Interesse am Code besteht
#!/bin/usr/python3
#
# # # # # # # # # #
#Imports
# # # # # # # # # #
from datetime import datetime
import sys
sys.path.append("/home/pi/rpi_ws281x")
from neopixel import *
import time
import subprocess
import toml
import os
# # # # # # # # # #
# LED strip configuration:
# # # # # # # # # #
LED_COUNT = 60 # Number of LED pixels.
LED_PIN = 18 # 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 Mapping
std0 = [0, 1, 58, 59]
std1 = [3, 4, 5, 6]
std2 = [8, 9, 10, 11]
std3 = [13, 14, 15, 16]
std4 = [18, 19, 20, 21]
std5 = [23, 24, 25, 26]
std6 = [28, 29, 30, 31]
std7 = [33, 34, 35, 36]
std8 = [38, 39, 40, 41]
std9 = [43, 44, 45, 46]
std10 = [48, 49, 50, 51]
std11 = [53, 54, 55, 56]
stdliste = [std0, std1, std2, std3, std4, std5, std6, std7, std8, std9, std10, std11]
# # # # # # # # # #
#Funktionen
# # # # # # # # # #
#Farbkonfiguration
def rgb_standard():
rgb_leer = [80, 80, 75]
rgb_s = [255, 0, 0]
rgb_min = [0, 255, 0]
rgb_std = [0, 0, 255]
rgbconf = {"rgb_leer" : rgb_leer, "rgb_s" : rgb_s, "rgb_min" : rgb_min, "rgb_std" : rgb_std}
return rgbconf
def alle_led(r, g, b, strip):
for pos in range(0, strip.numPixels()):
strip.setPixelColorRGB(pos, r, g, b)
strip.show()
def led_calc(zeit, stdliste, rgbdict, led_gesetzt, strip):
rgbdict = rgbdict.copy()
if zeit.hour > 11:
index = int(zeit.hour) - 12
else:
index = int(zeit.hour)
hour = stdliste[index]
print(hour)
minute = int(zeit.minute)
second = int(zeit.second)
#Schnittfarben berechnen falls "Zeiger" übereinander liegen
#Stunde mit Minute vergleichen
if bool(set(hour) & {minute}):
for counter in range(0, 3):
rgbdict["rgb_min"][counter] = int((rgbdict["rgb_std"][counter] + rgbdict["rgb_min"][counter]) / 2)
#Stunde mit Sekunde vergleichen
if set(hour) & {second}:
for counter in range(0, 3):
rgbdict["rgb_s"][counter] = int((rgbdict["rgb_std"][counter] + rgbdict["rgb_s"][counter]) / 2)
#Minute mit Sekunde vergleichen
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)
return (zeit.second, led_gesetzt)
def led_setzen(hour, minute, second, rgbdict, led_gesetzt, strip):
if not type(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])
#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])
#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])
#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 check_wlan(wlanliste):
def ping_wlan(ip):
return subprocess.call(["ping", "-c 2", ip])
status = dict()
for key in wlanliste.keys():
for ip in wlanliste[key]:
if not ping_wlan(ip):
status[key] = True
break
else:
status[key] = False
return status
#Init
pfad = os.path.abspath(os.path.dirname(__file__))
configfile = pfad + "/wlan.toml"
with open(configfile) as conffile:
wlanliste = toml.loads(conffile.read())
last = datetime.now()
lastsecond = None
led_gesetzt = 0
helligkeit = 255
rgbconf = rgb_standard()
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT)
strip.begin()
strip.setBrightness(helligkeit)
alle_led(rgbconf["rgb_leer"][0], rgbconf["rgb_leer"][1], rgbconf["rgb_leer"][2], strip)
while True:
try:
rgbconf = rgb_standard()
now = datetime.now()
if lastsecond != now.second:
lastsecond, led_gesetzt = led_calc(now, stdliste, rgbconf, led_gesetzt, strip)
if (now - last).seconds >= 10: #300: #5 Minute
last = now
print("Check WLAN")
status = check_wlan(wlanliste)
print(status)
if status["dimmen"]:
helligkeit = 50
else:
helligkeit = 255
if not status["anwesend"]:
helligkeit = 0
strip.setBrightness(helligkeit)
time.sleep(0.5)
except KeyboardInterrupt:
print("KeyboardInterrupt")
strip.setBrightness(0)
alle_led(0, 0, 0, strip)
sys.exit()
Alles anzeigen
Das fliegt natürlich auch noch raus, da ich aber anfangs paar Schwiergkeiten hatte das ganze überhaupt importieren zu können, ist das noch ein überbleibsl von einem Tutorial
schonmal wieder im Voraus