Link/Skript-Sammlung

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Benutzeravatar
blackhole
Beiträge: 3718
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 586 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von blackhole » 26.11.2015, 14:47

AndiN hat geschrieben:Mit dem Neustart kann ich nur bedingt bestätigen. ...
Du hast ccu.io am Start, richtig?
AndiN hat geschrieben:Die Lösung wäre mir zig mal lieber wie das Ewige umschreiben.
Dann probiere das doch bitte einmal bei dir aus. Ich habe das Problem, dass ich die Probleme anderer nicht nachvollziehen kann, da bei mir exakt das zutrifft, was ich weiter oben unter Punkt 1-2 beschrieben habe (ccu.io habe ich nicht am Start und daher auch keine weiteren Probleme).

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von Xel66 » 26.11.2015, 15:17

Ich habe noch eine weitere Theorie zu dem Variablen-Thema. Ich vermute, hier begegenen wir einem alten Bekannten, dem Buffer-Overflow. Meiner Meinung nach reserviert das System für Systemvariablen und auch für Script-interne Variablen bestimmte Speicherbereiche entsprechend des Variablentyps. Diese Variablen behalten vermutlich ihren Wert bei, bis sie durch ein anderes Script geändert werden. Das funktioniert wahrscheinlich solange ganz gut, bis irgend ein Script auf eine Variable "xy", das im Script "A" diese Variable "xy" als z.B. boolsch deklariert hat, zugreift und dort einen String reinschreiben will. Da man für unterschiedliche Variablentypen auch unterschiedlichen Platz braucht (eine boolsche Variable, die nur zwei Zustände kennt, braucht weniger Platz als eine Integer-Variable, und diese vermutlich viel weniger als eine String-Variable), kann es schnell zum Überschreiben von Speicherbreichen kommen. Wenn der Programmierer hier nicht vorgesorgt hat, und eine Fehlerbehandlungsroutine eingebaut hat, die die Variablen vorher prüft und eine (aussagekräftige) Fehlermeldung ausgibt, kommt es zum Crash.

Dem könnte man z.B. begegnen, indem man auch den Script-Variablen, wie früher empfohlen, aussagekräftige Namen gibt. Als Beispiel unterscheidet sich die boolsche Variablen "b_Anwesenheit", die die Zustände WAHR und FALSCH annehmen kann, von der Stringvariable "s_Anwesenheit" in der man z.B. den Namen des Anwesenden hinterlegen könnte. Scripte würde hier ausreichend unterschiedliche Namen vorfinden und es würde nicht zu Problemen kommen. Würden zwei Scripte nun im Gegensatz die Variable "Anwesenheit" benutzen hat das Script, was die String-Variable benutzt ein Problem, wenn ein anders die Variable mit gleichem Namen als "boolsch" initialisiert hat.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Benutzeravatar
blackhole
Beiträge: 3718
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 586 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von blackhole » 26.11.2015, 15:22

Xel66 hat geschrieben:Das funktioniert wahrscheinlich solange ganz gut, bis irgend ein Script auf eine Variable "xy", das im Script "A" diese Variable "xy" als z.B. boolsch deklariert hat, zugreift und dort einen String reinschreiben will.
So etwas ist völlig unproblematisch, da die CCU dynamische Typbindung beherrscht (und das sogar ziemlich gut).

Elec
Beiträge: 356
Registriert: 18.03.2015, 14:01
Wohnort: Bochum
Danksagung erhalten: 1 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von Elec » 26.11.2015, 15:27

Das würde dann auch erklären, warum auch meine Variante zumindest bei mir geholfen hat (auf die Rückbestätigung Anderer warte ich noch).
Ich hatte dabei in einem Initialisierungsscript, das nur einmal bei CCU-Start ausgeführt wird, allen später verwendeten Variablen Typen zugeordnet und diese in den Scripten dann auch nie mehr geändert.
Genau wie Du schreibst, habe ich die Typen im Variablennamen kenntlich gemacht, um sicherzustellen, dass ich die nicht anderweitig verändere.

