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.
Cool, nach über 3 Jahren stellt sich raus, dass all mein Code auch auf Lese- und Antworttelegramme reagiert. OK, die Funktion gibt es noch nicht soo lang, aber trotzdem ... [EDIT: Doch, Funktion gibt es seit 3 Jahren https://knx-user-forum.de/144403-post6.html ]
-> Generell also alle event()s von GAs gegen eventwrite() tauschen ...
Und was machen da die ganzen anderen Varianten eine GA auszulesen?
[highlight=epc]
x=GA
if GA then ...
if change(GA) then ...
[/highlight]
Reagieren die auch auf jeden Telegrammtyp?
Panik ...
[EDIT: Thema war zwar bekann, wurde aber völlig verdrängt ]
Und was machen da die ganzen anderen Varianten eine GA auszulesen?
x=GA
Dieses Kommando setzt den Wert für die Variable x auf den Wert von GA. x ändert sich also immer dann, wenn sich auch der Wert von GA ändert. Generell macht es im Code dann keinen Unterschied, ob du x oder GA verwendest, da beide den gleichen Wert haben. Die GA einer Variablen zuweisen macht eigentlich nur dann Sinn, wenn du mit der Variable weiterrechnen willst oder wenn die Variable im Code oft vorkommt und du das ganze übersichtlicher gestalten willst bzw. flexibler bist, falls sich die Definition von GA mal ändern sollte.
if GA then ...
Diese IF-Abfrage geht immer dann auf, wenn sich der Wert von AUS auf EIN ändert. Ist GA bereits ein und kommt noch ein EIN-Telegramm, tut sich nichts.
if change(GA) then ...
Diese IF-Abfrage geht dann auf, wenn sich der Wert von GA ändert, also immer dann wenn ein Telegramm empfangen wird, das einen anderen Wert übermittelt als jenen der aktuell für GA gespeichert ist.
in dem Zusammenhang nichts! "event()" reagiert auf Telegramme am Bus zur entsprechenden GA, nicht darauf, dass die GA im Programm verwendet wird.
Hä?
Worum es geht, ist die darauf folgende Frage (ich weiß, stand versteckt, erst nach dem Beispiel):
Wie reagieren die anderen Varianten auf andere Telegramm-Typen?
Beispiel aus dem Handbuch:
[highlight=epc]
[EibPC]
// Der Szenenaktor
scene('1/2/3'u08, "Lampe-1/1/1", "Dimmer-1/2/2"u08)
// Variablen
Tastendruck=0
Szene =1
// Zählen des Tastendrucks
if (("Schalter-1/0/0") and event("Schalter-1/0/0")) then Tastendruck= Tastendruck+1 endif
// Rücksetzten des Zählers
if after(event("Schalter-1/0/0"),1000u64) then Tastendruck=0 endif
// Speichern oder Aufrufen
if after(event('1/0/0'b01),1000u64) and (Tastendruck ==1) then callscene('1/2/3'u08,Szene) endif
if after(event('1/0/0'b01),1000u64) and (Tastendruck ==2) then storescene('1/2/3'u08,Szene) endif
[/highlight]
Sowohl das Zählen, als auch das Auswerten eines langen/kurzen Tastendrucks könnte betroffen sein. Die Frage ist, was macht if GA then? Reagiert es auch auf beliebige Telegramm-Typen?
Wer so Events zählen will, wird evtl. auch die Leseabfragen mitzählen.
Grundsätzlich verwendet KEIN Beispiel in der Anleitung eventwrite(). Auch wenn dies meist keine wirklichen Auswirkungen haben wird: Es ist weder robust, noch die richtige Vorgehensweise in einer Anleitung, oder?
Ps. Welchen Wert für die GA liefert denn eine Leseanforderung eigentlich im eibPC?
wenn 1/0/0 auf EIN steht wird der then-Zweig auch durch ein Lese-Tegramm getriggert und ausgeführt. Antwort-Telgramm ebenso.
Ob Du das so willst, musst Du selbst wissen, wenn nicht dann hilft vermutlich eventwrite()
Und 1/0/0 hat logischerweise den Wert, der zuletzt auf dem Bus gesendet wurde, egal ob write oder response. Jedenfalls würde alles andere keinen Sinn machen, gezielt getestet hab ich's noch nicht.
....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!
wenn 1/0/0 auf EIN steht wird der then-Zweig auch durch ein Lese-Tegramm getriggert und ausgeführt. Antwort-Telgramm ebenso.
Na, so weit war ich auch schon, sonst würde ich das ja nicht schreiben.
Ob Du das so willst, musst Du selbst wissen, wenn nicht dann hilft vermutlich eventwrite()
Ob ich das so will ist wohl in der Anleitung nicht die Fragen, oder?
Und 1/0/0 hat logischerweise den Wert, der zuletzt auf dem Bus gesendet wurde, egal ob write oder response.
Jedenfalls würde alles andere keinen Sinn machen, gezielt getestet hab ich's noch nicht.
Sinn würde es zwar auch machen, wenn der eibPC generell nur auf normale Telegramme reagiert und nur im "Sonderfall" auch auf Lese- und Antworttelegramme, aber soweit ist es auch klar.
Nun kommt die Frage aber auf die Lese-Telegramme. Wenn die auch auslösen, wird es schon komplexer.
Ob der Wert der GA bei einem Lese-Telegramm tatsächlich unverändert bleibt ist auch nicht selbstverständlich, aber wenn auch noch getriggert wird ist es schon eher unverständlich.
Und dazu steht in der Anleitung nichts, zumal ja schon das eventwrite() überhaupt nicht besprochen/verwendet wird.
Ob der Wert der GA bei einem Lese-Telegramm tatsächlich unverändert bleibt ist auch nicht selbstverständlich, aber wenn auch noch getriggert wird ist es schon eher unverständlich.
natürlich bleibt er unverändert! Welche Wert sollte er denn annehmen? Das Lesetelegramm enthält selbst ja gar keinen Wert, also wo sollte ein neuer Wert herkommen?
Oder sprichst Du jetzt wieder vom Wert im then-Zweig? Der bleibt natürlich NICHT unverändert.
....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!
Nicht in der Anleitung, aber oben hast Du die Frage selbst gestellt....
Haha.
Wenn ein Beispiel in der Anleitung steht, ist die Erwartungshaltung, dass explizit solche Nebeneffekte berücksichtigt sind, oder gar nicht auftreten.
Erst recht wenn es ein Kommando für die robuste Implementierung gibt.
DAS sie das tun, sind wir uns doch schon einig, doer?
Bei mir ist die Erkenntnis schon länger gereift, ja. Die Konsequenz daraus ist entscheiden.
natürlich bleibt er unverändert! Welche Wert sollte er denn annehmen? Das Lesetelegramm enthält selbst ja gar keinen Wert, also wo sollte ein neuer Wert herkommen?
Das war nur eine beiläufige Frage. Trotzdem bleibt bei der Analyse des Codes die Frage, welchen Zustand die GA hat. Annahmen oder Wahrscheinlichkeiten sind nun wirklich keine Hilfe bei der eibPC-Programmierung. Da sind schon viele drauf reingefallen.
Oder sprichst Du jetzt wieder vom Wert im then-Zweig? Der bleibt natürlich NICHT unverändert.
Ich spreche nicht "jetzt wieder" davon, sondern das ist das Thema, der Code reagiert auf den "falschen" Event und das steht auch noch so in der Anleitung. Keines der Beispiele in der Anleitung ist robust einer Leseanforderung gegenüber (wobei auch andere Effekte falsche Aktionen verhindern). Und wie ist es bei den Makro-Libs???
Wenn ich nur den eibPC in der Verteilung habe, mag das genug sein, schon ein 2. eibPC oder eine VISU kann aber alles zerhageln.
Weiter gedacht: Was passiert bei [InitGA] mit dem "generierten Event"? Sollte ich den aktuellen Status des Tasters bzw. Aktors benötigen (und der ist EIN), ist das auch ein Auslöser? Komm jetzt bitte nicht mit "Wahrscheinlich ja"
Ich spreche nicht "jetzt wieder" davon, sondern das ist das Thema, der Code reagiert auf den "falschen" Event und das steht auch noch so in der Anleitung.
Das erklärt, warum wir die ganze Zeit aneinander vorbei reden....
Du hast oben aber explizit von
Ob der Wert der GA bei einem Lese-Telegramm tatsächlich unverändert
gesprochen und das in Zusammenhang mit diesem Code
if (("Schalter-1/0/0") and event("Schalter-1/0/0")) then Tastendruck= Tastendruck+1 endif
Gar nichts, weil das eigentliche Programm erst nach Abarbeitung der InitGA Sektion startet.
Schön, dass du so davon überzeugt bist.
Die Anleitung sagt etwas anderes:
"Alle Anweisungen die als Bestandteil einer der in der Sektion [InitGA] aufgeführten Gruppenadressen
beinhalten, werden ungültig und die Verarbeitung im ersten Durchlauf ausgeführt." S.155 "HandbuchEibPC-27.odt, 2014-06-18"
Nein, tut sie nicht. Im Handbuch steht explizit "Gruppenadressen". Hier wird also kein Event ausgelöst und darauf hat deine Frage ja abgezielt.
Ein genereller Tipp noch: bevor du hier immer wieder kritisierst was im Handbuch nicht alles unvollständig oder mißverständlich dokumentiert ist, im Zweifel einfach mal ausprobieren, was eine Funktion unter bestimmten Situationen macht. Das dauert nicht lange und man hat Gewißheit dass der Code auch so funktioniert wie man es vermutet. Eine Anleitung kann nur selten restlos alle Fragen klären (auch in anderen Programmierumgebungen nicht). Ab und zu muss man halt einfach testen was Sache ist.
Nein, tut sie nicht. Im Handbuch steht explizit "Gruppenadressen". Hier wird also kein Event ausgelöst und darauf hat deine Frage ja abgezielt.
Tut es doch! Steht auch da, genau im von mir zitierten Text.
Ein genereller Tipp noch: bevor du hier immer wieder kritisierst was im Handbuch nicht alles unvollständig oder mißverständlich dokumentiert ist, im Zweifel einfach mal ausprobieren, was eine Funktion unter bestimmten Situationen macht. Das dauert nicht lange und man hat Gewißheit dass der Code auch so funktioniert wie man es vermutet. Eine Anleitung kann nur selten restlos alle Fragen klären (auch in anderen Programmierumgebungen nicht). Ab und zu muss man halt einfach testen was Sache ist.
Du schreibst dir also deine Anleitung dann selbst? Das hilft ungemein!
Anstatt hier kluge Reden zu schwingen, solltest du es mal lieber selber testen.
Ich gebe dir dann auch noch den Tipp, dass das Beispielprogramm aus der Anleitung einen Bug hat. Den darfst du dann gleich auch noch finden.
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