Verständnisfrage Skriptoptimierung

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

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

Verständnisfrage Skriptoptimierung

Beitrag von Elec » 15.01.2016, 11:31

Hallo zusammen,

ich versuche aktuell, meine Skripte weiter zu optimieren und hierbei insbesondere Variablen einzusparen.
Dazu folgendes Beispiel:

Code: Alles auswählen

!Letzte Aktualisierung
e6 = dom.GetObject("hs_display1:e6");
aktualisierung = system.Date("%H:%M:%S");
stringt = "{fontSize:15}{text:<b>Letzte Aktualisierung:</b>" + aktualisierung + "}";
e6.State(stringt);
WriteLine(stringt);
Dieser Codeschnipsel schreibt mir die aktuelle Systemzeit in eine Zelle auf mein Homestatus-Display, was auch prima funktioniert.
Ein Dorn im Auge ist mir, dass dabei allein 3 Variablen benötigt werden.

Vor einigen Jahrzehnten habe ich im Mathematikunterricht gelernt, Formeln zu kürzen. Geht das auch hier?
Herauskommen würde dann folgendes, ganz ohne Variablen:

Code: Alles auswählen

dom.GetObject("hs_display1:e6").State("{fontSize:15}{text:<b>Letzte Aktualisierung:</b>" # system.Date("%H:%M:%S") # "}");
Gut, ich könnte es einfach ausprobieren, aber ich habe etwas Panik davor, jetzt gut funktionierende Scripts dadurch ggf. wieder instabil bis nicht mehr lauffähig zu machen.
Warum will ich das überhaupt optimieren, wenn es doch läuft? Nunja, es werden mit der Zeit weitere Skripte hinzukommen und deshalb möchte ich die Anzahl an Variablen schon jetzt auf ein Minimum zurückführen, um nicht später in Probleme durch zuviele Variablen zu geraten.

Daher meine Frage, ob das, wie im zweiten Beispiel gezeigt, funktionieren würde und wenn nicht, wie ein möglichst optimaler Ansatz aussehen könnte?
Wenn es funktionieren würde - gibt es Gründe, die dagegen sprechen, das so umzusetzen (außer ggf. der Tatsache, dass es etwas unübersichtlicher würde)?

Noch nicht ganz klar ist mir die Funktion von "WriteLine". Dient das nur der Ausgabe im WebUI zum Debugging unter Skript testen? Das ist zumindest das, was ich herausgelesen habe. Kann somit, wie im zweiten Beispiel gezeigt, darauf verzichtet werden?

Besten Dank vorab und Gruß,
Elec

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Verständnisfrage Skriptoptimierung

Beitrag von DrTob » 15.01.2016, 13:24

Alles richtig. (Und du hast sogar korrekt # statt + zum zusammensetzen des Strings verwendet!)

Ich persönlich finde die zweite, kurze Variante übrigens besser lesbar :)

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

Re: Verständnisfrage Skriptoptimierung

Beitrag von Elec » 15.01.2016, 14:03

Ok, danke für die Rückmeldung. dann werde ich mich mal ans Werk begeben.
Die Scripte, die bisher im Einsatz sind, habe ich mir hier aus dem Forum bzw. der Homestatus-Doku kopiert und auf meine Bedürfnisse angepasst.
Da ich viel lese, kam ich auch irgendwann auf das # statt +, wobei mir immer noch nicht klar ist, warum das besser ist ;-)

Ja, bei meinem Beispiel bleibt die Zusammenfassung noch gut lesbar, aber Du kannst sicher erahnen, wie die Zeile bei folgendem Beispiel aussehen wird? ;-)

Code: Alles auswählen

!Heizungsdaten
d23 = dom.GetObject("hs_display1:d2-3");
szi =  dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1);
szs =  dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
szv = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
bui = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1);
bus = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
buv = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
foi = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1);
fos = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
fov = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
fui = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1);
fus = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
fuv = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
kui = dom.GetObject("BidCos-RF.LEQxxxxxxx:1.TEMPERATURE").Value().ToString(1);
kus = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
kuv = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
wzi = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1);
wzs = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
wzv = dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
wci = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1);
wcs = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
wcv = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
kei = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1);
kes = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1);
kev = dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
Ausgabestring = "{fontSize:15}{text:<b>Heizungen:</b><br>SZ: " + szi + "°C (" + szs + "°C) " + szv +"%<br>BU: " + bui + "°C (" + bus + "°C) " + buv +"%<br>FO: " + foi + "°C (" + fos + "°C) " + fov +"%<br>FU: " + fui + "°C (" + fus + "°C) " + fuv +"%<br>KÜ: " + kui + "°C (" + kus + "°C) " + kuv +"%<br>WZ: " + wzi + "°C (" + wzs + "°C) " + wzv +"%<br>WC: " + wci + "°C (" + wcs + "°C) " + wcv +"%<br>KE: " + kei + "°C (" + kes + "°C) " + kev;
stringd23 = Ausgabestring + "%}";
d23.State(stringd23);
Aber damit wird auch klar, auf wieviele Variablen ich verzichten kann - hier allein 27...