@blackhole:
Die CCU sollte dynamische Typbindung beherrschen, aber tut sie das auch wirklich? Ich bin mir da nicht so sicher.

Benutzeravatar
blackhole
Beiträge: 3718
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 586 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von blackhole » 26.11.2015, 15:29

Elec hat geschrieben:Die CCU sollte dynamische Typbindung beherrschen, aber tut sie das auch wirklich?
Ein Dreizeiler und du kannst Dich selbst davon überzeugen. Das klappt einwandfrei.

Code: Alles auswählen

integer test = 1;
test = "Hallo Welt!";
WriteLine(test);

Benutzeravatar
AndiN
Beiträge: 2621
Registriert: 10.06.2015, 08:54
Wohnort: Hennef
Hat sich bedankt: 10 Mal
Danksagung erhalten: 28 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von AndiN » 26.11.2015, 15:37

@blackhole: Würde ich. Aber dann müsste ich alle Skripte wieder in den Ursprungszustand versetzen. Das tu ich mir nicht an, wenn ich nicht weiß ob es funktioniert.
Daher wäre es sinnvoll einem Betroffenen der die Skritpe 1:1 nutzt und das Problem immer wieder hat (da habe ich beim DWD so einige Kandidaten gesehen) mal zu bitten unten im Skript die Variablen alle zu leeren.

Ich glaube das was xel66 schreibt passt. Allerdings glaube ich nicht, dass es an der Type liegt. Nach dem Motto hier ein string und da ein Boolean. Aber glauben heißt ja nicht wissen. Immer, wenn ich ein neues Skript implementiere (und da gibt es neue Namen) habe ich irgendwann den Effekt gehabt. Die Erklärung wäre aber logisch. Wenn ich ein Datum (Feiertag) berechnen möchte und die Variable X keine Zahl, sondern ein Boolean ist, weil ich sie nicht neu zuordnen konnte... ERROR. Bei der Fehlerprüfung fällt es nicht auf, weil hier nur die Plausibiltät geprüft wird. Hingegen beim Skript testen läuft das Ding vor die Wand.

Wenn es bei mir wieder Probleme gibt, werde ich auch die Type in die Variablenbezeichnung einbauen. Dann habe ich beide Theorien ausgeklammert (zu viele Variablen und unterschiedliche Nutzung). Aber damit warte ich noch. Schließlich brauche ich derzeit nur 52 Variablen und mit der Type schlimmstenfalls 26x4 =104... Und wenn ein zuviel an Variablen das Problem auslöst... Tja....

Derzeit läuft sie wie eine 1
Zuletzt geändert von AndiN am 26.11.2015, 15:41, insgesamt 1-mal geändert.
Andi (Greenhorn)

Letzter Reboot: 17.03.24 => FW Update (Uptime:Rekord:153 Tage)
Systeminfos: Raspberry Pi3 Firmware: 3.75.6.20240316 142 Geräte
System angebunden: 3 Roomba 650 - Sprachausgabe via Home24 Media - Pocket Control
- Zentrale: Asus TF103 mit Home24 Tablet
Addons: Drucken 2.5 - HQ WebUI 2.5.9 - XML-API 1.22 - CUx-Daemon 2.9.3 - E-Mail 1.7.4 - hm_pdetect 1.11 - VPN cloudmatic
Diverse Links

Benutzeravatar
AndiN
Beiträge: 2621
Registriert: 10.06.2015, 08:54
Wohnort: Hennef
Hat sich bedankt: 10 Mal
Danksagung erhalten: 28 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von AndiN » 26.11.2015, 15:39

integer test = 1;
test = "Hallo Welt!";
WriteLine(test);
besser ist, wenn Du gar nicht die Definition machst und einfachmal

WriteLine(XY);

(irgendeine Variable aus einem Skript) einträgst. Dann siehst Du nur, dass der Speicher nicht freigegeben wird. Oder liege ich falsch?)
Andi (Greenhorn)

