KNX: Werte senden nach Neustart

Hallo zusammen,

ich bin neu bei Symcon und habe es bisher erfolgreich geschafft, die Gruppenadressen meines KNX Systems in Symcon einzulesen, darzustellen und Werte zu ändern. So weit perfekt.
Auch klappt es wunderbar, nach einem Symcon Neustart die Gruppenadressen vom Bus neu einzulesen, um einen konsistenten Status zu haben (zumindest nachdem ich herausgefunden habe, dass bei den Eigenschaften die Property „Lesen“ auf an gesetzt werden muss :slight_smile: ).

Nun bin ich aber auf ein Problem gestossen, wo ich auf Anhieb nicht im Forum die Lösung gefunden habe:
Ich habe eine weitere Gruppenadresse in der ETS definiert (DPT001), welche einen Aktor steuern soll, alleiniger Wertgeber soll hierbei Symcon sein, es existiert also kein KNX Gerät, welches Antworten kann.
Ich habe nun unter den Experteneinstellungen der Instanz „Read“ und „Empfangen“ auf aus gesetzt (da ja kein KNX Gerät antworten kann) und „Schreiben“ und „Senden“ auf an gesetzt (da Symcon ja die alleinige Kontrolle über den Wert hat und auch auf Leseanfragen auf dem KNX Bus antworten soll).

Funktioniert so weit, bis ich den Service Symcon neu starte (Ubuntu, service symcon restart).
Mein Verständnis ist nun, dass Symcon intern den Wert der Variablen speichern soll und diese nach dem Neustart wieder so setzt. Im WebView sehe ich dann auch z.B. „An“ für einen Schalter.
Jedoch kann ich diesen Wert zunächst nicht vom KNX Bus aus abfragen. Lese ich vom KNX Bus diese Gruppenadresse, so erhalte ich in den ersten beiden Minuten nach Neustart keine Antwort, danach dann schon.
In der ca. ersten Minute nach dem Neustart kann ich im WebFront auch nicht den Wert ändern, da erhalte ich einen Timeout.
Änder oder bestätige ich den Wert dann aber im WebFront, so wird dieser Wert auf den KNX Bus geschrieben und ich kann ab dann auch vom KNX Bus die Gruppenadresse lesen und erhalte von Symcon eine Antwort (also nicht erst nach zwei Minuten wie oben).

Was muss ich machen, damit Symcon nach einem Neustart sofort auf Leseanforderungen vom KNX Bus reagiert und den aktuellen Wert der variablen sendet? Oder ist dieser Zeitverzug auf interne Startvorgänge/Timer zurückzuführen?

Wie kann ich Symcon dazu bringen, nach einem Neustart für die Variablen, wo Symcon der alleinige Wertgeber ist (für KNX also das Gerät mit „L“), den Wert auf den Bus zu schreiben?
Müsste ich hier das Startscript, welches die KNX Zustände nach einem Neustart aktualisiert ergänzen, indem ich bei den DPTs, die bei IPS_Get_Property ein „CapabilityTransmit“ haben den Wert auf den KNX Bus schreibe? In der Instanz und der Variablen habe ich keine zumindest offensichtlichen Einstellmöglichkeiten gefunden.

Warum der die ersten Minuten blockiert ist eigenartig. Da muss mal @paresy sich zu äußern.

Zum automatischen Schreiben beim Start: Das würde ich genau wie von dir angedeutet über das Start-Script machen.

Ist IP-Symcon denn vollständig gestartet zu dem Abfrage-Zeitpunkt?

Du kannst ein Start-Skript unter Kern Instanzen → Events hinterlegen und dort dann diese „anstoßen“.

paresy

Unter Kern Instanzen → Events habe ich das Script eingebunden, welches in der Doku für die Abfrage der KNX Werte nach Neustart abgelegt ist.
Im Gruppenmonitor von ETS sehe ich dann auch alle Abfragen von Symcon durchlaufen, danach versuche ich dann, meine Gruppenadresse zu lesen und Symcon antwortet dann erstmal nicht…
Ich hätte gedacht, dass wenn in ETS die Abfragen durch sind auch Symcon mit dem Neustart durch ist? Oder wie kann ich das feststellen?

Kann es sein, dass das Abfragen vom KNX Bus so sehr den Bus belastet, dass dies nicht durch geht? Magst du mal das Start Skript deaktivieren und schauen, ob es dann besser reagiert?

paresy

Volltreffer, frage ich die KNX Objekte nach Neustart nicht ab, so antwortet Symcon sofort auf den ReadRequest auf die Gruppenadresse.

Nur, der EIB Konfigurator steht auf 10 Telegramme pro Sekunde, ich frage knapp 90 Gruppenadressen ab und sehe in der ETS dass die Abfragen gute 9 Sekunden dauern.
Da hätte ich nun gedacht, dass das Interface wieder „frei“ ist, da ja alle Abfragen durch sind und sofort antworten müsste?
Denn im Beispiel oben habe ich ja auch gewartet, dass Symcon alle Gruppenadressen abgefragt hat und dann hat es noch weitere 2 Minuten bis zu einer Antwort gedauert (siehe angehängtes Bild). Oder habe ich hier ein Verständnisproblem?

