IP-Symcon reagiert auf deaktiviertes Ereignis

oder: ist IP-Symcon zu schnell für sich selbst?

Moin zusammen,

ich habe ein Ereignis, welches auf die „Wert“-Variable einer KNX Instanz reagiert. Es gibt nun eine Situation, in der möchte ich nicht, dass das Ereignis ausgelöst wird. Also deaktiviere ich das Ereignis, schalte die KNX Instanz und aktiviere das Ereignis wieder.

Das zugehörige Skript:


<?php

IPS_SetEventActive(57959, FALSE);
KNX_WriteDPT1(23168, FALSE);
IPS_SetEventActive(57959, TRUE);

Dadurch, dass ich das Ereignis 57959 deaktiviere, dürfte das Schalten der Instanz 23168 keinerlei Auswirkungen haben.

Man sieht an den Uhrzeiten hier jedoch, dass das Skript 45298 trotzdem ausgeführt wird, obwohl ich das Ereignis deaktiviere:

Frage: Theoretisch würde ich davon ausgehen, dass IP-Symcon die Befehle im Skript nacheinander abarbeitet, also erst wird das Ereignis deaktiviert, dann wird die KNX Instanz geschaltet und dann wird das Ereignis wieder aktiviert. Es ist aber so, dass das Skript ausgeführt wird, was ja eigentlich nicht sein dürfte.

„Status emulieren“ in der KNX Instanz ist aktiviert, das heißt das die ggf. um wenige ms verzögerte Antwort des Aktors dann das wieder aktive Ereignis auslöst, würde ich ausschließen.

Hat hier jemand Ideen, was das sein könnte? Oder habe ich einen Denkfehler?

Grüße,
Christoph

Hast du geprüft ob die Variable sich wirklich ändert nach dem KNX_WriteDPT1 und dem Empfang vom Bus? Nicht das sie mal kurz hin/herspringt.

Unabhängig von KNX hatte ich das auch schon.
Da hilft nur eine Pause nach dem IPS_SetEventActive.
Musste ich beim Etagenlicht auch vor dem aktiveren der Ereignisse einbauen.
Michael

Ja, sie ändert sich. Ein Hin- und Herspringen ist zumindest nicht ersichtlich. Müsste man mal im Debug Log nachschauen.

Scheint so. Aber warum? Ich hätte erwartet, dass die Befehle des Skriptes nacheinander abgearbeitet werden. @paresy?

Die Abarbeitung der Ereignisse ist asynchron zu deinem Skript. D.h. dein Vorgehen klappt so leider nicht. Wenn du ein sleep einbauest vor dem Aktivieren sollte es gehen - ist aber keine vollständig korrekte Lösung da bei Latenzen im Kernel > Sleepzeit das Problem wieder da ist.

Ich würde eher ein Flag setzen welches im Ereignis wieder deaktiviert wird und dann die Ausführung dadurch einmalig überspringt.

paresy

Okay, das erklärt einiges.

Würde es helfen, wenn ich nach dem deaktivieren mit IPS_GetEvent abfrage, ob es wirklich deaktiviert ist und erst dann das KNX_WriteDPT1 auslöse?

Nein - das löst das von mir beschriebene Problem nicht. Zum Zeitpunkt der Ausführung ist das Ereignis wieder aktiv. Somit musst du dies nicht prüfen :wink:

Wie gesagt: Beide Dinge laufen parallel. Und dadurch entsteht das Problem.

paresy