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.
Ankündigung
Einklappen
Keine Ankündigung bisher.
LinKNX: Diskussionen zu Tipps, Tricks und Beispiele
Sperren würde ich ungern. Was wenn der PM vorher gesperrt war? Verhalten zu Anfang und Ende der Sperre muss parametriert werden. Bestenfalls ist das Licht bei Beginn der Sperre schon an, aber was am Ende? Genau für sowas ist ja der Triggereingang: um eine vom PM nicht zu erfassende Präsenz zu signalisieren.
Mittlerweile habe ich die Doku diesbezüglich noch mal durchforstet: normal die Temp-GA empfangen und verarbeiten. Bei größer-gleich 30°C dann zwei Action: set-value auf PM-Trigger und zudem send-read-request mit delay von 50 Sekunden auf Temp-GA. Dann sollte der Spaß ja zyklisch weitergehen bis Temp kleiner 30°C. Kommt das hin?
Mmmh, ich leb mit dem Sperren-Szenario seit nem halben Jahr problemlos.
Ich komme ins Bad. Licht an, Zirkulation (manchmal an), gehe unter die Dusche, drehe auf. PM sperrt für 15 min, Licht bleibt an, Extra farbiges Duschlicht geht noch an.
Ich höre auf zu duschen und nach 15 min gehts Duschlicht aus, sowie die Sperre...
Aber ja, ggf gibts Situationen, wo das nicht passt...
Derzeit zwischen Kistenauspacken und Garten anlegen.
Baublog im Profil.
Mittlerweile habe ich die Doku diesbezüglich noch mal durchforstet: normal die Temp-GA empfangen und verarbeiten. Bei größer-gleich 30°C dann zwei Action: set-value auf PM-Trigger und zudem send-read-request mit delay von 50 Sekunden auf Temp-GA. Dann sollte der Spaß ja zyklisch weitergehen bis Temp kleiner 30°C. Kommt das hin?
Hallo Robert,
leider klappt das nicht! Nehmen wir an, die Temp ist 35°C. Dann wird die Rule mit der Condition > 30°C true und macht ihre Actions. Nach 50 Sec. kommen z.B. 34°C. Das ist immer noch >30°C, die Rule ist noch immer true. Folglich werden nicht erneut die Actions ausgeführt. Eine alternative sind hier statische objekte und rules (s-Flag und if-true/if-false bei actionlists).
Aber eigentlich müsste das doch nicht sein, oder? Warum alle 50 Sek. nach Temp. pollen? Ist das nur, um den PM nachzutriggern? Da gäbe es ein Pattern:
Code:
<rule id="count0" init="false">
<condition type="and">
<condition type="object" id="toggle" value="0" trigger="true"/>
<condition ... hier die condition die bestimmt wie lange das läuft ... trigger="true"/>
</condition>
<actionlist>
<action type="toggle-value" id="toggle" delay="50"/>
<action ... hier weitere actions ... />
</actionlist>
</rule>
<rule id="count1" init="false">
<condition type="and">
<condition type="object" id="toggle" value="1" trigger="true"/>
<condition ... hier die condition die bestimmt wie lange das läuft ... trigger="true"/>
</condition>
<actionlist>
<action type="start-actionlist" rule-id="count0" list="true"/>
</actionlist>
</rule>
Das coding oben macht alle 50 Sek. was, und nur so lange wie eine bestimmte condition true ist (z.B. Deine Temp > 30°C). Verwende ich bei mir immer, wenn ich einen Timer haben will, den ich ein- und ausschalten kann.
Vielleicht hilft es ja.
Zu Deinen anderen Punkten kann ich noch nicht sagen, ich habe sie noch nicht wirklich verstanden... ist aber auch schon spät...
Allerdings: wenn die Temperatur während der 50sec z.B. mehrfach gesendet werden, werden mehrere per delay verzögerte "send-read-request" in die Warteschlange geschrieben. Um das zu verhindern, dachte ich ich könnte mit type="cancel" die noch wartenden Actions der Rule pro-forma immer abbrechen. Scheinbar wirkt das Cancel aber auch auf die (zeilenmäßig) nachfolgenden Anweisungen: das "set-value" wird ausgeführt, das mit "delay" verzögerte "read-request" aber wird gar nicht ausgeführt! Ist das ein Bug oder ein Feature? Eigentlich sollte "cancel" doch nur bereits vorgesehene Actions abbrechen, oder?
Zum Nachtlicht: Scheint sehr ähnlich dem problem von mode etwas weiter vorne im thread zu sein: mehrere mögliche Trigger, ich will aber abhängig vom Trigger nur eine dem einzelnen Trigger zugeordnete Action ausführen.
Ich habe zehn Lampen/EVGs, die in der Nacht nur gedimmt angeschaltet werden sollen. Dafür muss je Lampe die Schalt-GA (DPT 1.xxx) überwacht werden, und wenn die Lampe eingeschaltet wird und der Nachtmodus aktiv ist auf eine entsprechende Dimm-GA ein Dimmwert geschrieben werden. Bisher konnte ich das mit einer "Logik"/Plugin für alle zehn Lampen erschlagen. Geht sowas auch mit Linknx oder muss ich für jede Lampe eine (kurze) eigene Regel anlegen? Oder eben LUA?
Ansonsten bin ich echt sehr glücklich mit Linknx! Bis auf solche Sonderfälle konnte ich die Sachen sehr kompakt und übersichtlich migirieren!
An dieser Stelle auch noch mal vielen Dank an mumpf für das xsd! Das macht das erstellen von XML-Definitionen wirklich zum Vergnügen und verhindert Fehler!
Du darfst Dir die Ausführung der actions in linknx nicht als linearen Prozess vorstellen! Sie werden alle parallel ausgeführt. Es ist somit keine "Queue", sondern es sind verschiedene Threads, die möglicherweise schlafen (bei delay).
Konkret gibt es bei Dir folgenden Effekt:
alle 3 actions (cancel-action, set-value-action, read-request-action) werden gestartet.
die cancel-action sucht jetzt alle threads, die schlafen und von der rule erzeugt worden sind
gleichzeitig schreibt die set-value-action ihren Wert auf den Bus
gleichzeitig wird die read-request-action schlafend markiert, da sie ja ein delay hat
Die Schleife, die in der cancel-action die schlafenden Threads durchsucht, wird somit sehr sicher auch die gerade erzeugte read-request-action finden und auch mit canceln. Somit kannst Du das nicht einfach so machen.
Ich hab mal so ein Problem gehabt und es irgendwie gelöst, aber da muss ich zu Hause nachschauen und kann Dir erst heute Abend was dazu schreiben.
Gruß, Waldemar
P.S.: Freut mich, dass Du das xsd nutzt und es als hilfreich empfindest, ich könnte nicht mehr ohne... mit welchem xml-Editor arbeitest Du denn?
Habe jetzt bezüglich der actions noch mal eine Nachfrage:
Innerhalb meiner TV-Regel verwende ich copy-value, um z.B.den Zustand des Präsenzmelder-Sperrobjektes vor dem aktivieren der Szene zu sichern, um ggfl. nach Beendigung der Szene (TV aus) diesen automatisch zu restaurieren. "Anschließend" sperre ich den pm natürlich.
Code:
<objects>
<!-- Objekte für Szene TV) -->
<object id="szene_tv_pm_sperre_vorher" type="1.001" init="off">Zustand der Präsenzmelder-Sperre vor der Szene TV</object>
<object id="szene_tv_rs_position_vorher" type="5.001" init="request">Zustand der Raffstore-Position vor der Szene TV</object>
<object id="szene_tv_rs_lamelle_vorher" type="5.001" init="request">Zustand der Raffstore-Lamelle vor der Szene TV</object>
<object id="szene_tv_rs_automatik_vorher" type="1.001" init="request">Zustand der Raffstore-Automatik vor der Szene TV</object>
<object id="beleuchtung_wohnzimmer_couch_kamin_gesamt_schalten" gad="2/1/21" type="1.001" init="request" flags="ctu">Beleuchtung Wohnzimmer Couch+Kamin gesamt Schalten</object>
<object id="steckdose_wohnzimmer_stehlampe_schalten" gad="3/1/3" type="1.001" init="request" flags="ctu">Steckdose Wohnzimmer Couch Ader 2 (sw) Stehlampe Schalten</object>
<object id="raffstore_wohnzimmer_west_tv_position" gad="4/1/193" type="5.001" init="request" flags="cwtu"><listener gad="4/1/213" read="true"/>Raffstore Wohnzimmer West TV Position</object>
<object id="raffstore_wohnzimmer_west_tv_lamelle" gad="4/1/194" type="5.001" init="request" flags="cwtu"><listener gad="4/1/214" read="true"/>Wohnzimmer West TV Lamelle</object>
<object id="raffstore_wohnzimmer_west_tv_automatik" gad="4/1/202" type="1.001" init="request" flags="cwtu"><listener gad="4/1/218" read="true"/>Wohnzimmer West TV Automatik</object>
<object id="praesenzmelder_wohnzimmer_tv_helligkeitsobjekt" gad="5/1/11" type="1.001" init="request" flags="cwu">Präsenzmelder Wohnzimmer TV Helligkeitsobjekt</object>
<object id="praesenzmelder_wohnzimmer_tv_trigger" gad="5/1/12" type="1.001" init="request" flags="ctf">Präsenzmelder Wohnzimmer TV Trigger</object>
<object id="praesenzmelder_wohnzimmer_tv_sperre" gad="5/1/13" type="1.001" init="request" flags="cwtu">Präsenzmelder Wohnzimmer TV Sperre</object>
<object id="stromwert_multimedia_tvpvr" gad="6/0/1" type="9.xxx" init="request" flags="cwu">Stromwert Multimedia TV/PVR</object>
<object id="wetter_helligkeit_west" gad="6/3/157" type="9.xxx" init="request" flags="cwu">Wetter Helligkeit West</object>
</objects>
<rule id="regel_szene_tv_beleuchtung">
<condition type="and">
<condition type="object" id="stromwert_multimedia_tvpvr" op="gte" value="0.9" trigger="true"/>
<condition type="object" id="praesenzmelder_wohnzimmer_tv_helligkeitsobjekt" value="1" trigger="true"/>
</condition>
<actionlist type="on-true">
<!-- sichern der Zustände vor Aktivierung der Szene -->
<action type="copy-value" to="szene_tv_pm_sperre_vorher" from="praesenzmelder_wohnzimmer_tv_sperre"/>
<action type="set-value" id="steckdose_wohnzimmer_stehlampe_schalten" value="1"/>
<action type="set-value" id="praesenzmelder_wohnzimmer_tv_sperre" value="1" delay="150ms"/>
<action type="set-value" id="beleuchtung_wohnzimmer_couch_kamin_gesamt_schalten" value="0" delay="200ms"/>
</actionlist>
<actionlist type="on-false">
<action type="conditional">
<!-- falls PM vorher nicht gesperrt war, Sperre wieder zurücksetzen! -->
<condition type="object" id="szene_tv_pm_sperre_vorher" value="0"/>
<action type="set-value" id="praesenzmelder_wohnzimmer_tv_sperre" value="0"/>
<action type="set-value" id="praesenzmelder_wohnzimmer_tv_trigger" value="1" delay="100ms"/>
</action>
<action type="set-value" id="steckdose_wohnzimmer_stehlampe_schalten" value="0"/>
</actionlist>
</rule>
Frage: muss ich da unbedingt beim Sperren mit einem delay arbeiten, oder kann ich mich darauf verlassen, dass das copy-value (ggfl. benötigt das ja einen read-request!) immer vor dem set-value aufgerufen wird?
Teilweise könnte ich die Sache umgehen, wenn ich mit einer action type="conditional" erst den Wert (erzwungenermaßen) abfrage und dann mit set-value de-facto alle Werte manuell setze. Allerdings kommt das der Klarheit der Regel nicht gerade zu Gute.
Bisher habe ich in den Logs den Eindruck, als ob die "Actions" doch der Reihenfolge nach abgearbeitet würden und somit die Delays größtenteils entfallen könnten?
Ansonsten bin ich von linknx restlos begeistert - die obige TV-Regel funktioniert nach ersten Tests perfekt. Gleiches habe ich auch für die Verschattung beim TV-Gucken vorbereitet (Glotze steht bei uns vor einem bodentiefen Fenster).
LinKNX: Diskussionen zu Tipps, Tricks und Beispiele
Hat jemand eigentlich Aktionen in LinKNX die mit dem IRTrans LAN zusammen arbeiten?!
Würde es einerseits gerne für die Statuserkennung nutzen (sehen ob TV oder Receiver) eingeschaltet sind. Zusätzlich würde ich gerne bei "Zentral Aus" entsprechende Befehle senden.
Desweiteren bin ich noch auf der Suche nach Ideen, was man noch so alles mit dem IRTrans und LinKNX anstellen kann.
zuerstmal: Alles was ich hier sage, ist entweder "Erfahrung", Beobachtung oder angelesenes Wissen - ich weiß nicht exakt, wie linknx actions prozessiert - ich hab es nicht programmiert.
Allerdings habe ich gelesen, dass man annehmen sollte, dass alle actions in einer actionlist parallel abgearbeitet werden. Ich hatte auch schon Fälle, bei denen ich aufeinanderfolgende formula-actoins hatte, bei der die 2. Formel das Ergebnis der 1. weiterverarbeitet hat und die erst zuverlässig funktionierten, wenn ich bei der 2. Formel ein delay von 25ms eingefügt hatte.
Ich bin mir auch sicher, dass wenn eine action ein read-request intern macht, die anderen sicherlich weiterlaufen und nicht warten. Allerdings ist auch hier meine Beobachtung die, dass gar kein read-request gemacht wird, sondern mit dem gerade vorhandenem Wert agiert wird, da dieser ja irgendwann "vorher" - also vom letzten write - gesetzt worden ist. Und wenn der Wert noch nie gesetzt worden ist, gibt es zwar einen read-request, aber hier gibt es immer wieder ein komisches Verhalten (hab auch schon einen Bug bei den linknx-Jungs gemeldet). Ich hab mir für linknx eigens eine rule für die Initialisierung ausgedacht, damit ich mich nicht auf das Init-Verhalten von linknx verlassen muss und zumindest die Option habe, es anders zu machen.
Ansonsten mach ich auch sehr vieles mit linknx und bin auch begeistert, denn ich halte es für besser und einfacher, über Regeln zu formulieren, was ich will, statt über Algorithmen das wie zu implementieren. Aber ich nutze durchaus auch Wiregate-Plugins für einige Sachen: RRDs wegschreiben, Abfrage vom Google-Kalender, RFID-Erkennung sind Beispiele, die über einen Algorithmus einfacher zu lösen sind.
Zu Deinem Beispiel oben: Solange es zuverlässig läuft, würde ich es so lassen - also quasi sequentiell. Und wenn Du feststellst, dass sporadisch nicht läuft, würde ich die Logs durchgehen und checken, ob sich das Verhalten mit Parallelität erklären lässt - wenn ja, kannst Du immer noch delays oder ähnliches einführen.
Hat jemand eigentlich Aktionen in LinKNX die mit dem IRTrans LAN zusammen arbeiten?!
Hi netsrac,
ich hab zwar kein IRTrans, aber ich werte lirc aus, das sind auch LAN-basierte Messages. Kannst Du denn mit telnet über irgendeinen port die Nachrichten mitlesen, die IRTrans sendet? Wenn ja, kann ich hier gerne mal ein paar Beispiele reinstellen, denn dann wird es wohl auch mit linknx klappen.
Ich denke, die Deklaration ist selbsterklärend, host, port und id musst Du anpassen - das kommt in die services section. Permanent=true ist nötig, weil Du Daten empfangen willst, wenn Du nur senden willst, kann man permanent auch auf false lassen.
Die Rules sehen dann so aus (hier ein toggle meiner Stehlampe von der Fernbedienung aus):
Die condition ist immer true, wenn der expected-string über den port gelesen wird. Der String muss eindeutig sein und wird immer vom Anfang der Zeile an betrachtet. Sprich die eigentliche Nachricht bei mir ist
Wenn ich nun mehrmals 0 oder 1 hintereinander mit groupswrite auf "input" sende, dann werden immer beide true bzw. beide false Aktionen ausgeführt unabhängig vom Zustand der rule.
Code:
[SIZE=2]2013-05-30 00:13:35 [ INFO] Object: New value off for object input (type: 1.001)
2013-05-30 00:13:35 [ INFO] Rule: Evaluate rule Test
2013-05-30 00:13:35 [ INFO] ObjectValue: SwitchingObjectValue: Compare value_m='0' to value='1'
2013-05-30 00:13:35 [ INFO] Condition: ObjectCondition (id='input') evaluated as '0'
2013-05-30 00:13:35 [ INFO] Rule: [COLOR=Red]Rule Test evaluated as 0, prev value was 0[/COLOR]
2013-05-30 00:13:35 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_1 with value off[/COLOR]
2013-05-30 00:13:35 [ INFO] KnxConnection: write(gad=2/1/1, buf, len=2)
2013-05-30 00:13:35 [ INFO] Object: New value off for object 2_1_1 (type: 1.001)
2013-05-30 00:13:35 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_6 with value off[/COLOR]
2013-05-30 00:13:36 [ INFO] Object: New value off for object 2_1_1 (type: 1.001)
2013-05-30 00:13:36 [ INFO] Object: New value off for object input (type: 1.001)
2013-05-30 00:13:36 [ INFO] Rule: Evaluate rule Test
2013-05-30 00:13:36 [ INFO] ObjectValue: SwitchingObjectValue: Compare value_m='0' to value='1'
2013-05-30 00:13:36 [ INFO] Condition: ObjectCondition (id='input') evaluated as '0'
2013-05-30 00:13:36 [ INFO] Rule: [COLOR=Red]Rule Test evaluated as 0, prev value was 0[/COLOR]
2013-05-30 00:13:36 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_1 with value off[/COLOR]
2013-05-30 00:13:36 [ INFO] KnxConnection: write(gad=2/1/1, buf, len=2)
2013-05-30 00:13:36 [ INFO] Object: New value off for object 2_1_1 (type: 1.001)
2013-05-30 00:13:36 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_6 with value off[/COLOR]
2013-05-30 00:13:36 [ INFO] Object: New value off for object 2_1_1 (type: 1.001)
2013-05-30 00:13:41 [ INFO] Object: New value on for object input (type: 1.001)
2013-05-30 00:13:41 [ INFO] Rule: Evaluate rule Test
2013-05-30 00:13:41 [ INFO] ObjectValue: SwitchingObjectValue: Compare value_m='1' to value='1'
2013-05-30 00:13:41 [ INFO] Condition: ObjectCondition (id='input') evaluated as '1'
2013-05-30 00:13:41 [ INFO] Rule: [COLOR=Red]Rule Test evaluated as 1, prev value was 0[/COLOR]
2013-05-30 00:13:41 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_0 with value on[/COLOR]
2013-05-30 00:13:41 [ INFO] KnxConnection: write(gad=2/1/0, buf, len=2)
2013-05-30 00:13:41 [ INFO] Object: New value on for object 2_1_0 (type: 1.001)
2013-05-30 00:13:41 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_5 with value off[/COLOR]
2013-05-30 00:13:41 [ INFO] KnxConnection: write(gad=2/1/5, buf, len=2)
2013-05-30 00:13:41 [ INFO] Object: New value off for object 2_1_5 (type: 1.001)
2013-05-30 00:13:41 [ INFO] Object: New value on for object 2_1_0 (type: 1.001)
2013-05-30 00:13:41 [ INFO] Object: New value off for object 2_1_0 (type: 1.001)
2013-05-30 00:13:42 [ INFO] Object: New value on for object input (type: 1.001)
2013-05-30 00:13:42 [ INFO] Rule: Evaluate rule Test
2013-05-30 00:13:42 [ INFO] ObjectValue: SwitchingObjectValue: Compare value_m='1' to value='1'
2013-05-30 00:13:42 [ INFO] Condition: ObjectCondition (id='input') evaluated as '1'
2013-05-30 00:13:42 [ INFO] Rule: [COLOR=Red]Rule Test evaluated as 1, prev value was 1[/COLOR]
2013-05-30 00:13:42 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_0 with value on[/COLOR]
2013-05-30 00:13:42 [ INFO] KnxConnection: write(gad=2/1/0, buf, len=2)
2013-05-30 00:13:42 [ INFO] Object: New value on for object 2_1_0 (type: 1.001)
2013-05-30 00:13:42 [ INFO] Action: [COLOR=Blue]Execute SetValueAction: set 2_1_5 with value off[/COLOR]
2013-05-30 00:13:42 [ INFO] Object: New value on for object 2_1_0 (type: 1.001)[/SIZE]
Vielleicht bin ich zu müde, um einen Denk-/Schreibfehler zu erkennen. Testsystem: Ubuntu VM mit linknx 0.1.30.
Du beschäftigst Dich in Deinem ersten Beitrag gleich mit hartem Tobak
Ich hatte das auch mal so ausprobiert - mit dem gleichen Ergebnis. Ich halte es für einen Fehler, aber man kann die Doku auch folgendermaßen interpretieren:
Nicht jede actionlist ist statisch oder dynamisch, sondern immer die ganze Rule. Soweit ich mich an meine Tests erinnere, ist eine Rule statisch, sobald auch nur eine actionlist mit if-true oder if-false drin ist. Dein Beispiel ist somit auf jeden Fall statisch und dann wird einfach jede true-actionlist (auch die on-true) bzw. jede false-actionlist in Abhängigkeit von der Bedingung ausgeführt.
Du kannst aber das was Du möchtest
(4 verschiedene Übergänge
0->1
1->0
x->1
x->0)
erreichen, indem Du 2 rules draus machst: eine statische (mit den beiden if-xxx) und eine dynamische (mit den beiden on-xxx).
Ich finde dieses "versteckte" Verhalten sehr gewöhnungsbedürftig (falls es sich um keinen Bug handelt). Eine klare, eindeutige Sprache wäre mir lieber. Je mehr zusätzliche "Dimensionen" man sich denken muß, desto höher die Wahrscheinlichkeit einen Fehler zu machen, weil man etwas nicht berücksichtigt hat. Bei 4 Objekten und 4 Rules ist es noch überschaubar ...
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