CCU HM Skripts: Variablen werden nicht freigegeben

Fehler in Firmware und WebUI & Workarounds

Moderator: Co-Administratoren

jm1536
Beiträge: 25
Registriert: 24.11.2014, 11:22
Hat sich bedankt: 1 Mal

CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von jm1536 » 11.12.2014, 14:59

Hallo,

in einem HM Skript angelegte Variablen werden nach Ende des Programms nicht mehr freigegeben. Sie sind dann sogar in anderen Skripts bekannt und dort ohne Deklaration benutzbar (vielleicht von eq3 gedacht als Feature, not a bug ...). Werden Programme mit vielen Variablen benutzt (zB lange Strings), ist der Speicher irgendwann voll.

Als Folge kommen dann bei vormals fehlerfrei laufenden Programmen Syntaxfehler, da keine neuen Variablen mehr angelegt werden können (also eigentlich Laufzeitfehler). Der Fehler tritt dann bei der erstmaligen Verwendung der Variablen auf.

Code: Alles auswählen

!! ...der Speicher ist voll
integer x = 1;  !! x passt nicht mehr in den Speicher
x = x + 1;      !! <-- hier tritt der Syntaxfehler auf
Erst ein Reboot gibt den Speicher wieder frei.

Abhilfe: Die Skripts auf Speicherplatz optimieren (keine langen String-Variablen). Wenn ein neues Skript nach vielem Rumprobieren fertig ist, erstmal Reboot, damit die Variablen der vorherigen Versuche weg sind.

Fehler tritt bei mir auf mit CCU-Firmware 2.11.6 (http://homematic-forum.de/forum/viewtop ... 21#p183968).
Das Problem gibt es aber schon seit mindestens 2009, betrifft also CCU1 und CCU2 (http://homematic-forum.de/forum/viewtop ... 544#p20088).

Viele Grüße, Jürgen

Goersch
Beiträge: 163
Registriert: 12.09.2010, 13:11
Danksagung erhalten: 2 Mal

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von Goersch » 26.12.2014, 14:55

witzig - genau auf dieses blöde "Feature" bin ich auch gerade gestossen.

Nachdem das Problem bei mir auch schon mal auftrat, habe ich es die letzten Tage mit meiner zweiten CCU genauer untersucht. Und es ist genau wie von Jürgen beschrieben. Irgendwann scheint der Speicher voll oder eine Anzahl Variablen erreicht zu sein, wo dann nix mehr geht.

Weiterer Workaround um insgesamt Variablen zu nutzen:

Bisher sahen meine Zugriffe auf Geräte oder Systemvariablen immer so aus:

Code: Alles auswählen

var setupVN = dom.GetObject(raum # "HeizungVorgabenNeu");
setupVN.Variable(0);
die Variable setupVN spar ich mir jetzt soweit wie möglich (so wie viele andere Variablen) :

Code: Alles auswählen

dom.GetObject(raum # "HeizungVorgabenNeu").Variable(0);
Es sei noch der Hinweis gegeben, dass das Problem "irgendwann" auftritt - auch in Skripten, die monate oder jahrelang funktioniert haben.

Hier noch ein Link zum Thema: http://homematic-forum.de/forum/viewtop ... 26&t=19023

Benutzeravatar
jmaus
Beiträge: 9848
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 462 Mal
Danksagung erhalten: 1863 Mal
Kontaktdaten:

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von jmaus » 12.02.2016, 16:17

Hallo,

auch wenn das Thema schon etwas älter ist stößst vielleicht der Eine oder Andere darauf.

Das Problem existiert leider auch in aktuellen Firmwares noch (2.15.5, 2.17.4 beta) und kann hier mittels eines testscriptes sehr gut auf einem frischen CCU2 System demonstriert werden:

http://homematic-forum.de/forum/viewtop ... 88#p254999

Kurz zusammengefasst kann man in der Skriptprogrammierung einer CCU (CCU2 oder auch RaspberryMatic) nicht mehr als 200 verschiedene Variablennamen definieren. Dies gilt leider nicht nur innerhalb eines einzelnen Skriptes (was für viele anwendungen ausreichend wäre) sondern das gilt über alle Skripte innerhalb der CCU. D.h. also das wenn man in einem Skript z.B. 100 variablen definiert mit unterschiedlichen namen und in einem anderen erneut 100 mit unterschiedlichen namen man dann nicht mehr in einem dritten skript eine neue variable mit einem neuen namen definieren kann. Auch ist es so, das variablen anscheinend über den Skript hinaus bestehen bleiben. D.h. also man kann in Skript1 eine variable A definieren und ihr einen Wert zuweisen und dann in einem anderen Programm+Skript die variable A wieder auslesen und bekommt den wert wieder. Das sollte aber laut Skript Dokumentation nicht gehen und verursacht eben auch probleme.

Wie gesagt ist das Problem bereits wohl seit vielen CCU Firmware Versionen existent und verstanden und behindert gerade bei großen HomeMatic Umgebungen die Scriptprogrammierung mittels einer CCU so stark das man entweder alle Variablennamen alle seiner verwendeten Variablen vereinheitlichen muss oder man das Problem besser an eQ3 meldet und auf einen Bugfix hofft.

Mehr Infos dazu gibt es auch hier: http://homematic-forum.de/forum/viewtop ... 34&t=25388
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Matthias K.
Beiträge: 1170
Registriert: 14.02.2016, 12:32
System: Alternative CCU (auf Basis OCCU)
Wohnort: Heidenheim
Hat sich bedankt: 57 Mal
Danksagung erhalten: 225 Mal

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von Matthias K. » 13.06.2016, 09:35

Hallo zusammen,

sind tcl-Scripte davon auch betroffen? D.h. zählen darin definierte Variablen auch zum 200-Variablen-Limit?
Oder gilt das rein für HomeMatic Script?

Gruß
scorpionking

Benutzeravatar
jmaus
Beiträge: 9848
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 462 Mal
Danksagung erhalten: 1863 Mal
Kontaktdaten:

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von jmaus » 13.06.2016, 17:31

scorpionking hat geschrieben:sind tcl-Scripte davon auch betroffen? D.h. zählen darin definierte Variablen auch zum 200-Variablen-Limit?
Oder gilt das rein für HomeMatic Script?
Das gilt nur für reine HomeMatic-Skripte egal ob man sie über die WebUI nutzt oder aber auch über die verschiedenen HTTP basierten Schnittstellen der CCU
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

BadenPower

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von BadenPower » 13.06.2016, 19:02

jmaus hat geschrieben:Das gilt nur für reine HomeMatic-Skripte egal ob man sie über die WebUI nutzt oder aber auch über die verschiedenen HTTP basierten Schnittstellen der CCU
Und natürlich in TCL-Skript mit "rega_script" eingebettete HomeMatic-Skript-Variablen.

Rene_Mhm
Beiträge: 61
Registriert: 19.11.2016, 20:28
Hat sich bedankt: 5 Mal

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von Rene_Mhm » 21.01.2017, 17:02

jm1536 hat geschrieben:... in einem HM Skript angelegte Variablen werden nach Ende des Programms nicht mehr freigegeben. Sie sind dann sogar in anderen Skripts bekannt und dort ohne Deklaration benutzbar (vielleicht von eq3 gedacht als Feature, not a bug ...). Werden Programme mit vielen Variablen benutzt (zB lange Strings), ist der Speicher irgendwann voll.
jmaus hat geschrieben:Kurz zusammengefasst kann man in der Skriptprogrammierung einer CCU (CCU2 oder auch RaspberryMatic) nicht mehr als 200 verschiedene Variablennamen definieren. Dies gilt leider nicht nur innerhalb eines einzelnen Skriptes (was für viele anwendungen ausreichend wäre) sondern das gilt über alle Skripte innerhalb der CCU.
... so stark das man entweder alle Variablennamen alle seiner verwendeten Variablen vereinheitlichen muss
Jetzt nochmal die ganz klare und eindeutige Frage: Werden Script-Variablen tatsächlich grundsätzlich global definiert? Das heißt, sie bleiben über die Laufzeit der CCU grundsätlich a) gültig deklariert und behalten b) sogar ihren Inhalt?
Während a) schon toll wäre, wäre b) natürlich ein Traum!

Wenn dem tatsächlich so wäre, würde ich meinen Kram so umbauen, dass ich
a) sämtliche Script-Variablen innerhalb eines gesonderten Scripts im Init-Programm deklariere
b) am Anfang aller Scripts die ReBoot-SV abfrage, und damit die bereits erfolgte Deklaration sicherstelle (sofern diese Abfrage nicht ohnehin schon Programm-Bedingung ist)

Damit hat man einen sehr guten Überblick über die verwendeten VariablenNamen, und verhindert Doppelungen durch nur versehentlich unterschiedliche Schreibweise in verschiedenen Scripts.
Zwar deklariere ich, entgegen so einiger hier gesehener Muster, sowieso grundsätzlich am Script-Anfang, und nie mitten drin, aber eine wirklich zentrale Deklaration würde meines Erachtens natürlich noch weit mehr Ordnung ünd Übersichtlichkeit mit sich bringen.

Also, wie schaut es mit der globalen Gültigkeit nun wirklich aus?
In der Doku habe ich nämlich leider keine echte Aussage dazu gefunden.
Bis dann ...
René

BadenPower

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von BadenPower » 21.01.2017, 17:43

Rene_Mhm hat geschrieben:Während a) schon toll wäre, wäre b) natürlich ein Traum!
Dein Traum ist wahr.
Alle Variablen werden global deklariert und behalten den letzten gesetzen Wert bis zum Neustart der CCU.
Rene_Mhm hat geschrieben: Damit hat man einen sehr guten Überblick über die verwendeten VariablenNamen,
Naja, einen besseren Überblick hast Du aber, wenn Du Deine Programme und Skripte direkt analysieren läßt, denn es gibt ja auch noch die Skriptvariablen der internen Programme/Skripte, welche die CCU selbst anlegt.
.

Rene_Mhm
Beiträge: 61
Registriert: 19.11.2016, 20:28
Hat sich bedankt: 5 Mal

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von Rene_Mhm » 21.01.2017, 19:38

BadenPower hat geschrieben:Dein Traum ist wahr.
Alle Variablen werden global deklariert und behalten den letzten gesetzen Wert bis zum Neustart der CCU.
Spitze! Danke!
BadenPower hat geschrieben:Naja, einen besseren Überblick hast Du aber, wenn Du Deine Programme und Skripte direkt analysieren läßt, denn es gibt ja auch noch die Skriptvariablen der internen Programme/Skripte, welche die CCU selbst anlegt.
Die solltzen doch aber eigentlich fix sein, oder?
Bis dann ...
René

BadenPower

Re: CCU HM Skripts: Variablen werden nicht freigegeben

Beitrag von BadenPower » 21.01.2017, 19:51

Rene_Mhm hat geschrieben:Die solltzen doch aber eigentlich fix sein, oder?
Nein, wieso.

Es gibt einige Aktoren, welche beim Anlernen (und erst beim Anlernen) interne Programme mit Skripten erstellen.
.

Antworten

Zurück zu „HomeMatic - bekannte Bugs“