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 habe das gestern kurz probiert und bei mir ging es erst einmal auf anhieb nicht.
Hmm, ich verwende das produktiv und hab keine Probleme . Ich hatte das nur reingestellt, weil Du meintest, dass Zeiten < 1 Sekunde schön wären. Meine Logik hat eine Auflösung von 1/10 Sekunde.
"blinken_ga" ist die Gruppenadresse, die blinken soll richtig?
Ja, ich habe bewusst GA genommen und nicht Items, damit man potentielle Trigger beim Blinken nicht hat. Meistens habe ich die Blink-GA als zusätzliche hörende Adresse an jeweiligen Kommunikationsobjekt, so dass ein blinken möglichst wenig Seiteneffekte hat. Deswegen kann man mit blinken_final auch am Ende des Blinkens der GA wieder einen definierten Zustand zuweisen.
Wenn Du schreibst, was nicht ging, kann ich Dir gerne helfen.
Wenn Du schreibst, was nicht ging, kann ich Dir gerne helfen.
Da blinkt nix. Das geht nicht, ich finde aber den Fehler nicht. Ich glaube aber, dass die Logik gar nicht aufgerufen wird. Dazu habe ich die Datei logics.yaml erzeugt und die Sachen da eingetragen. Es existierte vorher aber nur eine logic.yaml und KEINE logis.yaml.
Ich habe das umgebaut, um das in meine Variante nutzen zu können. Hier erst mal meine "Leuchte".
Und dann noch die Sperrfunktion.. Die Sperrfunktion funktioniert auch in meiner auskommentierten Variante.
Code:
EG:
Wohnen:
Praesenz:
Sperren:
# beim Aussschalten des Lichts in der Nacht, wird der Präsenzmelder gesperrt
# und beim Einschalten wieder entsperrt
CheckTastSperren:
type: bool
eval: True if not sh.EG.Wohnen.DALI.Decke.WW.externerTaster() and sh.EG.Wohnen.TagNacht() else False
eval_trigger: EG.Wohnen.DALI.Decke.WW.externerTaster
on_change:
- EG.Wohnen.DALI.Decke.WW.sperren = value
- EG.Wohnen.DALI.Decke.WW.externerTaster = True if value == False else None
- EG.Wohnen.DALI.Decke.WW.quittierenTest = True
#- EG.Wohnen.DALI.Decke.WW.quittieren = 3 * 256 + 5 if value == True else 0
# beim Umschalten auf den Tag-Betrieb wird der Präsenzmelder entsperrt
CheckTagEntsperren:
type: bool
eval: sh.EG.Wohnen.TagNacht()
eval_trigger: EG.Wohnen.TagNacht
on_change: EG.Wohnen.DALI.Decke.WW.sperren = not value
Du hast es eigentlich schon selbst gefunden... es war ein Typo: Die Datei heißt logic.yaml und nicht logics.yaml. Sorry!
Du könntest die "blinken_*" Attribute direkt am sperren-Item machen, da es ja blinken soll, wenn gesperrt wird. Aber so geht es natürlich auch... ist nur nicht nötig.
Noch ein konzeptioneller Tipp: Das blinken_final bringt bei Dir nichts. Blinken geht über die GA 5/0/12, das Item EG.Wohnen.DALI.Decke.WW.schalten hört aber über knx_listen auf den Status des Aktors. Damit wird das Item durch das Blinken verändert. Blinken schaltet immer an, dann aus, somit ist nach dem 5. blinken das Ganze auch aus und wird durch blinken_final nochmal auf aus gesetzt. Postitv formuliert: Es schadet auch nichts, da es keine Auswirkung hat.
Aber mal einen anderen Fall angenommen: Das Licht ist an, die Sperre wird gesetzt. Dann will man eigentlich, dass es 5 mal blinkt und anschließend das Licht an bleibt. Die letzte Aktion von "Blinken" ist aber ein aus. Dann kann man blinken_final dafür nutzen, den letzten Zustand vor dem Blinken wieder zu setzen. Dafür muss man aber ein Item haben, dass den Zustand gespeichert hat und dass durch das Blinken selbst nicht verändert wird.
Oder noch anders gesagt: blinken_final auf ein Item zu setzen, dass durch das Blinken selbst beeinflusst wird, macht keinen Sinn.
Du hast es eigentlich schon selbst gefunden... es war ein Typo: Die Datei heißt logic.yaml und nicht logics.yaml. Sorry!
Du könntest die "blinken_*" Attribute direkt am sperren-Item machen, da es ja blinken soll, wenn gesperrt wird. Aber so geht es natürlich auch... ist nur nicht nötig.
Ich habs jetzt in der richtigen logic eingetragen. Da stehen schon einige Sachen drin, die vermutlich aus den Logiken selbst generiert werden. Allerdings geht das nicht. Sobald ich da was eintrage, erhalte ich eine Fehlermeldung:
Code:
[LIST][*]2018-07-18 19:40:35 ERROR CP Server Thread-8 YAML-file load error in /usr/local/smarthome/etc/logic.yaml:[*]expected '<document start>', but found '<block mapping start>'[*]in "<unicode string>", line 7, column 1:[*]blinken:[*]^ (line: 7)[/LIST]
Du könntest die "blinken_*" Attribute direkt am sperren-Item machen, da es ja blinken soll, wenn gesperrt wird. Aber so geht es natürlich auch... ist nur nicht nötig.
Das schaue ich mir an, dann spart man sich den Umweg. Die Sperre allerdings muss ich ohnehin manuell über SmarthomeNG machen ...
Aus der Meldung heraus würde ich tippen, dass du ein tab im yaml verwendet hast. Yaml erlaubt nu spaces für einrückungen.
Nein, das ist leider nicht der Fehler. Ich habe das Gefühl ich bin nicht in der richtigen Datei. Das steht da schon drin und ich habs danach einfach angefügt, aber irgendwie passt das nicht so recht.
hast Du die Formatierung vergessen oder steht das wirklich so drin? Sieht für mich eher wie JSON aus... aber auch nicht richtig ohne Anführungsstriche.
Es sollte (meiner Meinung nach) so aussehen:
Wobei ich natürlich nicht weiß, was rolladen_runterfahren macht. Ist ja Deine logik... aber bei blinken hattest Du das watch_item vergessen.
Du solltest vielleicht mal die smarthomeNG-Doku lesen und auch was über Dateiformate, speziell YAML. Die Probleme, die Du hier beschreibst, sind alle mit einem Blick in die Doku schnell gelöst...
hast Du die Formatierung vergessen oder steht das wirklich so drin? Sieht für mich eher wie JSON aus... aber auch nicht richtig ohne Anführungsstriche.
Nein, ich habe ja nichts vergessen. DIese Sachen, die da drin stehen, werden automatisch aus SmartHomeNG generiert, wenn ich eine Logik im Logikeditor anlege, so auch dein blinken. Das funktioniert ja auch. Nur, wenn ich deinen Punkt zu füge, geht das nicht. Ich vermute also doch, dass es die falsche Datei ist. Aus der Anleitung werde ich in diesem Punkt nicht schlau, obwohl sie sonst sehr ausführlich ist. Ich habe mir das Beispiel nachdimmen mal angeschaut. Und da steht bei dem Logikteil folgendes:
Die Logik aktiviert man unter etc/yaml mit dem Eintrag von:
Ich habe genau das jetzt gemacht und den autogenerierten Kram gelöscht. Jetzt werden die Logiken ordnungsgemäß geladen und gefunden. Mir ist nur unklar, wieso SmartHomeNG das erst einmal so speichert. Jetzt werden auch neue Logiken richtig gespeichert. Jetzt muss ich nur noch rausfinden, warum es dennoch nicht blinkt. Da suche ichd ann später weiter .... :-)
Du hast vollkommen recht, aber jetzt frage ich mich, warum es bei mir blinkt... bei mir stand auch .attr drin. Ich muss mal morgen schauen, heute wird das nichts mehr.
Ich war aber so frei, deine Logik zu erweitern. Die geht jetzt auch mit Dimmwerten, damit es nicht so hell ist. Also wenn man blinken_dimmwert_ein setzt, dann wird die Gruppenadresse als Dimmwert gesendet. Und blinken_startpause macht noch eine kleine Pause, bevor das blinken überhaupt anfängt. Das sieht dann besser aus, wenn man Soft-an und Soft-Aus-Funktion in der Lichtquelle hat. :-)
Code:
#!/usr/bin/env python
#
# Abstrakte blink-Logik, blinkt wenn das Item <> 0 ist - ist somit für num und bool items geeignet
#
# blinken_ga (string, verpflichtend) ist das watch-Attribut, hat als argument die blink-GA
# blinken_not (bool, default false) lässt blinken, wenn das Item 0 ist
# blinken_anzahl (num, default 7, max 100) ist die Anzahl der Blinkvorgsenge
# blinken_puls (num, default 10, in Sekunden/10) ist die Laenge des "an"-blinkens
# blinken_pause (num, default 10, in Sekunden/10) ist die Laenge des "aus"-blinkens
# blinken_invert (bool, default false) invertiert Puls/Pause (für negative Anzeige)
# blinken_final (string, Item, default leer) setzt den Zustand des Items als letzten Blinkwert
# blinken_startpause (num, default 0, in Sekunden/10) wie lange wird gewartet, bevor das Blinken anfängt
# blinken_dimmwert_ein (num, default None) anstatt ein/aus wird der Dimmwert gesetzt, Achtung Gruppenadresse muss für Dimmwert sein
# blinken_dimmwert_aus (num, default 0) anstatt ein/aus wird der Dimmwert gesetzt
logger.info("blinken")
print(trigger)
# logik nur, wenn von Item getriggert
if trigger['by'] == 'Item':
lItem = sh.return_item(trigger['source'])
lGA = lItem.conf['blinken_ga']
lAnzahl = int(lItem.conf['blinken_anzahl']) if 'blinken_anzahl' in lItem.conf else 7
lPuls = int(lItem.conf['blinken_puls']) if 'blinken_puls' in lItem.conf else 10
lPause = int(lItem.conf['blinken_pause']) if 'blinken_pause' in lItem.conf else 10
lStartPause = int(lItem.conf['blinken_startpause']) if 'blinken_startpause' in lItem.conf else 0
ldimmwert_ein = int(lItem.conf['blinken_dimmwert_ein']) if 'blinken_dimmwert_ein' in lItem.conf else None
ldimmwert_aus = int(lItem.conf['blinken_dimmwert_aus']) if 'blinken_dimmwert_aus' in lItem.conf else 0
lFinal = lItem.conf['blinken_final'] if 'blinken_final' in lItem.conf else ""
lInvert = 'blinken_invert' in lItem.conf
lNot = 'blinken_not' in lItem.conf
time.sleep(lStartPause / 10.0)
logger.info("Blinken {3} mal auf {0} mit ({1}/{2}), invertiert: {4}".format(lGA, lPuls, lPause, lAnzahl, lInvert))
lContinue = (lItem() > 0) != lNot
while lContinue and lAnzahl > 0:
lAnzahl = lAnzahl - 1
logger.debug("Blinken: GA {0} => {1}".format(lGA,int(not lInvert)))
if ldimmwert_ein == None:
sh.knx.groupwrite(lGA, not lInvert, '1')
else:
if lInvert:
sh.knx.groupwrite(lGA, ldimmwert_aus, '5')
else:
sh.knx.groupwrite(lGA, ldimmwert_ein, '5')
time.sleep(lPuls/10.0)
logger.debug("Blinken: GA {0} => {1}".format(lGA,int(lInvert)))
if ldimmwert_ein == None:
sh.knx.groupwrite(lGA, lInvert, '1')
else:
if not lInvert:
sh.knx.groupwrite(lGA, ldimmwert_aus, '5')
else:
sh.knx.groupwrite(lGA, ldimmwert_ein, '5')
lContinue = (lItem() > 0) != lNot
if lContinue: time.sleep(lPause / 10.0)
if lFinal != "":
lValue = sh.return_item(lFinal)()
logger.debug("Blinken final: GA {0} => {1}".format(lGA,lValue))
sh.knx.groupwrite(lGA, lValue, '1')
Inzwischen reicht mir die Logik nicht mehr aus, weil ich es gern blinken lassen möchte. Aber die Anzahl möchte insowfern selbst bestimmen, dass ich das blinken starten und stoppen kann. Deshalb stellt sich für mich die Frage, wie man das umsetzen kann? Ich habe das schon ein wenig probiert, aber optimal war alles nicht. Denn zum einen kann ich die Logik nicht ewig laufen lassen und zum anderen funktioniert das ohne Logik in Items nicht so toll.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. 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