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