Homey Community Forum

Ungenutzte Logik-Variablen

Hallo zusammen,

gibt es eine Möglichkeit ungenutzte Variablen (Mehr → Logik) ausfindig zu machen?
Im Laufe der Zeit haben sich eine ganze Menge Variablen angesammelt, wobei definitiv nicht mehr alle Variablen in Flows genutzt werden.

Ist jmd. in der Lage ein Script zu schreiben? Meine Programmierkenntnisse gehen leider gegen 0.

1 Like

dto, gleiches Problem…

@RonnyW, kannst Du da nicht was zaubern?

Ich kann ja mal in der WebAPI schauen, ob man überhaupt auf Flow-Eigenschaften zugreifen kann. Ich fürchte aber, das beschränkt sich eher auf allgemeine Aktionen wie aktivieren/deaktivieren.

1 Like

Wäre echt klasse von Dir. :+1:t3:

Ich habe mal ein kleines Skript zusammengestrickt.
Es durchsucht alle Logik-Variablen und sucht nach Verwendung in Flows.
Es gibt allerdinge eine Einschränkung:
Es werden aktuell nur Fundstellen geliefert, wo die Logik-Variable direkt verwendet wird, also über die Auswahl Logik/Variable in einen Flow eingefügt wurde (z.B. Prüfung auf Variable, Änderung einer Variable.
Was nicht gefunden wird sind Stellen, wo die Logikvariable als Tag in einem Flow verwendet wird (z.B: wenn man eine Lokiv-Variabke in einer Berechnung verwendet). Das muss ich noch ergänzen. Das ist etwas aufwändiger, weil die Tag-Variable nur mit einer generischen ID (GUID) im Flow eingetragen ist.

Hier schon mal die erste Version.
Verwendung: In my.homey.app im Bereich HomeyScript ein Skript anlegen und diesen Code einfügen. Dann mit “Test” starten. Im Log-Fenster werden die Ergebnisse angezeigt.

log('=============================================================');
log('Flow-Suche nach Logik-Variablen');
log('=============================================================');
const flows = await Homey.flow.getFlows();
const logicVars = await Homey.logic.getVariables();
let flowMatches;
let position = [];

for (var iLogicVar in logicVars){
  log('=============================================================');
  log('Logik-Variable: '+logicVars[iLogicVar].name);
  log('=============================================================');
  logicVar = logicVars[iLogicVar].name;

  for (var iFlow in flows){
    flowMatches = false;
    position = [];
    // Such nach Variablenname in Trigger
    if (flows[iFlow].trigger.uri == "homey:manager:logic")
      for (var iArgs in flows[iFlow].trigger.args){
        if (flows[iFlow].trigger.args[iArgs].name == logicVar){
          position.push("Trigger");
          flowMatches = true;
        }
      }
    // Such nach Variablenname in Bedingungen
    for(var iCond in flows[iFlow].conditions){
      if ( flows[iFlow].conditions[iCond] &&
          flows[iFlow].conditions[iCond].uri == "homey:manager:logic")
        for (var iArgs in flows[iFlow].conditions[iCond].args){
          if (flows[iFlow].conditions[iCond].args[iArgs].name == logicVar){
            position.push("Bedingung");
            flowMatches = true;
          }
        }
    }
    // Such nach Variablenname in Aktionen
    for(var iAct in flows[iFlow].actions){
      if ( flows[iFlow].actions[iAct] &&
          flows[iFlow].actions[iAct].uri == "homey:manager:logic")
        for (var iArgs in flows[iFlow].actions[iAct].args){
          //log(flows[iFlow].actions[iAct].args[iArgs]);
          if (flows[iFlow].actions[iAct].args[iArgs].name == logicVar){
            position.push("Aktion");
            flowMatches = true;
          }
        }
    }

  // Ausgabe des gefundenen Flows:
    if (flowMatches == true){
      log("---------------------------------------------------");
      log("Gefunden in Flow: "+flows[iFlow].name);
      log("Position:");
      log(position);
      //log("---------------------------------------------------");
      //log("Flow:");
      //log(flows[iFlow]);
    }
  }
}
3 Likes

Neue Version…die findet nun auch als Tags verwendete Logik-Variablen in Bedingungen oder Aktionen:

log("=============================================================");
log("Flow-Suche nach Logik-Variablen");
log("=============================================================");
log(" ");
const flows = await Homey.flow.getFlows();
const logicVars = await Homey.logic.getVariables();
let flowMatches;
let varUsed;
let position = [];

for (var iLogicVar in logicVars){
  log(" ");
  log("=============================================================");
  log("Logik-Variable: "+logicVars[iLogicVar].name);
  //log('ID: '+logicVars[iLogicVar].id);
  //log("=============================================================");
  let logicVar = logicVars[iLogicVar].name;
  let logicVarId = logicVars[iLogicVar].id;
  varUsed = false;

  for (var iFlow in flows){
    flowMatches = false;
    position = [];
    // Such nach Variablenname in Trigger
    if (flows[iFlow].trigger.uri == "homey:manager:logic"){
      for (var iArgs in flows[iFlow].trigger.args){
        if (    flows[iFlow].trigger.args[iArgs].name == logicVar
             || flows[iFlow].trigger.args[iArgs].id == logicVarId){
          position.push("Trigger");
          flowMatches = true;
        }
      }
    }
    // Such nach Variablenname in Bedingungen
    for(var iCond in flows[iFlow].conditions){
      if ( flows[iFlow].conditions[iCond] &&
          flows[iFlow].conditions[iCond].uri == "homey:manager:logic"){
        //log(flows[iFlow].conditions[iCond].args);
        for (var iArgs in flows[iFlow].conditions[iCond].args){
          if (    flows[iFlow].conditions[iCond].args[iArgs].name == logicVar
                || flows[iFlow].conditions[iCond].args[iArgs].id == logicVarId ){
            position.push("Bedingung - direkte Verwendung");
            flowMatches = true;
          }
        }
      }
      for (var iArgs in flows[iFlow].conditions[iCond].args){
        if ( flows[iFlow].conditions[iCond].args[iArgs] &&
            JSON.stringify( flows[iFlow].conditions[iCond].args[iArgs] ).indexOf( logicVarId ) > 0 &&
            JSON.stringify( flows[iFlow].conditions[iCond].args[iArgs] ).indexOf( "homey:manager:logic" ) > 0 ){
          position.push("Bedingung - indirekte Verwendung (Tag)");
          flowMatches = true;
        }
      }
    }
    // Such nach Variablenname in Aktionen
    for(var iAct in flows[iFlow].actions){
      if ( flows[iFlow].actions[iAct] &&
          flows[iFlow].actions[iAct].uri == "homey:manager:logic"){

        for (var iArgs in flows[iFlow].actions[iAct].args){
          if (    flows[iFlow].actions[iAct].args[iArgs].name == logicVar
                || flows[iFlow].actions[iAct].args[iArgs].id == logicVarId ){
            position.push("Aktion - direkte Verwendung");
            flowMatches = true;
          }
        }
      }
      for (var iArgs in flows[iFlow].actions[iAct].args){
        if ( flows[iFlow].actions[iAct].args[iArgs] &&
            JSON.stringify( flows[iFlow].actions[iAct].args[iArgs] ).indexOf( logicVarId ) > 0 &&
            JSON.stringify( flows[iFlow].actions[iAct].args[iArgs] ).indexOf( "homey:manager:logic" ) > 0 ){
          position.push("Aktion - indirekte Verwendung (Tag)");
          flowMatches = true;
        }
      }
    }

  // Ausgabe des gefundenen Flows:
    if (flowMatches == true){
      varUsed = true;
      log("-------------------------------------------------------------");
      log("Gefunden in Flow:");
      log(flows[iFlow].name);
      log("Position:");
      for (iPos in position){
        log("  "+position[iPos]);
      }
    }
  }
  if (!varUsed){
    log("Keine Verwendung!");
  }
}
5 Likes

Prima, vielen vielen Dank! :+1:t4:

Edit: Werde mal 2, 3 ungenutzte Variablen überwachen bevor ich wild drauf los lösche.

Gern geschehen. Ich habe damit auch zwei überflüssige Variablen gefunden :slight_smile:

Ich habe im letzten Beitrag den Code nochmal bezüglich der Ausgabe etwas überarbeitet, damit es besser lesbar ist.

Jepp, ist deutlich besser lesbar. :+1:t4: