In diesem Artikel zeige ich Dir, wie Du Dein eigenes Logging in ioBroker implementieren kannst.
In unserem Smart-Home hatte ich die Idee, bestimmte Ereignisse in Form eines eigenen Protokolls zu speichern. Derzeit dokumentiere ich mir z.B. die Türstatus oder Status zur automatischen Beleuchtung. Im Artikel werde ich ich ein neues, angepasstes Script mit den Funktionsupdates zeigen:
Hier zunächst meine Basis-Anforderungen an das Protokoll:
- Protokoll-Eintrag mit folgenden Angaben:
– Eindeutige, fortlaufende Vorgangsnummer (ID)
– Datum- und Zeitangabe des Eintrags
– Art des Protokoll-Eintrags (Fehler, Info, usw…)
– Protokoll-Text - Protokoll muss nachträglich leerbar sein.
- Einfacher Aufruf im JavaScript-Code.
Im 1. Teil der Artikelreihe habe wir bereits ein Script dazu implementiert. Im Laufe der Zeit kamen nun aber weitere Anforderungen dazu, welche im neuen Script berücksichtigt wurden:
- Einstellbar maximale Anzahl an Log-Einträgen
Hier gab es bei mir in meiner Umgebung sowie auch bei einigen Anwendern das Problem von zu langen Ladezeiten der VIS. Bei einigen Tausend Datensätzen ist das auch kein Wunder. Daher habe ich hier für eine neue Einstellung (maxEventCount) vorgesehen, mit dem die Anzahl der maximalen Einträge begrenzt werden kann. - Mehrfach-Aufruf Problematik (Timing-Problem)
Wenn in einem Trigger oder sonstigen Script mehrere Aufrufe der Funktion createEventLog() hintereinander implementiert wurden, dann kam hier aufgrund eines Timing-Problems nur der letzte Log-Eintrag im Datenpunkt an. Dies kann einfach mit dem separaten Beispiel-Code umgangen werden.
Für die Installation des Scripts muss einfach das bestehende Script mit dem folgenden Script-Code ersetzt werden. Bitte beachte dabei, dass bei einer Änderung des globalen Code-Bereichs alle Scripte automatisch einmalig ausgeführt werden. Hier nun der neue Script-Code für die Logging-Funktionalität:
const EventListDestination = "javascript.0.SystemEventList.";
const maxEventCount = 500;
function createEventlog(EventType, EventText) {
let EventList = getState(EventListDestination + "EventList").val;
// Nur die letzten x Einträge im Script belassen
let eventList = EventList.split('<br>');
let eventCount = eventList.length;
let newEventList = "";
for (var i = 0; i < eventCount; i++) {
if ( i < (maxEventCount-1) ) {
newEventList = newEventList + "<br>" + eventList[i];
} else {
break;
}
}
EventList = newEventList;
// Neue Event-Id und Zeitpunkt ermitteln
let EventId = getState(EventListDestination + "NextEventId").val;
let EventDateTime = formatDate(getDateObject((new Date().getTime())), "TT.MM.JJ hh:mm:ss");
EventId = EventId + 1;
setState(EventListDestination + "NextEventId", EventId);
let FormatedEventId = ("00000" + EventId).slice(-5);
let EventLog = FormatedEventId + " - " + EventDateTime + " - " + EventType + " - " + EventText;
EventList = EventLog + EventList;
setState(EventListDestination + "EventList", EventList);
}
Beispiel-Code für das mehrmalige Aufrufen der createEventLog() Funktion:
function sleep(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
async function createMultipleLogs() {
createEventlog("Info", "Test Nachricht 1");
await sleep(100);
createEventlog("Info", "Test Nachricht 2");
await sleep(100);
createEventlog("Info", "Test Nachricht 3");
await sleep(100);
}
createMultipleLogs();
Vielen Dank für euer Feedback. Bei weiteren Fragen oder Anregungen gerne melden 🙂
- Eigenes Logging in ioBroker – Teil 1 – Einführung und Script
- Eigenes Logging in ioBroker – Teil 2 – Nutzung in Blockly
- Eigenes Logging in ioBroker – Teil 3 – Integration in HABPanel
- Eigenes Logging in ioBroker – Teil 4 – Script-Erweiterungen
- ioBroker SNMP-Adapter
- Synology-Adapter
- Der MQTT-Adapter
- Der ioBroker.systeminfo Adapter