Ich denke, dass von meinen derzeit in Summe 154 Variablen so am Ende vielleicht noch 20 übrig bleiben.

Gruß
Elec

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

Re: Verständnisfrage Skriptoptimierung

Beitrag von Elec » 15.01.2016, 15:04

Eieiei, die Komprimierung des obigen Codes zu

Code: Alles auswählen

dom.GetObject("hs_display1:d2-3").State("{fontSize:15}{text:<b>Heizungen:</b><br>SZ: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>BU: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>FO: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>FU: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>KÜ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:1.TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>WZ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>WC: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>KE: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) # "%}");
brachte die CCU2 nun zum Absturz.

Vorgehen:
Alten Code entfernt, neuen Code hinzugefügt, Fehlerprüfung zeigte keinen Fehler, mit OK Skript übernommen und in dem Moment, wo ich das Programm mit OK bestätigt habe - Absturz. Kurz danach der Ladebildschirm, aber nichts tat sich mehr.
CCU stromlos gemacht und danach kam sie wieder hoch. Bei Betrachtung des Skripts zeigte sich dann wieder die alte Version.

Das Logfile zeigt leider nur den Zeitpunkt des Neustarts...

Kann es sein, dass die CCU ein Problem mit solch langen Zeilen hat oder kann das Zufall gewesen sein?
Ich traue mich gerade nicht, das nochmal zu versuchen :roll:

EDIT:
Ich war mutig (oder wahnsinnig) und habe es doch noch mal versucht. Gleiches Ergebnis...
Scheint so, als hätte ich hier eine (nicht dokumentiert?) Grenze überschritten. Wird wohl nichts mit meiner Optimierungsidee...

Gruß
Elec

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Verständnisfrage Skriptoptimierung

Beitrag von DrTob » 15.01.2016, 15:27

Ausschließen würde ich das nicht. Denkbar wäre in diesem Fall evtl. das nicht komplett in eine einzige Zeile/Befehl zusammenzukürzen, sondern EINE Variable zu verwenden:

String tmp = " eins";
tmp = tmp # " zwei";
tmp = tmp # " drei";


Der Unterschied zwischen + und # ist folgender:

+ ist eine Addition. Die ist definiert für Zahlen (3 + 5 = 8) und sie ist definiert für Strings ("3" + "5" = "35") wenn du allerdings versuchst eine Zahl mit einem String zu addieren gibt das ein Fehler ("3" + 5 = *puff*).

# ist eine explizite Stringzusammensetzung. Sämtliche Parameter werden dabei vorher in Strings umgewandelt. (3 # 5 = "35" / "3" + 5 = "35" / "3" + "5" = "35") Vorteil: man muss sich keine Gedanken über die Typen machen, # funktioniert immer.

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

Re: Verständnisfrage Skriptoptimierung

Beitrag von Elec » 15.01.2016, 15:37

Solltest Du mein EDIT noch gelesen haben, so scheint das kein Zufall gewesen zu sein, sondern ist reproduzierbar.

Die neue Zeile hat 2187 Zeichen, was wohl zuviel ist.
Die längste Zeile in meiner alten Skriptversion hat 443 Zeichen. Bis dahin klappt es also noch.

Wäre die Frage, wo genau die Grenze ist.

Da das aber als Fehlerfrei durch die Skriptprüfung geht, würde ich das mal als Bug bezeichnen, den ich dann auch melden würde.

Gruß
Elec

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

Re: Verständnisfrage Skriptoptimierung

Beitrag von Elec » 15.01.2016, 16:04

Danke für die Erläuterung zu # vs. +!

Skript nun umoptimiert auf

Code: Alles auswählen

d23 = "{fontSize:15}{text:<b>Heizungen:</b><br>SZ: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>BU: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>FO: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>FU: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>KÜ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:1.TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>WZ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>WC: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>KE: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) # "%}";
dom.GetObject("hs_display1:d2-3").State(d23);
und läuft ;-)

Statt 27 halt nur noch 26 Variablen wegoptimiert, aber dafür bleibt es auch etwas übersichtlicher. Ein guter Kompromiss also.

Dennoch wäre es schon interessant zu wissen, wo die Grenze des Machbaren liegt.

EDIT: Verhalten als Bug an eq-3 gemeldet.

Gruß
Elec

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

Re: Verständnisfrage Skriptoptimierung

Beitrag von Elec » 18.01.2016, 12:17

Hallo zusammen,

zur Info: Dieser Fehler wurde nun an die Entwicklungsabteilung weitergeleitet - das ist doch schon mal was.

Gruß
Elec
Sehr geehrter Herr,

vielen Dank für Ihre Anfrage in der technischen Kundenbetreuung und das damit verbundene Interesse an unseren Produkten. Wir haben Ihre Frage aufgrund der Komplexität an die Entwicklungsabteilung weitergeleitet. Hier wird der Vorgang unter der Bearbeitungsnummer

EQ3_SUPPORT-xxx

geführt. Sobald wir weiterführende Informationen vom Hersteller erhalten, setzen wir uns mit Ihnen erneut in Verbindung. Bis dahin bitten wir Sie um etwas Geduld.

Mit freundlichen Grüßen aus Leer

Ihr eQ-3 Support-Team



-----------------------------
Von:
Gesendet: 2016/01/15 16:42:46
An: Support@eq-3.de <support@eQ-3.de>
Betreff: Skriptprogrammierung - maximale Länge einer Anweisungszeile

Sehr geehrte Damen und Herren,

beim heutigen Versuch, eines meiner Skripte zu optimieren, stellte ich fest, dass Anweisungszeilen ab einer bestimmten Länge zum Absturz der CCU2 (FW: 2.15.2) führen.

Bei besagter Anweisungszeile handelt es sich um diese hier (Seriennummern mit "x" überschrieben):

dom.GetObject("hs_display1:d2-3").State("{fontSize:15}{text:<b>Heizungen:</b><br>SZ: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>BU: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>FO: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>FU: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>KÜ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:1.TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>WZ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>WC: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) #"%<br>KE: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) # "%}");

Dieses Script wird bei der Scriptprüfung als fehlerfrei deklariert, das Skript wird bei Bestätigung durch OK auch übernommen. Der Versuch, das Programm dann ebenfalls per OK zu bestätigen, endet in sofortigem Absturz der CCU.
Erst nach Stromlosmachen startet die CCU dann wieder neu durch und im Programm befindet sich wieder das vorherige Skript.

Dieses Verhalten ist jederzeit reproduzierbar.

Workaround:
Zerlegen der einen, sehr langen Anweisung in mehrere Kürzere.

Das nachfolgende Skript funktioniert dann auch einwandfrei:

d23 = "{fontSize:15}{text:<b>Heizungen:</b><br>SZ: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>BU: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>FO: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>FU: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>KÜ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:1.TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>WZ: " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.LEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>WC: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1);
d23 = d23 # "%<br>KE: " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.ACTUAL_TEMPERATURE").Value().ToString(1) # "°C (" # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.SET_TEMPERATURE").Value().ToString(1) # "°C) " # dom.GetObject("BidCos-RF.MEQxxxxxxx:4.VALVE_STATE").Value().ToString(1) # "%}";
dom.GetObject("hs_display1:d2-3").State(d23);

Da es zu keinerlei Fehlermeldung kommt und auch die Prüfung als fehlerfrei durch geht, gehe ich davon aus, dass es sich um einen Bug handelt.
Auch habe ich in den Dokumentationen keinen Hinweis auf eine mögliche Längenbegrenzung finden können.
Wo genau diese Grenze liegt, habe ich nicht ausprobiert. Meine derzeit längste, funktionsfähige Anweisungszeile besteht aus 443 Zeichen, während die oben gezeigte, nicht funktionsfähige Zeile mehr als 2.100 Zeichen hat. Die Grenze liegt also irgendwo dazwischen.

Im Homematic-Forum habe ich das noch etwas ausführlicher beschrieben: http://homematic-forum.de/forum/viewtop ... 26&t=28940

Es wäre natürlich optimal, wenn die gegebene Längenbegrenzung zumindest bei der Skriptprüfung abgefangen und diese Grenze auch in der Dokumentation erwähnt würde.

Mit freundlichen Grüßen

dtp
Beiträge: 10655
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Verständnisfrage Skriptoptimierung

Beitrag von dtp » 19.01.2016, 07:39

Ihr optimiert Eure CCUs noch mal zu Tode. ;)
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

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

Re: Verständnisfrage Skriptoptimierung

Beitrag von Elec » 19.01.2016, 10:27

Naja, geht so ;-)
Das war der erste Fall, mit dem ich meine CCU zu einem Absturz bewegt habe und wenn das dann noch ein Fall ist, der so leicht reproduzierbar ist und den eq-3 nun auch angeht, dann ist das doch zum Vorteil für Alle.

Immerhin: Hierdurch und auch durch die Weitergabe des anderen Skriptingproblems besteht Hoffnung, dass eq-3 an der Stabilität des Systems arbeiten wird.

Insofern denke ich: Alles richtig gemacht ;-)

Gruß
Elec

Antworten

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