KNX Telegramme blockieren alle Threads

Danke dir, werde ich morgen mal beides testen.
VG,
Doc

Hallo Michael,
ich habe mir gerade die hängenden Threads bei Verbindungsverlust noch einmal angeschaut.
Wenn ich dich richtig verstanden habe, müsste das Script bei 2x KNX_Write und unterbrochener Verbindung nach ca. 10s. automatisch abgebrochen werden.

Wenn ich mir die Threadliste anschaue, hängen die Threads aber auch nach 3 Min. noch da drin.
Habe ich da einen Denkfehler oder müssten die nicht schon lange abgebrochen sein?

// Script zum Beschreiben des MDT Smart Tasters

$ID_Instanz_Text1 = 13207;
$ID_Instanz_Text2 = 25027;
$ID_Zaehler = 38971;

// -------------------------------------
$Zaehler = GetValue($ID_Zaehler);

switch ($Zaehler) {
           
        case 0    : $Text1 = "Uhrzeit";
                    $Text2 = date("H:i");
                    SetValue($ID_Zaehler, ($Zaehler + 1));
                    break;

        case 1    : $Text1 = "Batterie";
                    $Text2 = GetValue(16223)."% / ".GetValue(19925)."W";
                    SetValue($ID_Zaehler, ($Zaehler + 1));
                    break;

        case 2    : $Text1 = "PV Leistung";
                    $Text2 = GetValue(27358)."W/".round(GetValue(16048),1)."kWh";
                    SetValue($ID_Zaehler, ($Zaehler + 1));
                    break;

        case 3    : $Text1 = "Netzbezug";
                    $Text2 = round(GetValue(36301),0)."W/".round(GetValue(22013),1)."kWh";
                    SetValue($ID_Zaehler, ($Zaehler + 1));
                    break;

        case 4    : $Text1 = "7Tage Inzidenz";
                    $Text2 = "Kleve: ".round(GetValue(49407),1);
                    SetValue($ID_Zaehler, ($Zaehler + 1));
                    break;

        case 5    : $Text1 = "7Tage Inzidenz";
                    $Text2 = "NRW: ".round(GetValue(24839),1);
                    SetValue($ID_Zaehler, ($Zaehler + 1));
                    break;

        case 6    : $Text1 = "7Tage Inzidenz";
                    $Text2 = "BRD: ".round(GetValue(37675),1);
                    SetValue($ID_Zaehler, 0);
                    break;                    

}

KNX_WriteDPT16($ID_Instanz_Text1, $Text1);
KNX_WriteDPT16($ID_Instanz_Text2, $Text2);

Jein. Wenn du zu viele Threads hast, werden die Anfragen ja nicht direkt nach 10 Sekunden abgebrochen, sondern erst, wenn diese auch versendet wurden. D.h. wenn die Befehle noch Warten um versendet werden zu können, staut es sich und es kann viel länger dauern.

paresy

Das hieße dann aber, das die KNX Anfragen/Abbrüche aus verschiedenen Scripten dann doch alle seriell nacheinander abgearbeitet werden und nicht aus verschiedenen Threads parallel?

Ich habe jetzt mal 4 Scripte mit Semaphore versehen, dann ist die Threadqueue bei einem Abbruch deutlich entspannter.
Beunruhigt mich aber ein bisschen, da hier auch viele Scripte lange hängen, die eher selten aufgerufen werden.

VG,
Doc

Korrekt. Wir warten immer kurz auf das ACK. Wenn das nicht mehr kommt, dann stockt es.

paresy

OK,
wäre es dann nicht besser dies intern von seitens IPS abzufangen?
Wenn z.B. ein KNX_Write an eine bestimmte GA kein ACK zur Folge hat, das weitere schreiben auf eben diese Instance bis zum ACK oder x Sekunden zu verhindern um ein Überlauf zu vermeiden?
Wenn man das alles jetzt auch noch in den Scripten abfangen muss, gerade bei Systemen mit großen KNX Installation wird das doch recht aufwendig.
Und bei einem Ausfall des KNX IP Interfaces/Routers aus welchen Gründen auch immer würde sich die Warteschlange doch immer weiter aufbauen, auch wenn nach 5 Sekunden das Paket verworfen wird?

Ich habe hier sehr viele Skripte, die ähnlich oft Dinge auf den Bus senden und hier läuft gar nichts zu? Auch wenn ich das IP Interface vom Netz nehme, läuft IPS weiter. Was mache ich falsch?

Du sendest nicht genügend schnell auf den Bus.
Nach Paresy’s Beschreibung müssten auch deine Threads zulaufen, wenn du schneller Daten „nachlegst“ als durch die 5s. Verzögerung wieder freigegeben werden.
Oder ist das ein Unterscheid, ob du ggf. ein IP-Interface nutzt oder einen IP Router?