Noch eine andere Frage, in der Online Doku finde ich immer noch die EIB_xxx Befehle, nicht aber die KNX_WriteDPTxxx Befehle?

Korrekt. Du möchtest auch lieber RequestAction für alles verwenden. Das ist wesentlich einfacher zu merken - tut aber das selbe :slight_smile:

paresy

Woher weißt du das? Wenn jemand solch komplexe Dinge baut wie Abfragen der Zustände, etc. werden ggf. auch Variablen dabei sein, die keine StandardAktion haben. Da nützt auch kein RequestAction. Die dazu passende Funktion IPS_RequestAction ist ja leider versteckt.

Magst du das noch mal genauer erklären? Was soll an IPS_RequestAction besser sein?

paresy

RequestAction geht nur solange ich die Standardaktion aktiviert habe. Es gibt situationen in denen ich die ÜBERSCHREIBE oder ausschalte. Jetzt sagst du KNX_WriteDPTxy braucht keiner mehr. Aber genau in diesen Fällen benötige ich entweder die KNX_WriteDPTxy Funktion oder kann mit IPS_RequestAction (oder mit dem Suffix Ex - kann gerade nicht nachsehen) auf die Geräte Funktion wieder zugreifen.

Nochmal zurück zu den Zugriffsproblemen auf den KNX Bus.
Hier habe ich nun ein wenig getestet:

Die Telegrammrate habe ich von 10 auf 5 Telegramme pro Sekunde heruntergesetzt.
Das Script, welches den KNX Status beim Starten ausliest habe ich manuell gestartet.

Ergebnis:
Das Script alleine läuft ohne Probleme durch, sowohl mit der Begrenzung auf 10 als auch auf 5 Telegramme. Während das Script läuft, kann ich vom WebFront nicht auf den KNX Bus zugreifen, danach sofort wieder ohne Probleme. Die Leseanfragen von ETS auf die Gruppenadresse werden, während das Script läuft, gebuffert und nachher zusammenhängend vom Gateway beantwortet.
Nach dem Neustart von Symcon habe ich bei beiden Begrenzungen die zeitlichen Probleme.

Das das MDT IP Interface die Probleme macht würde ich damit ausschliessen.
Auch das Script/Gateway funktioniert ja vernünftig bei manuellem Trigger.

Was passiert nun aber beim Neustart, nachdem das Script durchgelaufen ist? Was blockiert mir hier das KNX Gateway?

hmm, irgendwie bin ich gerade in der Doku orientierungslos versackt…

Mit IPS_GetProperty($instanceID, „CapabilityTransmit“)) bekomme ich die instanceID vom DTP zurück, wie bekomme ich nun davon die variableID der dazugehörigen Variablen, die ich für den RequestAction benötige?
Muss ich hier wirklich für jeder Instanz mir die Liste aller Variablen anschauen und mittels $_IPS[‚TARGET‘] vergleichen, ob diese als übergeordnete ID die meiner Instanz hat?

Magst du kurz beschreiben was du machen möchtest? Aktuell verstehe ich es noch nicht. :slight_smile:

paresy

Ich möchte das Script, welches nach einem Neustart den KNX Status updated dahingehend ergänzen, dass es die Werte der Variablen der DPTs, welche „CapabilityTransmit“ haben auf den KNX schreibt.

Folgendes habe ich mir nun zusammengebastelt (hab IPS_GetChildrenIDs gefunden :slight_smile: ):

            default:
                //DPTs
                if(strpos($i['ModuleInfo']['ModuleName'], "DPT") !== false) {
                    if(IPS_GetProperty($instanceID, "CapabilityRead")) {
                        KNX_RequestStatus($instanceID);
                    }
                    if(IPS_GetProperty($instanceID, "CapabilityTransmit")) {
                        //echo "CapabilityTransmit: " . $instanceID . PHP_EOL;
                        $variables=IPS_GetChildrenIDs($instanceID);
                        if (sizeof($variables) == 1) {
                            //echo "VariableID: " . $variables[0] . PHP_EOL;
                            RequestAction($variables[0], GetValue($variables[0]));
                        } 
                    }
                }
                break;

Die zweite if-Abfrage habe ich in Eurem Beispiel ergänzt.
Eigentlich sollte jeder DTP nur eine Variable haben, daher die Abfrage sizeof().
Nur, ist die Zeile mit RequestAction korrekt, oder müßte ich hier nach Integer/Float/etc unterscheiden und entsprechende GetValueInteger/… verwenden?
Bei meinen DPT 1 funktionierts zumindest…

Das ist korrekt :slight_smile:

paresy

Supi, erstes Problem gelöst. :+1:
Bleibt nur noch das mit den Zugriffen direkt nach einem Neustart.
Hast Du hier noch Tipps, wonach ich schauen könnte?

Ehrlich gesagt habe ich da aktuell noch keinen heißen Tipp. Du könntest vielleicht mal im Debug schauen, ob dort etwas „passiert“ während das Problem besteht?

paresy

So, nach einigem Debuggen und ausprobieren haben wir die Lösung gefunden, dass Script zur Abfrage der KNX Zustände wird bei mir zu früh ausgeführt und überschneidet sich daher mit meiner ersten Anfrage. Das Reconnect wird dann erst nach einer Minte ausgeführt.

Lösung: sleep(1); bevor das Script aus der Doku abgearbeitet wird.


Fehlerfall:
root@symcon:/var/log/symcon# cat logfile.log | grep 20720
01.03.2021 14:04:57 | 20720 | DEBUG | ScriptEngine | Skriptausführung: 20720 ~ Absender: Startup
01.03.2021 14:05:15 | 20720 | DEBUG | ScriptEngine | Skriptausführung: 20720 ~ Absender: Startup ~ Dauer: 18496 ms
root@symcon:/var/log/symcon# cat logfile.log | grep EIB
01.03.2021 14:04:56 | 00000 | MESSAGE | ModuleLoader | # EIB Configurator geladen
01.03.2021 14:04:56 | 00000 | MESSAGE | ModuleLoader | # EIB Discovery geladen
01.03.2021 14:04:56 | 00000 | MESSAGE | ModuleLoader | # EIB Group geladen
01.03.2021 14:04:56 | 00000 | MESSAGE | ModuleLoader | # EIB Gateway geladen
01.03.2021 14:04:56 | 00000 | MESSAGE | ModuleLoader | # EIB Shutter geladen
01.03.2021 14:04:56 | 00000 | MESSAGE | ModuleLoader | # EIB RGB geladen
01.03.2021 14:04:56 | 00000 | MESSAGE | ModuleLoader | # EIB RGBW geladen
01.03.2021 14:04:56 | 53125 | MESSAGE | EIB Configurator | Erstelle…
01.03.2021 14:04:57 | 15276 | MESSAGE | EIB Gateway | Erstelle…
01.03.2021 14:04:57 | 15276 | DEBUG | EIB Gateway | Stelle Verbindung wieder her…
01.03.2021 14:04:57 | 15276 | DEBUG | EIB Gateway | Verbinde…
01.03.2021 14:04:57 | 22176 | DEBUG | VariableManager | [EIB Gateway\Tunnel Adresse] = 1.0.252
01.03.2021 14:04:57 | 15276 | DEBUG | EIB Gateway | Verbundene ID=17
01.03.2021 14:04:57 | 15276 | DEBUG | EIB Gateway | Trenne…
01.03.2021 14:05:20 | 15276 | ERROR | TimerPool | EIB Gateway (Initialize1): Zeitüberschreitung beim Warten auf Antwort
root@symcon:/var/log/symcon#

20720 ist das Script, welches die KNX Werte abfragt…

Mit sleep(1);
root@symcon:/var/log/symcon# cat logfile.log | grep EIB
02.03.2021 17:13:23 | 00000 | MESSAGE | ModuleLoader | # EIB Configurator geladen
02.03.2021 17:13:23 | 00000 | MESSAGE | ModuleLoader | # EIB Discovery geladen
02.03.2021 17:13:23 | 00000 | MESSAGE | ModuleLoader | # EIB Group geladen
02.03.2021 17:13:23 | 00000 | MESSAGE | ModuleLoader | # EIB Gateway geladen
02.03.2021 17:13:23 | 00000 | MESSAGE | ModuleLoader | # EIB Shutter geladen
02.03.2021 17:13:23 | 00000 | MESSAGE | ModuleLoader | # EIB RGB geladen
02.03.2021 17:13:23 | 00000 | MESSAGE | ModuleLoader | # EIB RGBW geladen
02.03.2021 17:13:23 | 53125 | MESSAGE | EIB Configurator | Erstelle…
02.03.2021 17:13:24 | 15276 | MESSAGE | EIB Gateway | Erstelle…
02.03.2021 17:13:24 | 15276 | DEBUG | EIB Gateway | Verbinde…
02.03.2021 17:13:24 | 22176 | DEBUG | VariableManager | [EIB Gateway\Tunnel Adresse] = 1.0.252
02.03.2021 17:13:24 | 15276 | DEBUG | EIB Gateway | Verbundene ID=17
root@symcon:/var/log/symcon# cat logfile.log | grep 20720
02.03.2021 17:13:24 | 20720 | DEBUG | ScriptEngine | Skriptausführung: 20720 ~ Absender: Startup
02.03.2021 17:13:43 | 20720 | DEBUG | ScriptEngine | Skriptausführung: 20720 ~ Absender: Startup ~ Dauer: 19291 ms
root@symcon:/var/log/symcon#