NEWS
Objekt IDs in Skripten auf Konsistenz prüfen
-
Moin,
ich habe es schon öfter gehabt, dass Skripte bei mir unbemerkt nicht mehr funktioniert haben, weil sich die IDs von Objekten geändert haben (bspw. weil ein Adapter seine Datenpunkte umbenannt hat, oder weil ich bei meinen eigenen Datenpunkten irgendwas umgebaut habe). Wahrscheinlich sollte man am Besten mit Aliasen arbeiten um das zu verhindern, aber das ist ein anderes Thema...
Jetzt wäre es ja cool, wenn es einen Möglichkeit gäbe, sowas zu monitoren. Also eine Funktion, die bemerkt, wenn in einem Skirpt (oder Blockly) eine Objekt ID angesprochen wird, die es gar nicht (mehr) gibt.
Gibt es soetwas schon, hat vielleicht irgendwer mal ein Skipt dafür gebaut...?
Falls es das noch nicht gibt, wäre die Frage: Wie könnte ich am einfachsten auf den Code meiner Skripte zugreifen, um diesen dann zu parsen? Liegt der Skript-Code im Klartext auch in irgendwelchen Datenpunkten...?
Viele Grüße
Jan -
@centrofly sagte in Objekt IDs in Skripten auf Konsistenz prüfen:
Gibt es soetwas schon,
im Prinzip ja, aber ich habe es noch nicht selbst getestet.
in einem solchen Fall kommt nämlich ein Fehler im log.
mit dem Adapter log-parser müsste so etwas zu finden sein. -
@centrofly sagte in Objekt IDs in Skripten auf Konsistenz prüfen:
Wie könnte ich am einfachsten auf den Code meiner Skripte zugreifen, um diesen dann zu parsen?
Du könntest die Skripte mit der Adapter-Option auf Festplatte spiegeln und dann mit einem Texteditor bearbeiten.
-
@centrofly sagte: Liegt der Skript-Code im Klartext auch in irgendwelchen Datenpunkten...?
Nicht in Datenpunkten, sondern im Objekt "script.js.scriptname" unter common.source.
-
@paul53 Ok super, lesen des source codes eines Skripts klappt schon mal so:
var source = getObject('script.js.common.04_Monitor.myScript').common.source; log( source );
Jetzt will ich ja über alle Skripte iterieren. Da stehe ich aber auf dem Schlauch. Ich dachte ich mache es mit einem Selektor, bspw. so:
var selektor = $('script[id=script.js.common.*]'); oder var selektor = $('state[id=script.js.common.*]');
Aber das klappt irgendwie nicht. Hat jemand eine Idee wie ich alle Skripte zu fassen bekomme?
Oder generell: Wie kann ich eigentlich alle Childs eines Channels selektieren...? Ich kenne nur den umgekehrten Weg, also den übergeordneten Knoten zu ermitteln (also mit split, slice etc.).
-
@centrofly sagte: Aber das klappt irgendwie nicht.
Der $Selector kann nur Datenpunkte.
Jedes Skript hat auch einen Aktivierungs-Datenpunkt.const scriptsCommon = $('javascript.0.scriptEnabled.common.*');
Damit lässt sich in einer Schleife "javascript.0.scriptEnabled" durch "script.js" ersetzen und so auf die Objekte zugreifen.
EDIT:
const scripts = $('javascript.0.scriptEnabled.*'); scripts.each(function(id, i) { id = id.replace('javascript.0.scriptEnabled', 'script.js'); if(existsObject(id) && getObject(id).type == 'script') { // Auswertung von getObject(id).common.source } });
-
@paul53 Perfekt, das hat mir schon mal ordentlich weitergeholfen!
Folgendes gibt jetzt die Skripte mit den zugehörigen Objekt IDs aus (wenn diese im Code mit einem Hochkomma eingeschlossen sind):
const regex = new RegExp(`'[a-z]*\.0\.[a-zA-Z0-9.]*'`, `g`); const scripts = $('javascript.0.scriptEnabled.*'); scripts.each(function(id) { id = id.replace('javascript.0.scriptEnabled', 'script.js'); if(existsObject(id) && getObject(id).type == 'script') { var source = getObject(id).common.source; var matches = source.match(regex); if (matches != null) { matches.forEach(function (element) { log(id + ' --> ' + element); }); } } });
Gibt mir noch ein paar falsche Treffer, da muss sich noch ein wenig Feintuning betreiben, aber grob passt das so.
Vielen Dank für Eure Hilfe!
Jan