Letzter Reboot: 17.03.24 => FW Update (Uptime:Rekord:153 Tage)
Systeminfos: Raspberry Pi3 Firmware: 3.75.6.20240316 142 Geräte
System angebunden: 3 Roomba 650 - Sprachausgabe via Home24 Media - Pocket Control
- Zentrale: Asus TF103 mit Home24 Tablet
Addons: Drucken 2.5 - HQ WebUI 2.5.9 - XML-API 1.22 - CUx-Daemon 2.9.3 - E-Mail 1.7.4 - hm_pdetect 1.11 - VPN cloudmatic
Diverse Links

Elec
Beiträge: 356
Registriert: 18.03.2015, 14:01
Wohnort: Bochum
Danksagung erhalten: 1 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von Elec » 26.11.2015, 15:46

Danke blackhole, aber das ist doch genau der Punkt, über den hier schon so lange diskutiert wird.
Es gibt hier zahlreiche Meldungen, dass Scripte in der Art Deines Beispiels, hier zum Teil monatelang ebenfalls einwandfrei laufen und dann plötzlich nicht mehr, bis die CCU neu gestartet wird.
Im Fehlerfall zeigt dann sogar die Scriptprüfung einen Fehler an, der offenbar aber gar nicht existiert, da das Script nach Neustart eben wieder läuft und der angebliche Scriptfehler auch nicht mehr angezeigt wird.

Fakt ist auch, dass verschiedene, hier gepostete Maßnahmen im Bereich der Variablen, das Problem ganz gelöst, zumindest aber für ein stabileres Laufverhalten geführt haben.

Was also macht Dich so sicher, dass die dynamische Typbindung immer 100%ig funktioniert?

Meine Scripts laufen jedenfalls erst seit dem Zeitpunkt stabil, seit dem ich den Typ eben nicht mehr verändere. Der wird bei mir nur noch einmal definiert und bleibt dann auch so. Es mag Zufall sein, ja, aber nach nun etlichen Wochen stabilen Betriebs, glaube ich da nicht mehr dran.

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von Xel66 » 26.11.2015, 15:47

blackhole hat geschrieben:Das klappt einwandfrei.
Bin zwar kein Uptime-Junkie, habe aber kein Testsystem laufen und auf meinem Produktivsystem mache ich keine derartigen Experimente (zumindest nicht, wenn es wie jetzt den WAF gefährden würde). Ich erfreue mich aber gerade an einem schön stabilen System. Wie gesagt, ist meine Theorie, muss nicht unbedingt stimmen. Kann auch innerhalb von Scripten bei der Übergabe in andere Variablen passieren. Versuch das mal mit einer Systemvariable. Da sollte das zumindest nicht mehr so reibungslos laufen.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Benutzeravatar
blackhole
Beiträge: 3718
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 586 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von blackhole » 26.11.2015, 15:51

AndiN hat geschrieben:... Dann siehst Du nur, dass der Speicher nicht freigegeben wird. Oder liege ich falsch?
Das hat eines mit dem anderen nichts zu tun. Dynamische Typbindung ist der automatische, problemfreie Wechsel von z.B. Integer nach String ohne Neuinitialisierung der Variable, nur durch Inhaltsänderung (Zahl -> "Text" bzw. 1 -> "Hallo Welt!"). Nur das soll der Dreizeiler aufzeigen.

Nur am Rande, da Du laufend von Speicher sprichst:
Ein Variable ist in der CCU/HM-Script hart begrenzt auf 50k. Wenn man jetzt 200 Variablen im Einsatz hätte (so viele wird kaum jemand im Einsatz haben), dann käme man rein rechnerisch auf ärmliche 10MB - lass es mit Overhead auch 15MB Speicher sein. Das juckt die CCU in keiner Weise. Auf den Wert käme man auch nur dann, wenn die Kapazität aller 200 Variablen voll ausgenutzt würden (volle 50k Inhalt mal 200). Nein, Speicher ist nicht das Problem.

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“