Danke, werde das testen.

Da IPS kein Routing unterstützt, ist es egal.

Ich kann das Verhalten Bestätigen. Wenn die IP-Schnittstelle nicht da ist oder nicht erreichbar ist, hängen Threads, die etwas senden möchten, komplett fest. Irgendwann sind alle Threads zu.

Das ist gar nicht mal so gut …

Das ist das gleiche Problem, was ich hier auch hatte, wo ich aber erst auf ein Problem mit dem Raspi getippt hatte.

Das Problem ist erstens, wenn man zu schnell auf den Bus schreibt, die laufenden Scripte ggf. noch nicht beendet wurden, weil die 5s. pro KNX Schreibvorgang bei fehlender Verbindung noch nicht abgelaufen sind.
Aber das größte Problem ist, das schon unter 50% Threadauslastung die Scripte teilweise gar nicht mehr beendet werden.
Kann man schön auf dem alten verlinktem Thread sehen.

In über 10 Jahren ist mir dieses Verhalten niemals aufgefallen. Im Grunde genommen ist das aber echt kritisch.
@paresy lässt sich das nicht so handhaben, dass bei fehlendem ACK vom Bus nach 10 Sekunden abgebrochen wird, anstatt dass Threads voll laufen?

Das sollte es ja schon nach 5s. tun, so wie ich Paresy verstanden habe. Das passiert aber nicht immer oder ggf. nicht mehr, wenn das Script schon ein 2. Mal ausgeführt wurde.
Ich meine dieses Verhalten aber auch erst ab der V6.0 beobachten zu können.

Wenn ich da jetzt noch mal genau drüber nachdenke würde das doch bedeuten, das wenn Script A sich durch Verbindungsprobleme verzögert, alle anderen nachfolgenden Scripte, die ein KNX_WriteXX beinhalten, nicht mehr korrekt bis zum Ende ausgeführt werden oder zeitlich stark verzögert werden, auch wenn das weiter gar nichts mehr mit KNX zu tun hätte?
Das würde dann so einige Ungereimtheiten in meiner Victron Haus-Batteriesteuerung erklären, wo ich bestimmt Daten auf den KNX-Bus sende und das Script dann nicht mehr weiter ausgeführt wurde.
Kann das so sein?
VG,
Doc

Servus,

will jetzt nicht unken, aber hab ja auch eine (grosse) KNX Installation die mir zu oft Stress macht.
Will nicht ausschliessen dass es was mit einem teils nicht verfügbaren IP Interface zu tun hat.
Das System wird teils sehr langsam (Symbox) oder Symcon crasht einfach. War schon mal schlimmer, aber ist nicht ganz weg. Finde nur derzeit kaum Zeit da weiter reinzusehen.

@paresy Du erinnerst Dich an die eine Box die mich stresst. Die Abstürze beim IPSstudio speichern, hängen beim hochfahren.
Die will ich morgen übrigens präventiv tauschen einfach um Hardware auszuschliessen.

Wäre eine Anbindung über die Weinzierl KNX die ich in dieser Symbox auch habe, weniger oder nicht von diesem Problem betroffen? Also wenn ich anstatt auf die IP Schnittstelle direkt auf die Weinzierl schicke?

Cheers Seppm

Hi Sepp,

das interne Interface in der SymBox ist immer verfügbar. Dein Problem kann also keinen Zusammengang mit diesem Problem hier haben :slight_smile: Wenn die Box immer noch nicht rund läuft meld dich am besten noch einmal per Mail.

paresy

1 „Gefällt mir“

Obwohl ich viele der KNX Scripte jetzt mal mit Semaphore versehen habe, das sie erst gar nicht ein zweites Mal durchlaufen werden, bekomme ich häufig diese Meldungen (hängende Threads habe ich aktuell keine).
Es sind aber immer die Scripte, die auf den KNX Bus etwas senden, teilweise auch Scripte, die nur alle X Minuten etwas tun.
Kann das noch im Zusammenhang mit dem eigentlichem Problem stehen?

Gibt es hierzu eigentlich schon etwas neues?
Die hängenden Threads konnte ich ja unterdrücken, aber die Zeitübschreitungsprobleme beim Zugriff auf den KNX-Bus bestehen weiterhin.
Mir ist zwar nicht aufgefallen, das KNX Telegramme verloren gehen, aber das fällt bei den Scripten eigentlich auch nicht auf, da hier nur meistens die MDt GT2 beschrieben werden.

VG,
Doc

Leider noch nicht.

paresy

Alles klar,
bleibt mal dran …

2 „Gefällt mir“