NEWS
Template Script Vorlage
-
Ich bin gerade dabei mir ein Template für Scripts zu erstellen. Nichts wildes.
Ich stelle es mal in einer frühen Phase hinein. Vielleicht gibt es ja die eine oder andere Idee, die ich mit einarbeiten kann. Oder auch der Hinweis, dass das Blödsinn ist
Als erstes habe ich eine globale Funktion erstellt, die eine Ausgabe eines Loggings je Script erstellt.
Globale Funktion logs() Version 0.1.1.:
! ````
// globale Funktion: logs(logtext,level,color)
// Version: 0.1.1
! // Beschreibung: Ermöglicht innerhalb eines Javascript-Scripts unterschiedliche Loglevel
// Benutzung, wie log() mit der zusätzlichen Option die Ausgabefarbe zu überschreiben
! // Übergabeparameter: logtext der Text, der als Log ausgegeben werden soll
// level [optional] der Loglevel der Meldung als String
// der level (mögliche Werte definiert in JSON loglevels), in dem der Text ausgegeben werden soll
// color [optional] die html-Farbe der Meldung als String, siehe z.B.: http://tomheller.de/theholycymbal/html-farben.html
// "none" -> es wird die Standardfarbe von log() im Level Info ausgegebn.
// nichts angegeben -> es werden die Farben ais dem JSON loglevels je nach level ausgegeben
// html-Farbe übergeben -> es wird die übergebenen Farbe ausgegeben
! // Rückgabe: Gibt den aktuellen Loglevel für diesen Aufruf zurück.
// Gültiger level beim Aufruf -> der im Script definierte Loglevel wird zurückgegeben
// kein Level angegeben -> es wird der Level "info" verwendet und zurückgegeben
// ungültiger Level -> es wird der Level "info" verwendet und zurückgegeben
! // Infos: Benötigt im Javascript, welches die Funktion logs() verwendet
// die Variabele loglevel, z.B. var loglevel = "info";
//
// 0.1.1 Default Loglevel ergänzt
! // -----------------------------------------------------------------------------
! // globale Scripte werden vor dem eigentlichen Script als Text reinkopiert
// daher kann im globalen Script eine Variable einen Defaultwert enthalten
! var loglevel = 'info'; // Default Loglevel, wenn der Loglevel im aufrufenden Script nicht definiert ist! // -----------------------------------------------------------------------------
// Script Log - logs() - ANFANG
// -----------------------------------------------------------------------------
var loglevels = {
"debug2": {"level": -2, "leveltext":"debug2: ", "color": "blue"},
"debug1": {"level": -1, "leveltext":"debug1: ", "color": "mediumblue"},
"debug": {"level": 0, "leveltext":"debug0: ", "color": "darkblue"},
"debug0": {"level": 0, "leveltext":"debug0: ", "color": "mediumblue"},
"info": {"level": 10, "leveltext":"", "color": "none"},
"warn": {"level": 20, "leveltext":"warn: ", "color": "darkorange"},
"error": {"level": 30, "leveltext":"error:", "color": "darkred"}
};
! function logs (logtext,level,color) {
! // in der Funktion den gesetzten Level überprüfen
if (typeof level == 'undefined') {level = 'info'}
if (level in loglevels) {} else {
level = 'info';
loglevel = level;
log("ungültiger loglevel in Funktion logs() im Script","warn");
log("loglevel für das Script auf Stufe: " + loglevel + " gesetzt.","warn");
}// den im Script konfigurierten Loglevel prüfen // zum Scriptstart muss die Variable loglevel deklariert werden // z.B.: // var loglevel = "warn"; if (typeof loglevel == 'undefined') {loglevel = 'info'} if (loglevel in loglevels) {} else { var loglevelError = loglevel; loglevel = 'info'; // Loglevel auf Info stellen, wenn kein gültiger Loglevel im Script deklariert ist log("ungültiger loglevel für logs() in der Konfiguration im Script","error"); log("variable loglevel am Anfang des Scripts einem gültigen Wert zuweisen","error"); log('im Script konfigurierter loglevel: ' + loglevelError + ' -> geändert in: ' + loglevel) + '',"warn"; }
! // Farbe ernitteln
if (typeof color == 'undefined') {color = loglevels[level].color}
! // Log je nach eingestelltem Loglevel ausgeben
var levelConf = loglevels[loglevel].level;
var levelLogs = loglevels[level].level;
if (levelLogs >= levelConf) {
if (color == "none") {
log(loglevels[level].leveltext + logtext);
} else {
log('' + loglevels[level].leveltext + logtext + '');
}
}
! return loglevel;
}
// -----------------------------------------------------------------------------
// Script Log - logs() - ENDE
// -----------------------------------------------------------------------------
! ````Globale Funktion printSubs() Version 0.1.0.:
! ```
`// printSubs(scriptname,loglevel) - globales Script
//
// v 0.1.0
//
// Listet alle Subscriptions innerhalb der Javascript-Instanz auf, die dem Filter entsprechen.
// gibt die Anzahl der gefundenen Subscriptions zurück.
//
// Filter (scriptname):
// --------------------
// sucht den String in den überwachten Datenpunkten der Javascript-Instanz
// und sucht den String in den Scriptnamen innerhalb der Javascript-Instanz
// keine Angabe -> Filter = "alle" (alle Subscriptions der Instanz)
//
// loglevel (loglevel):
// --------------------
// setzt den Loglevel für die Ausgabe für logs()
// keine Angabe -> loglevel = "info"
//
//
//
// Beispiele:
// ----------
// prinSubs(); // listet alle Subscriptions innerhalb der Javascript-Instanz auf
// prinSubs("alle"); // listet alle Subscriptions innerhalb der Javascript-Instanz auf
// printSubs(name); // alle Subscriptions innerhalb des aufrufenden Scripts
// printSubs("FEQ"); // alle Subscriptions, die im Script oder Objekt "FEQ" enthalten
//
// verwendet die globale Funktion: logs()
! function printSubs(scriptname,loglevel) {
var subscriptions = getSubscriptions();
var subscriptionCount = 0;
if (typeof scriptname == 'undefined') {scriptname = 'alle'}for (var dp in subscriptions) { for (var i = 0; i < subscriptions[dp].length; i++) { var script = subscriptions[dp][i].name; var change = subscriptions[dp][i].pattern.change; var logic = subscriptions[dp][i].pattern.logic; var id = subscriptions[dp][i].pattern.id; var pattern = JSON.stringify(subscriptions[dp][i].pattern); if ((scriptname == 'alle') || (scriptname == script) || dp.match(scriptname) || script.match(scriptname)) { subscriptionCount++; logs("on(" + dp + "), im Script: " + script + ", change: " + change + ", logic: " + logic,loglevel); //logs(pattern,loglevel); } } } if (subscriptionCount < 1) { logs("keine Subscrition enthalten. Filter: (" + scriptname +")",loglevel); } else { logs('Anzahl Subscriptions: ' + subscriptionCount + ' in javascript.' + instance + ', Filter: ("' + scriptname + '")',loglevel); } return subscriptionCount;
}`
! ~~[b]~~Script Template[/b] (v 0.1.3):
! (~~[color]Benötigt die globale Funktion **[b]logs() & printSubs()[/b]**[/color] )[color]~~Benötigt den Javascript-Adapter ab Version 2.x [/color] )
! (
! >![spoiler]~~[code]~~// ============================================================================= // Scriptname - Beschreibung // ============================================================================= // // // // // Version: 0.1.3 // Datum: x // Autor: x ! // benötigt mind. die Version 2.x des Javascript-Adapters ! // verwendete globale Funktionen (müssen als globale Funktion vorhanden sein) // ----------------------------------------------------------------------------- ! // logs() // für individuelle Loglevel innerhalb des Scripts // printSubs() // liestet die Subscritions im Script auf ! // ============================================================================= // Einstellungen Scriptverhalten // ============================================================================= ! var loglevel = "debug2"; // logs() - Loglevel des Scriptes (debug2, debug1, debug, info, warn, error) // benötigt den loglevel info beim Javascript Adapter var dpPfad = "Test.ScriptVorlage" + "."; // In welchem Pfad sollen die Datenpunkte angelegt werden. String mit "." am Ende. var instanz = "javascript." + instance + "."; ! logs('**--== ' + name + ' ==--** gestartet. Instanz: "' + instanz + '", Loglevel: ' + loglevel,"info","darkgreen"); logs('Vars, Loglevel und Scriptname gesetzt','debug1'); ! // ============================================================================= // Datenpunkte anlegen // ============================================================================= function dpAnlegen() { ! // einfach angelegte Datenpunkte // ----------------------------- //createState(dbPfad + 'datenpunktName',"Test"); ! // ausführlich beschriebene Datenpunkte // ------------------------------------ /* createState(dbPfad + 'datenpunktName', 0, { // Datenpunktname ohne Leerzeichen und Sonderzeichen, wie er in den Objekten angelegt wird name: 'Name des Datenpunkts', // Lesbarer Name des Datenpunkts desc: 'Beschreibung des Datenpunkts', // Beschreibung des Datenpunkts type: 'number', // Bescreibung des Typ, wie: number, string, boolean unit: '°C' // Einheit, wenn benötigt }); */ ! logs("dpAnlegen() - Datenpunkte angelegt (createState) in " + instanz + dpPfad,'debug1'); } ! // ============================================================================= // Autokorrekturen Autokorrekturen // ============================================================================= ! // ----------------------------------------------------------------------------- // Funktionen Funktionen // ----------------------------------------------------------------------------- ! // ----------------------------------------------------------------------------- // Schedule Schedule // ----------------------------------------------------------------------------- function onAnlegen() { ! /* // wird um 00:00 ausgeführt schedule({hour: 0, minute: 0}, function (){ // was soll passieren }); */ ! // ----------------------------------------------------------------------------- // ON ON // ----------------------------------------------------------------------------- ! /* on({id: 'xxx' ,change:'ne'}, function (obj) { // was soll bei Datenpunktänderung passieren }); */ ! printSubs(name,loglevel); // globale Funktion. listet die Subscription im Script im Log auf. } ! // ============================================================================= // main - Hauptprogramm (wird beim Scriptstart ausgeführt) main // ============================================================================= function main() { ! // Hauptprogramm nach Timeout (z.B. damit neu angelegte Datenpunkte vorhanden sind) // Im Hauptprogramm weiter: ! } dpAnlegen(); // erst die notwendigen Datenpunkte anlegen setTimeout(onAnlegen, 500); // dann die Subscriptions setzen setTimeout(main, 1000); // dann das Hauptprogramm starten [/code]
[/spoiler]
! Beispiel für das Script interne und individuelle Logging:
!
! Als Script-Loglevel sind die Stufen:
! debug2, debug1, debug, info, warn, error vorgesehen, die auch farbig dargestellt werden.
! Für Fehlerausgaben und Warnungen, die unabhängig davon ausgegeben werden sollen,verwende ich in den Skripten weiterhin log().
! Ich werde die nächsten Schritte hier im Post pflegen.
! Anregungen und Kritik sind sehr gerne willkommen.
! [EDIT Änderungen]:
! 12.03.2016:
! - logs() V 0.1.1 - Default-Loglevel ergänzt
! - Template V 0.1.1 - Autokorrektur Loglevel entfernt
! 13.03.2016:
! - printSubs() v0.1.0 - globale Funktion hinzugefügt[/i][/i][/i][/i][/i] -
Hi,
ich finde deine Idee Klasse! Ich werde das die nächsten Tage/Wochen versuchen in meine Skripte umzusetzen. Vielleicht wäre die Farbgebung auch was für die Erweiterung des JS-Adapters??? Also das man z.B. an log so übergibt….log("Hallo Welt", "info", "green")....oder so ähnlich.
Es wäre richtig toll wenn du deine Skripte so erweitern könntest, das mann die logs auch an eine Variable übergeben kann, um diese im VIS anzuzeigen.
-
nur den letzten Log Eintrag oder eine Liste?
nur der Letzte geht ganz schnell. Du schreibst eine Funktion mit zwei Zeilen. Einmal mit logs() und einmal mit setState().
Eine Liste mit den letzten Einträge geht auch.
Gesendet von iPhone mit Tapatalk
-
Hi,
einer Liste. Ich würde die function logs auch für Infos aus dem Skript nutzen wollen, also z.B." Fenster zu lang offen"
Wenn wann sich bei der Übergabe an logs() noch aussuchen könnte, ob man die Information zusätzlich zum normalen Log auch in eine Variable geschrieben haben möchte wäre klasse.
-
hallo - dieser post hier ist schon etwas älter aber das einzige, was ich gefunden habe, was meinem anliegen nahe kommt.
wäre es wohl möglich ein neues log level einzuführen, welches eine eigene farbe hat? ich nutze hauptsächlich blockly. es wäre sehr hilfeich, wenn man eine auswahl hätte (siehe bild), in der statt info z,b user stehen würde und das log dann in z.b grün oder blau ausgegeben wird. noch besser wären natürlich mehrere diese level und dafür verschiedene farben.
falls ich hier falsch bin, würde ich mich auch über eine info freuen, wie ich diese anfrage offfiziell stelle und wo am besten. forum oder github ?
4447_image_1.png -
@ruhr
gut Idee. Was mir nicht so gefällt ist, dass es eine global Funktion ist.
Das hat den Nachteil, dass bei den Fehlerausgaben, die Zeilennummer nicht stimmen, bzw. man immer rechnen muss.
Außerdem gibt es überall den Code Overhead (weniger schlimm).
Was mich auch noch immer genervt hat war, dass bei der Entwicklung der globalen Funktion, immer alle Scripts neu gestartet werden.
Ich realisiere deshalb globale Funktionen über States, die ein Object beinhalten. Die global Funktion wird dann über Subscription getriggert.
Ein Beispiel: Ich habe einen State "sendtoifttt" erzeugt, der ein Object als Wert hat.
Beispiel:````
setState("sendtoifttt",
{val:{
applet:"telegram",
value1: "von Mch: " + HTMLEncode(obj.state.val)
}
});Die Routine, die auf Wechsel von sendtoifttt trigger, kann dann so auf die Object Inhalte zugreifen.
on({id: "sendtoifttt"}, function(obj) {
var applet = obj.state.val.applet;
var value1 = obj.state.val.value1;
....