Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
ich suche nach einem Sequenzer, um die Farben meiner RGB-Beleuchtung wechseln lässt. Dabei sollen die Farben innerhalb einer gewissen Zeit (Größenordnung: Minuten) auf eine andere Helligkeit faden.
Hat jemand von euch das schon gemacht?
Ich hab darauf aufbauend eine Logik gebastelt. Funktioniert ganz gut, hätte ich aber irgendwie gerne noch schöner verpackt bzw. gibt es derzeit keine Möglichkeit, mehrere Items mit dem gleichen Sequencer laufen zu lassen. Außer halt mit Hilfsitems, on_update, etc.
Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
logger.info(trigger)
trigger_item = sh.return_item(trigger['source'])
source_item = sh.return_item(logic.watch_item[0])
logger.info("trigger item for sequencer logic: {0}, source item: {1}".format(trigger_item,source_item))
#schauen ob es ein lokales sperritem gibt
has_sperren = False
has_running = False
has_modus = False
has_random = False
has_stepping = False
has_startvariation = False
has_randomstart = False
has_timedelta = False
search_id = source_item.id()+".running"
for child in source_item.return_children():
if child.id() == search_id:
has_running = True
if has_running:
if source_item.running() == 1:
running = 1
logger.info("sequencer laeuft.")
else:
running = 0
logger.info("sequencer laeuft nicht.")
search_id = source_item.id()+".sperren"
for child in source_item.return_children():
if child.id() == search_id:
has_sperren = True
if has_sperren:
if source_item.sperren() == 1:
sperren = 1
logger.info("sequencer gesperrt, daher wird item ausgeschaltet.")
source_item(0)
else:
sperren = 0
logger.info("sequencer nicht gesperrt, daher gehts los.")
else:
sperren = 0
search_id = source_item.id()+".modus"
for child in source_item.return_children():
if child.id() == search_id:
has_modus = True
if has_modus:
modus = source_item.modus()
logger.info("modus auf {0}".format(modus))
else:
modus = 0
logger.info("modus auf 0, da attribut nicht vorhanden")
if sperren == 0:
if sh.return_item(logic.watch_item[0])(): # variablen werden nur gesetzt/gecheckt, wenn sequencer eingeschaltet wird
step = trigger['value']
if step == 0:
step = 1
logger.info("step war auf 0, warum auch immer.")
if source_item.modus.age() < 5:
step = 1
logger.info("modus gerade erst geaendert, daher step 1")
logger.info("step: {0}".format(step))
# aus-wert wird entweder als off in logic.conf definiert oder automatisch auf 0 gesetzt
try:
off = int(logic.off_value)
logger.info("off via config = {0}".format(off))
except:
off = 0
logger.info("off via standard = 0")
# max. ein-wert wird entweder als on in logic.conf definiert oder automatisch auf 255 gesetzt
try:
on = int(logic.on_value)
logger.info("on via config = {0}".format(on))
except:
on = 255
logger.info("on via standard = 255")
# sollte off groesser als on sein, werden die beiden werte getauscht.
if off >= on:
realoff = on
realon = off
on = int(realon)
off = int(realoff)
logger.info("werte in config verdreht. off nach korrektur = {0}, on nach korrektur = {1}".format(off, on))
search_id = source_item.id()+".randomchanger"
for child in source_item.return_children():
if child.id() == search_id:
has_random = True
if has_random:
# wird randomchanger ohne wert deklariert, wird standardwert 30 gesetzt.
if not isinstance(rand, int):
if rand.lower() in ['1', 'True', 'yes', 'on']:
rand = 30
logger.info("random ist aktiviert, aber kein wert gesetzt. off = zwischen {0} und {1}, on = zwischen {2} und {3}".format(off,off+30,on,on-30))
elif rand.lower() in ['0', 'False', 'no', 'off']:
logger.info("keine zufallswerte gewuenscht. off = {0}, on = {1}".format(off,on))
else:
rand = int(source_item.randomchanger())
else:
# ist randomchanger in der logic.conf angegeben, wird der dort angegebene wert benutzt, um on und off mit dem angegebenen wert zufaellig abzuaendern.
try:
rand = logic.randomchanger
logger.info("random via config = {0}".format(rand))
except:
rand = 'no'
# on und off werden anhand des randomchanger-wertes zufaellig abgeaendert.
if isinstance(rand, int):
random.seed()
upper = int(on-rand)
lower = int(off+rand)
on = random.randint(upper, on)
off = random.randint(off, lower)
logger.info("randomspanne = {0}, obergrenze fuer off = {4}, untergrenze fuer on = {3}, sequencer werte: off {1}, on {2}".format(rand,off,on, upper, lower))
search_id = source_item.id()+".stepping"
for child in source_item.return_children():
if child.id() == search_id:
has_stepping = True
if has_stepping:
stepping = int(source_item.stepping())
else:
# ist stepping nicht in der logic.conf definiert, wird der wert auf 5 gesetzt.
try:
stepping = int(logic.stepping)
logger.info("stepping = {0}".format(stepping))
except:
stepping = 5
search_id = source_item.id()+".timedelta"
for child in source_item.return_children():
if child.id() == search_id:
has_timedelta = True
if has_timedelta:
timedelta = int(source_item.timedelta())
else:
# ist timedelta nicht in der logic.conf definiert, wird der wert auf 1 gesetzt.
try:
timedelta = int(logic.timedelta)
logger.info("timedelta = {0}".format(timedelta))
except:
timedelta = 1
search_id = source_item.id()+".randomstart"
for child in source_item.return_children():
if child.id() == search_id:
has_randomstart = True
if has_randomstart:
randomstart = source_item.randomstart()
logger.info("random start aus item = {0}".format(randomstart))
else:
# randomstart ermoeglicht es, mit einer zufaelligen farbe anstatt dunklem rot zu starten.
try:
randomstart = logic.randomstart
logger.info("random start aus logic config = {0}".format(randomstart))
except:
randomstart = False
logger.info("random start False = {0}".format(randomstart))
try:
randomstart_r = int(logic.randomstart_r)
randomstart = 1
except:
randomstart_r = 0
try:
randomstart_g = int(logic.randomstart_g)
randomstart = 1
except:
randomstart_g = 0
try:
randomstart_b = int(logic.randomstart_b)
randomstart = 1
except:
randomstart_b = 0
try:
randomstart_ww = int(logic.randomstart_ww)
randomstart = 1
except:
randomstart_ww = 0
search_id = source_item.id()+".startvariation"
for child in source_item.return_children():
if child.id() == search_id:
has_startvariation = True
if has_startvariation:
startvariation = int(source_item.startvariation())
else:
try:
startvariation = int(logic.startvariation)
except:
startvariation = 50
# wird randomstart ohne wert in der logic.conf aktiviert, wird 150 als standardwert gesetzt.
if isinstance(randomstart, bool):
try:
if randomstart == True:
randomstart = randomstart_r = randomstart_g = randomstart_b = randomstart_ww = 150
logger.info("alle farben random start = {0}".format(randomstart))
elif randomstart == False:
randomstart = 0
logger.info("random start ist aus = {0}".format(randomstart))
except:
logger.info("randomstart ist aktiviert, wird berechnet...")
else:
try:
if randomstart.lower() in ['True', 'yes', 'on']:
randomstart = randomstart_r = randomstart_g = randomstart_b = randomstart_ww = 150
logger.info("alle farben random start = {0}".format(randomstart))
elif randomstart.lower() in ['0', 'False', 'no', 'off']:
randomstart = 0
logger.info("random start ist aus = {0}".format(randomstart))
else:
randomstart = int(randomstart)
logger.info("random start = {0}".format(randomstart))
except:
if not isinstance(randomstart, int):
logger.info("randomstart nicht oder falsch definiert")
else:
logger.info("randomstart wird berechnet...")
# berechnen des zufaelligen startwerts fuer gruen und blau.
if isinstance(randomstart, int) and randomstart > 0:
logger.info("setze farben random start = {0}".format(randomstart))
random.seed()
randomstartr = random.randint(randomstart_r-startvariation, randomstart_r+startvariation)
randomstartg = random.randint(randomstart_g-startvariation, randomstart_g+startvariation)
randomstartb = random.randint(randomstart_b-startvariation, randomstart_b+startvariation)
randomstartww = random.randint(randomstart_ww-startvariation, randomstart_ww+startvariation)
logger.info("random start fuer rot = {0}, fuer gruen = {1}, fuer blau = {2}, fuer ww = {3} (variation: {4}),".format(randomstartr, randomstartg, randomstartb, randomstartww, startvariation))
else:
logger.info("random start ist ausgeschaltet. wert = {0}".format(randomstart))
# next_step wird entweder in sekunden in logic.conf definiert oder automatisch errechnet.
try:
next_step = int(logic.next_step)
logger.info("next step via config = {0}".format(next_step))
except:
next_step = int(on*timedelta/stepping)
logger.info("next step via calculation = {0}".format(next_step))
if modus == 2:
next_step = next_step/2
next_time = sh.now() + dateutil.relativedelta.relativedelta(seconds=next_step)
# sind die anzusteuernden children in logic.conf nicht definiert, wird der standardname farbe.dimmen angenommen. sollte angepasst werden!
parent_item = sh.return_item(logic.watch_item[0]).return_parent()
try:
r = "{0}.{1}".format(parent_item, r_value)
g = "{0}.{1}".format(parent_item, g_value)
b = "{0}.{1}".format(parent_item, b_value)
ww = "{0}.{1}".format(parent_item, ww_value)
logger.info("items via config: rot = {0}, gruen = {1}, blau = {2}, ww = {3}".format(r,g,b,ww))
except:
r = "{0}.r.fading".format(parent_item)
g = "{0}.g.fading".format(parent_item)
b = "{0}.b.fading".format(parent_item)
ww = "{0}.ww.fading".format(parent_item)
logger.info("items via standard: rot = {0}, gruen = {1}, blau = {2}, ww = {3}".format(r,g,b,ww))
id = 'logics.{}'.format(logic.name)
items = r, g, b, ww
if sh.return_item(logic.watch_item[0])() : #wenn watch_item gesetzt ist startet ablauf (1-2-3-4-2-3-4-2-3-4-.....)
# modus 0, standard
if modus == 0:
aktuellww = sh.return_item(items[3])() - 1
aktuellww *= (aktuellww>0)
sh.return_item(items[3])(abs(aktuellww))
off_step = int(sh.return_item(items[3])()/10)
sh.return_item(items[3]).fade(0,off_step,1)
if step == 1:
source_item.running(1)
logger.info("sequencer stufe 1")
aktuellr = sh.return_item(items[0])() - 1
aktuellg = sh.return_item(items[1])() - 1
aktuellb = sh.return_item(items[2])() - 1
aktuellr *= (aktuellr>0)
aktuellg *= (aktuellg>0)
aktuellb *= (aktuellb>0)
logger.info("r = {0}, g = {1}, b = {2}, ww = {3}".format(aktuellr,aktuellg,aktuellb,aktuellww))
sh.return_item(items[0])(abs(aktuellr))
sh.return_item(items[1])(abs(aktuellg))
sh.return_item(items[2])(abs(aktuellb))
if randomstart:
logger.info("item to fade: {0}".format(sh.return_item(items[0])))
sh.return_item(items[0]).fade(on,stepping*2,timedelta)
sh.return_item(items[1]).fade(randomstartg,25,1)
sh.return_item(items[2]).fade(randomstartb,33,1)
else:
sh.return_item(items[0]).fade(on,stepping,timedelta)
step = 2
elif step == 2:
logger.info("sequencer stufe 2")
aktuellr = sh.return_item(items[0])() - 1
aktuellg = sh.return_item(items[1])() - 1
aktuellr *= (aktuellr>0)
aktuellg *= (aktuellg>0)
logger.info("r = {0}, g = {1}".format(aktuellr,aktuellg))
sh.return_item(items[0])(abs(aktuellr))
sh.return_item(items[1])(abs(aktuellg))
sh.return_item(items[1]).fade(on,stepping,timedelta)
sh.return_item(items[0]).fade(off,stepping,timedelta)
step = 3
elif step == 3:
logger.info("sequencer stufe 3")
aktuellg = sh.return_item(items[1])() - 1
aktuellb = sh.return_item(items[2])() - 1
aktuellg *= (aktuellg>0)
aktuellb *= (aktuellb>0)
logger.info("g = {0}, b = {1}".format(aktuellg,aktuellb))
sh.return_item(items[1])(abs(aktuellg))
sh.return_item(items[2])(abs(aktuellb))
sh.return_item(items[2]).fade(on,stepping,timedelta)
sh.return_item(items[1]).fade(off,stepping,timedelta)
step = 4
elif step == 4:
logger.info("sequencer stufe 4")
aktuellr = sh.return_item(items[0])() - 1
aktuellb = sh.return_item(items[2])() - 1
aktuellr *= (aktuellr>0)
aktuellb *= (aktuellb>0)
logger.info("r = {0}, b = {1}".format(aktuellr,aktuellb))
sh.return_item(items[0])(abs(aktuellr))
sh.return_item(items[2])(abs(aktuellb))
sh.return_item(items[0]).fade(on,stepping,timedelta)
sh.return_item(items[2]).fade(off,stepping,timedelta)
step = 2
else:
logger.warning("kein sequenzwert gesetzt")
# modus 2, advent
if modus == 2:
off_stepr = int(sh.return_item(items[1])()/10)
off_stepg = int(sh.return_item(items[2])()/10)
aktuellg = sh.return_item(items[1])() - 1
aktuellb = sh.return_item(items[2])() - 1
aktuellg *= (aktuellg>0)
aktuellb *= (aktuellb>0)
sh.return_item(items[1])(abs(aktuellg))
sh.return_item(items[2])(abs(aktuellb))
sh.return_item(items[1]).fade(0,off_stepr,timedelta*2)
sh.return_item(items[2]).fade(0,off_stepg,timedelta*2)
if step == 1:
source_item.running(1)
logger.info("sequencer stufe 1, modus 2")
aktuellr = sh.return_item(items[0])() - 1
aktuellww = sh.return_item(items[3])() - 1
aktuellr *= (aktuellr>0)
aktuellww *= (aktuellww>0)
logger.info("r = {0}, ww = {1}".format(aktuellr,aktuellww))
sh.return_item(items[0])(abs(aktuellr))
sh.return_item(items[3])(abs(aktuellww))
if randomstart:
logger.info("item to fade: {0}".format(sh.return_item(items[0])))
sh.return_item(items[0]).fade(on,stepping*2,timedelta)
sh.return_item(items[3]).fade(randomstartww,25,1)
else:
sh.return_item(items[0]).fade(on,stepping,timedelta)
step = 2
elif step == 2:
logger.info("sequencer stufe 2, modus 2")
aktuellr = sh.return_item(items[0])() - 1
aktuellww = sh.return_item(items[3])() - 1
aktuellr *= (aktuellr>0)
aktuellww *= (aktuellww>0)
logger.info("r = {0}, ww = {1}".format(aktuellr,aktuellww))
sh.return_item(items[0])(abs(aktuellr))
sh.return_item(items[3])(abs(aktuellww))
sh.return_item(items[3]).fade(on,stepping*2,timedelta)
sh.return_item(items[0]).fade(off,stepping*2,timedelta)
step = 3
elif step == 3:
logger.info("sequencer stufe 3, modus 2")
aktuellr = sh.return_item(items[0])() - 1
aktuellww = sh.return_item(items[3])() - 1
aktuellr *= (aktuellr>0)
aktuellww *= (aktuellww>0)
logger.info("r = {0}, ww = {1}".format(aktuellr,aktuellww))
sh.return_item(items[0])(abs(aktuellr))
sh.return_item(items[3])(abs(aktuellww))
sh.return_item(items[0]).fade(on,stepping*2,timedelta)
sh.return_item(items[3]).fade(off,stepping*2,timedelta)
step = 2
else:
logger.warning("kein sequenzwert gesetzt")
sh.scheduler.change(id, next=next_time, value=step) #nächsten aufruf setzen
else:
# ist off_fade nicht in der logic.conf definiert, wird sofort ausgeschaltet statt in 10 sekunden ausgefadet.
try:
off_fade = logic.off_fade
logger.info("ausschalten mit fade")
except:
off_fade = 'no'
logger.info("ausschalten ohne fade")
try:
if off_fade.lower() in ['1', 'True', 'yes', 'on']:
off_fade = 10
elif off_fade.lower() in ['0', 'False', 'no', 'off']:
off_fade = False
else:
off_fade = int(off_fade)
logger.info("ausschaltfade in sekunden via config = {0}".format(off_fade))
except:
if not isinstance(off_fade, int):
logger.info("ausschaltfade nicht oder falsch definiert")
else:
logger.info("ausschaltfade wird berechnet...{0}".format(off_fade))
step = 1
for i in items:
if off_fade:
off_step = int(sh.return_item(i)()/off_fade)
off_delta = 1
if off_step == 0:
off_step = 1
logger.info("offstep fuer {1} = {0}".format(off_step,sh.return_item(i)))
aktuell = sh.return_item(i)() - 1
aktuell *= (aktuell>0)
sh.return_item(i)(aktuell)
sh.return_item(i).fade(0,off_step,off_delta)
else:
sh.return_item(i)(0)
logger.info("sequencer deaktiviert fuer {0}".format(sh.return_item(i)))
source_item.running(0)
Hast du mal überlegt, einfach im HSL Farbraum zu arbeiten?
wenn ich deine Logik richtig sehe und verstehe kommt es dabei zu deutlichen Schwankungen in der Helligkeit.
Im im HSL Raum könnte man einfach den Hinweis und ggf S wert kontinuierlich variieren.
Dabei dabei könnte man den Wert konstant lassen und gegebenenfalls in der Visualisierung über einen Slider einstellbar machen.
Das
-quadriert die aktuellen werte für r, g, b
-setzt die Werte (ohne fade) auf die quadrierten Werte
-fadet danach noch den r-Wert auf den Wert, der in 'on' gespeichert ist.
richtig?
Ich verstehe aber nicht, warum.
Ich überlege gerade, ob es sinn macht, die Logik auf HSV zu erweitern, oder ob dies eine eigne Logik werden sollte.
Was meinst du?
Das Fading Item ist im Prinzip das "dimmen" Item ohne knx_listen. Das deshalb, weil sonst item.fader immer abbricht, sobald ein Wert erhalten wird (sollte man imho mal im core anpassen, aber das ist was anderes..)
Das r_value blieb lediglich aus Kompatibilitätsgründen zur ursprünglichen Logik drin. Dort wurden im logic.yaml die Werte für r, g, b nämlich dort drin definiert. Ist nicht nötig, wenn die Hierarchie wie oben "stimmt". Selbes gilt wohl für startvariation und stepping. Doppelt gemoppelt. Ich find es generell vernünftiger, die Config als Items zu erfassen, da sie dann in Laufzeit geändert werden können, anstatt sie fix im logic.yaml zu definieren. Möglicherweise hab ich das nicht komplett durchgezogen oder es sind noch unnötige Attribute in der logic.yaml drin.
Quadriert wird übrigens nichts. Es geht nur drum, ob der Wert aktuell_r auf den tatsächlichen Wert oder auf 0 gesetzt wird. Also (aktuell_r>0) gibt entweder 1 oder 0 zurück, je nachdem eben, ob der Wert größer 0 ist. Das hätte man vermutlich auch mit einem min/max machen können, jedenfalls geht's nur drum, dass der Wert nicht negativ sein darf.
Das SETZEN des Werts ohne Fade ist ganz wichtig, um den Fader zu stoppen. Relevant dabei ist das -1 in den Zeilen davor. Der Wert darf also nicht auf den gleichen Wert gesetzt werden, wo er grad ist, denn dann wird nicht gestoppt. Man kann den Fader auch nicht einfach so "ersetzen"/ändern. Sondern eben stoppen und neu setzen (auch das könnte man mal im core ändern.. schau ich mir vielleicht mal im Detail an..z.B. könnte im core definiert sein, dass zuerst ein Wert -1 gesetzt wird, wenn schon ein entsprechender fader existiert...).
danke, das hilft.
Die Syntax (value>0) hatte ich mit ("multipliziere mit dem wert wenn wert>0 ist") übersetzt.
Dass die in der logic.yaml definierten Parameter als Variablen in der Logik zur Verfügung stehen war mir nicht bekannt. Wieder was gelernt, danke.
Ich habe jetzt versucht, die Logik einzusetzen, bekomme aber einen Fehler
Code:
2018-10-08 22:00:49 ERROR logics.sequencer_wohnzimmer Logic: logics.sequencer_wohnzimmer, File: /usr/local/smarthome/logics/sequencer.py, Line: 20, Method: <module>, Exception: 'NoneType' object has no attribute 'id'
File "/usr/local/smarthome/logics/sequencer.py", line 20, in <module>
Die codezeile ist:
Code:
search_id = source_item.id()+".running"
Ein Item id sehe ich aber auch bei dir nicht. Hast du eine Idee?
Zum hsv-Resourcenproblem: Das wundert mich!
Jedes Item hat die Funktion id(). Der Fehler weist darauf hin, dass das source_item kein Item ist. Entweder wird hier nichts übergeben oder ein Vertipper oder so?
danke, das funktioniert erstmal. Allerdings funktioniert der Fader noch nicht.
Code:
2018-10-09 21:29:09 INFO logics.sequencer_wohnzimmer [Sequencer] items via standard: rot = eg.Wohnzimmer.Voute.r.fading, gruen = eg.Wohnzimmer.Voute.g.fading, blau = eg.Wohnzimmer.Voute.b.fading, ww = eg.Wohnzimmer.Voute.ww.fading
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] watch item for sequencer logic: {'dest': None, 'value': True, 'by': 'Scheduler', 'source': None}
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] watch item for sequencer logic: eg.Wohnzimmer.Voute.sequencer
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] trigger item for sequencer logic: None, source item: eg.Wohnzimmer.Voute.sequencer
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] sequencer laeuft nicht.
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] sequencer nicht gesperrt, daher gehts los.
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] modus auf 1
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] step: True
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] off via config = 0
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] on via config = 255
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] random via config = 35
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] random start aus item = True
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] alle farben random start = 150
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] setze farben random start = 150
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] random start fuer rot = 150, fuer gruen = 150, fuer blau = 150, fuer ww = 150 (variation: 0),
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] next step via calculation = 765
2018-10-09 21:41:55 INFO logics.sequencer_wohnzimmer [Sequencer] items via standard: rot = eg.Wohnzimmer.Voute.r.fading, gruen = eg.Wohnzimmer.Voute.g.fading, blau = eg.Wohnzimmer.Voute.b.fading, ww = eg.Wohnzimmer.Voute.ww.fading
Hast du mal meinen HSV-Dimmer ausprobiert?
Läuft hier gerade. Gefällt mir gut. V.a. weil man auch ganz leicht die Sättigung und die Helligkeit in der Visu ändern kann.
HSV hab ich noch nicht getestet, du meinst den vom import in logic Thread? Vielleicht magst ja doch noch kombinieren ?
Ich weiß jetzt nicht genau, was mit dem obigen Log anzufangen ist. Nach dem letzten INFO passiert einfach nichts? Hast du darauf geachtet, dass das Item, das gefadet wird, kein knx_listen oder sonst irgendeine Änderung von Außen bekommt? Was sagt's debug log vom lib.item bzw. scheduler?
ja, die aus dem Logic-Thread.
Kombinieren war von Anfang an mein Ziel. Aber ich bin nicht sicher, ob das Sinn macht:
- Die Items sollten unterschiedlich heißen.
- Die Steps sind nicht nötig
- Ein Faden ist auch nicht unbedingt nötig. Momentan rufe ich die Logik alle 10s auf. Das Dimmen macht das Dali-Gerät und sorgt damit für einen sanften Übergang.
Was meinst du? Probier doch mal aus. Dann hast du den Vergleich.
Zu meinem Log: Ja, nach dem letzten Info passiert nix mehr.
Zum Wert von Außen:
Ich denke ja:
Mach doch ein paar Log-Einträge an den relevanten Stellen um zu gucken, woran es liegen kann.
Code:
if sh.return_item(logic.watch_item[0])() : #wenn watch_item gesetzt ist startet ablauf (1-2-3-4-2-3-4-2-3-4-.....)
logger.info(modus)
# modus 0, standard
if modus == 0:
Den hsv Dimmer schau ich mir mal an. Ich hab bei der Logik die ganzen random, startup, etc Features eingebaut, weil es sonst nicht so prickelnd ausgesehen hat. Wenn dann würd ich mir hier also noch ein paar Optionen einbauen. Aber mal checken, wie es funzt, thx.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen und die Websiteaktivitäten zu analysieren. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar