Im Zusammenhang mit der Fehlersuche in HomeMatic-Skripten liest man immer wieder, dass eQ3 für die CCU2 eine maximale Anzahl von Skript-Variablen von 200 angibt. Die Begrenzung scheint sich nicht auf die Systemvariablen der CCU2 zu beziehen.
Wie kannst du rausfinden, wieviele Variablen du in deinen Skripten verwendest?
Update 06.08.2017: Leider hat sich BadenPower aus dem HomeMatic-Forum inzwischen zurückgezogen und auch alle seine Programme & Skripte aus dem HomeMatic-Forum entfernt! Schade! Leider hatte ich mir das Skript nicht zwischengespeichert und kann es somit auch nicht mehr ausführen.
BadenPower aus dem HomeMatic-Forum hat sich die Mühe gemacht, dazu ein entsprechendes Programm zu schreiben.
Das Skript muss nicht installiert werden, somit werden die im Skript verwendeten Variablen nicht mitgezählt! Du kannst das Skript einfach in der WebUI unter „Skript testen“ per Paste&Copy einfügen und starten.
Update 28.12.2016: Das Programm benötigt für die Ermittlung der verwendeten Skript-Variablen wirklich sehr lange! Also nicht ungeduldig werden, bei meinen derzeit 62 Skripten dauerte es ca. 35 Minuten bis eine Ausgabe des Ergebnisses am Bildschirm erfolgte. Aber das Warten lohnt sich!
Ich war überrascht, dass ich bereits 200 Skript-Variablen verwende. Jetzt werde ich diesbezüglich versuchen zu Optimieren und in Zukunft mit Skript-Variablen umsichtiger umgehen.
Vieleicht hilft das hier:
! Skriptvariable-Counter Version 1.0.2
! *****************************************
! http://www.homematic-forum.de (c) by BadenPower
string lSingleProgName = „“; ! hier Progammname eingeben, um nur ein Programm zu prüfen
boolean lPrintVarNames = true; ! true: gibt die Variabelnamen aus / false: verhindert die Ausgabe der Variabelnamen und…
boolean vPrintProg = true; ! true: gibt die Programmnamen mit aus / false: verhindert die Ausgabe der Programmnamen
! ——– Ende Einstellungen ——–
boolean lDoLoop = true;
string lEnum1 = „“;
string lEnum2 = „“;
integer liZ1 = 0;
integer liZ2 = 0;
integer liZ3 = 0;
integer lLengthScript = 0;
integer lLength = 0;
string lChar = „“;
object lPrograms = dom.GetObject(ID_PROGRAMS);
object lProg;
object lRule;
object lRuleSubRule;
object lRuleDestination;
object lRuleSingleDestination;
integer lDestinationSingleCount = 0;
boolean lSeekDecl = true;
boolean lSeekVar = false;
boolean lIsSingleQuot = false;
boolean lIsDoubleQuot = false;
boolean lIsComment = false;
boolean lCanComment = true;
boolean lIsLastBackslash = false;
boolean lResetChkStr = false;
integer lSeekDeclPos = 0;
integer lScriptCount = 0;
integer lProgCount = 0;
integer lDeclCount = 0;
integer lVarCount = 0;
string lChkStr = „“;
string lVarList = „“;
! string lCharListDecl = „abcdegijlmnorstvxy“;
string lCharList = „abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_“;
string lCharList1 = „biorstvx“;
string lCharList2 = „abdeimnot“;
string lCharList3 = „ajlmort“;
string lCharList4 = „eilr“;
string lCharList5 = „cegnr“;
string lCharList6 = „aegt“;
string lCharList7 = „nry“;
string lTab = „\t“;
string lNewLine = „\n“;
string lBackslashChk = „\ „;
string vProgList = „“;
boolean vProgFind = false;
string vSkriptList = „“;
if (lSingleProgName „“){
lProg = lPrograms.Get(lSingleProgName);
if (lProg){
! WriteLine(lProg.ID());
} else {
WriteLine(„Programm-Objekt nicht gefunden. Bitte den Programmnamen prüfen!“);
quit;
} }
foreach (lEnum1, lPrograms.EnumNames()){
if ((lSingleProgName == „“) || (lSingleProgName == lEnum1)){
lProgCount = lProgCount + 1;
lProg = lPrograms.Get(lEnum1);
if (vPrintProg){
vProgList = vProgList # lTab # lProg # lTab;
lVarList = lVarList # lTab # lProg # lTab;
}
if (lProg){
lRule = lProg.Rule();
lDoLoop = true;
while (lDoLoop){
lDoLoop = false;
if (lRule){
lRuleDestination = lRule.RuleDestination();
if (lRuleDestination){
lDestinationSingleCount = lRuleDestination.DestSingleCount();
if (lDestinationSingleCount > 0){
foreach (lEnum2, system.GenerateEnum(0,(lDestinationSingleCount – 1))){
lRuleSingleDestination = lRuleDestination.DestSingleDestination(lEnum2);
if (lRuleSingleDestination){
if (lRuleSingleDestination.DestinationParam() == ivtString){
lScriptCount = lScriptCount + 1;
if (vPrintProg){
vSkriptList = vSkriptList # lTab # lProg # lTab;
}
lLengthScript = (lRuleSingleDestination.DestinationValue()).Length();
if (lLengthScript > 0){
lChar = „“;
lChkStr = „“;
lSeekDecl = true;
lSeekVar = false;
lIsSingleQuot = false;
lIsDoubleQuot = false;
lIsComment = false;
lCanComment = true;
lIsLastBackslash = false;
lResetChkStr = false;
lSeekDeclPos = 0;
liZ1 = 0;
liZ2 = 1;
while ((lLengthScript > liZ1) && (liZ2 liZ1) && (liZ3 0){
if ((lChkStr == „boolean“) || (lChkStr == „idarray“) || (lChkStr == „integer“) || (lChkStr == „object“) ||
(lChkStr == „real“) || (lChkStr == „string“) || (lChkStr == „time“) || (lChkStr == „var“) || (lChkStr == „xml“)
){
lSeekDecl = false;
lSeekVar = true;
}
lResetChkStr = true;
} } else {
lSeekDeclPos = lSeekDeclPos + 1;
lResetChkStr = true;
if (lSeekDeclPos == 1){
if (lCharList1.Find(lChar) -1){
lChkStr = lChkStr # lChar;
lResetChkStr = false;
} }
if (lSeekDeclPos == 2){
if (lCharList2.Find(lChar) -1){
lChkStr = lChkStr # lChar;
if ((lChkStr == „bo“) || (lChkStr == „id“) || (lChkStr == „in“) ||
(lChkStr == „ob“) || (lChkStr == „re“) || (lChkStr == „st“) ||
(lChkStr == „ti“) || (lChkStr == „va“) || (lChkStr == „xm“)
){
lResetChkStr = false;
} } }
if (lSeekDeclPos == 3){
if (lCharList3.Find(lChar) -1){
lChkStr = lChkStr # lChar;
if ((lChkStr == „boo“) || (lChkStr == „ida“) || (lChkStr == „int“) ||
(lChkStr == „obj“) || (lChkStr == „rea“) || (lChkStr == „str“) ||
(lChkStr == „tim“) || (lChkStr == „var“) || (lChkStr == „xml“)
){
lResetChkStr = false;
} } }
if (lSeekDeclPos == 4){
if (lCharList4.Find(lChar) -1){
lChkStr = lChkStr # lChar;
if ((lChkStr == „bool“) || (lChkStr == „idar“) || (lChkStr == „inte“) ||
(lChkStr == „obje“) || (lChkStr == „real“) || (lChkStr == „stri“) ||
(lChkStr == „time“)
){
lResetChkStr = false;
} } }
if (lSeekDeclPos == 5){
if (lCharList5.Find(lChar) -1){
lChkStr = lChkStr # lChar;
if ((lChkStr == „boole“) || (lChkStr == „idarr“) || (lChkStr == „integ“) || (lChkStr == „objec“) || (lChkStr == „strin“)){
lResetChkStr = false;
} } }
if (lSeekDeclPos == 6){
if (lCharList6.Find(lChar) -1){
lChkStr = lChkStr # lChar;
if ((lChkStr == „boolea“) || (lChkStr == „idarra“) || (lChkStr == „intege“) || (lChkStr == „object“) || (lChkStr == „string“)){
lResetChkStr = false;
} } }
if (lSeekDeclPos == 7){
if (lCharList7.Find(lChar) -1){
lChkStr = lChkStr # lChar;
if ((lChkStr == „boolean“) || (lChkStr == „idarray“) || (lChkStr == „integer“)){
lResetChkStr = false;
} } } }
if (lResetChkStr){
lSeekDecl = false;
lSeekDeclPos = 0;
lChkStr = „“;
} } else {
if (lSeekVar){
if (lCharList.Find(lChar) -1){
lChkStr = lChkStr # lChar;
} else {
if ((lChkStr.Length() > 0) || ((lChkStr.Length() == 0) && (lChar “ „) && (lChar lTab))){
lDeclCount = lDeclCount + 1;
if (lVarList.Find(lTab # lChkStr # lTab) == -1){
lVarList = lVarList # lTab # lChkStr # lTab;
}
lSeekVar = false;
lChkStr = „“;
} } } }
if ((lIsSingleQuot) || (lIsDoubleQuot)){
if (lIsLastBackslash == false){
if (lIsSingleQuot){
if (lChar == „‚“){
lIsSingleQuot = false;
} } else {
if (lChar == ‚“‚){
lIsDoubleQuot = false;
} } } } else {
if (lIsComment == false){
if (lChar == „‚“){
lIsSingleQuot = true;
}
if (lChar == ‚“‚){
lIsDoubleQuot = true;
}
if (lChar == „{„){
lSeekDecl = true;
}
if (lChar == „}“){
lSeekDecl = true;
}
if (lChar == „;“){
lSeekDecl = true;
}
if (lChar == „!“){
if (lCanComment){
lIsComment = true;
} } }
if (lChar == lNewLine){
lIsComment = false;
lSeekDecl = true;
}
if ((lChar == „;“) || (lChar == „{„) || (lChar == „}“) || (lChar == lNewLine)){
lCanComment = true;
} else {
if ((lChar “ „) && (lChar lTab)){
lCanComment = false;
} } }
lIsLastBackslash = (lChar == lBackslashChk.Substr(0,1));
liZ1 = liZ1 + 1;
liZ3 = liZ3 + 1;
}
liZ2 = liZ2 + 1;
} } } } } } }
lRuleSubRule = null;
if (lRule.ElseIfFlag()){
lRuleSubRule = lRule.RuleSubRule();
}
if (lRuleSubRule){
lDoLoop = true;
lRule = lRuleSubRule;
} } } } } }
if (lSingleProgName == „“){
WriteLine(„durchsuchte Programme: “ # lProgCount);
} else {
WriteLine(„durchsuchtes Programm: “ # lSingleProgName);
}
WriteLine(„gefundene Skripte: “ # lScriptCount);
WriteLine(„gefundene Deklarationen: “ # lDeclCount);
if (lPrintVarNames){
WriteLine(„“);
WriteLine(„Liste aller verwendeten Skriptvariabel-Namen:“);
! WriteLine(„“);
}
lEnum1 = „“;
foreach (lEnum1,lVarList){
if (lEnum1 „“){
if (vPrintProg){
if (vProgList.Find(lTab # lEnum1 # lTab) -1){
lVarCount = lVarCount – 1;
if (vProgFind){
WriteLine(„keine neuen Variablen in diesem Programm“);
}
vProgFind = true;
} else {
vProgFind = false;
} }
lVarCount = lVarCount + 1;
if (lPrintVarNames){
if (vProgFind){
WriteLine(„“);
if (vSkriptList.Find(lTab # lEnum1 # lTab) == -1){
WriteLine(„Kein Skript im Programm: “ # lEnum1);
vProgFind = false;
} else {
WriteLine(„Gefunden im Programm: “ # lEnum1);
} } else {
WriteLine(lEnum1);
} } } }
if ((lPrintVarNames) && (vProgFind) && (vPrintProg)){
WriteLine(„keine neuen Variablen in diesem Programm“);
}
WriteLine(„“);
WriteLine(„gefundene Variablennamen: “ # lVarCount);
WriteLine(„“);
WriteLine(„—Auswertung beendet—„);
Hallo Frank,
vielen Dank! Ich habe das Script auf die Schnelle ausprobiert, bringt bei mir im Moment leider kein Ergebnis. Ich werde daran arbeiten und anschliessend das Script hier veröffentlichen.
Liebe Grüße Erhard