ioBroker eigene Protokoll Funktion (Logging) erstellen

Lesedauer: 3 Minuten

Über ein kleines Javascript lässt sich eine Protokoll Funktion in ioBroker erstellen. Diese ordnet die Ereignisse chronologisch, färbt sie entsprechend ihrer Bedeutung (Info, Warnung, Fehler) ein und weist ihnen ein kleines Symbol zu.

Javascript erstellen

Zuerst erstellst Du ein neues Javascript im Bereich global.

// Hauptdatenpunkt unterhalb javascript
var datenpunkt = "Ereignisprotokoll.";

// Mögliche Protokoll-Texte
const texte = ["Info","Warnung","Fehler"];

// Farben zu den Texten (schwarz, gelb, rot)
const farbe = ["#000000","#F0DB4F","#EF5350"];

// Symbole zu den Texten
const symbol = ["ⓘ","⚠","☠"];
 
function Protokoll(typ, Text) {
    // Protokoll abholen
    var Protokoll_Liste = getState(datenpunkt+"Ereignisse").val;
    var datum = formatDate(new Date(), "TT.MM.JJ hh:mm:ss");

    // Neues Protokoll generieren
    let tmp_Protokoll = datum + "<span style=\"display:inline-block;width:90px;margin-left:10px;color:" + farbe[typ] + "\">"
    + symbol[typ] + " " + texte[typ] + "</span>" + Text + "<br>";

    // Neues Protokoll an den Anfang setzen
    Protokoll_Liste = tmp_Protokoll + Protokoll_Liste;

    // Neues Protokoll in Datenpunkt speichern
    setState(datenpunkt + "Ereignisse", Protokoll_Liste);
}

// Zugehörige Datenpunkte erstellen
function erstelleDatenpunkte() {
    // Datenpunkt Protokoll
    createState(datenpunkt+"Ereignisse", "", false, {
        name: "Ereignisprotokolle",
        desc: "Protokoll Funktion über JavaScript",
        type: "string",
        role: "text",
        unit: ""
    });    
}

// Lösche Protokoll
function loescheProtokoll() {
    setState(datenpunkt + "Ereignisse", "");
}

// einmaliger Aufruf zum Erstellen der DP's
erstelleDatenpunkte();

// Lösche Protokoll nach 1 Monat - // zum Deaktivieren voranstellen
schedule("00 00 1 * *",loescheProtokoll);

Skript verwenden

Da das Skript im globalen Bereich von Javascript liegt, kann jedes Skript nun auf diese Funktion zugreifen. Der Aufruf erfolgt nach folgendem Schema.

Beispiel 1:

Protokoll(0, "Ich bin eine Information!");

Beispiel 2:

Protokoll(1, "Ich bin eine Warnung!");

Beispiel 3:

Protokoll(2, "Ich bin ein Fehler!");

Tür- bzw. Fensterkontakt protokollieren

In diesem Skript wird das Öffnen und schließen eines Fensters protokolliert.

// Protokoll - 0 - Information
  on({id: "hm-rpc.0.LEQ01737XX.1.STATE", change: "ne"}, function (obj) {
      if (obj.state.val === true) {
          Protokoll(0, "Wohnzimmer Fenster wurde geöffnet!");
      } else {
          Protokoll(0, "Wohnzimmer Fenster wurde geschlossen!");
      }
  });

Die erste Zahl ist jeweils einem Index zugewiesen. Hier 0 = Information, 1 = Warnung und 2 = Fehler. Der Text danach kann frei im Funktionsaufruf belegt werden.

Protokoll in VIS einbinden

Damit Du nun nicht nur eine Ereignisdatenbank in ioBroker hast, sondern sie auch darstellen lassen kannst, benötigst du nur ein HTML Widget, welches Du auf einer View platzierst.

HTML Widget auf der View platzieren
HTML Widget auf der View platzieren

Dem Widget weisen wir nun den Datenpunkt aus dem Skript hinzu.

{javascript.0.Ereignisprotokoll.Ereignisse}
HTML Widget mit zugewiesenem Datenpunkt
HTML Widget mit zugewiesenem Datenpunkt

Die Schriftfarbe lässt sich über über die Eigenschaften des Widgets anpassen.

Farbanpassung des HTML Widget
Farbanpassung des HTML Widget

Widget in View anzeigen

Nun kannst Du deine View öffnen und die Ereignisse anzeigen lassen.

Ereignisse in VIS anzeigen
Ereignisse in VIS anzeigen

Scrollbare Ereignisanzeige

Die Ereignisanzeige wird bei jedem Aufruf natürlich um ein Element verlängert. Damit Du in der Liste noch die Möglichkeit hast, ältere Elemente abzurufen, kannst Du das Scrollen der Liste aktivieren. Dies geschieht über:

Scrollen der Ereignisse ermöglichen
Scrollen der Ereignisse ermöglichen

overflow-y ist in dem Falle der senkrechte Scrollbalken; overflow-x der Vertikale.

So sieht es aus:

Ereignisse mit Scrollbalken anzeigen
Ereignisse mit Scrollbalken anzeigen

Ereignisanzeige für geöffnete/geschlossene Fenster

Die Protokollfunktion aus dem Beispiel oberhalb sieht in VIS so aus:

Ereignisanzeige für geöffnete/geschlossene Fenster
Ereignisanzeige für geöffnete/geschlossene Fenster
Wie hat Dir der Beitrag gefallen?
Bewertung: 5/5 - abgegebene Bewertungen: 1

15 Gedanken zu „ioBroker eigene Protokoll Funktion (Logging) erstellen

  1. Thom Antworten

    Hallo,
    das funktioniert sehr gut. Wo werden diese Daten dann auf dem Laufwerk abgelegt?

  2. Thomas Antworten

    moin,
    auch bei mir funktioniert dieses script.
    Aber: wenn in einer Funktion nacheinander verschiedene Texte abgesetzt werden, gewinnt nur der letzte!

    Protokoll(0, ‘post::alarm on);

    Protokoll(0, ‘post::alarm off’);

    LG Thomas

    • Stephan Autor des BeitragsAntworten

      Hallo Thomas,
      die Logging-Funktion ist nur so schnell, wie der ioBroker Daten liefert. Wenn hier im Sekundentakt Dinge geloggt werden sollen, so würde ich auf eine Datenbank ausweiche.

      Gruß,
      Stephan

      • Thomas Antworten

        Danke,
        mit anderen Worten: Daten die protokolliert werden sollen, können verloren gehen!

  3. Sebastian Timm Antworten

    Bei funktioniert das Skript soweit auch.
    Ich habe nur ein Problem:
    Wie kann ich das Skript aus einem Blockly heraus starten?
    Liebe Grüsse
    Sebastian

    • Stephan Autor des BeitragsAntworten

      Hallo Sebastian,
      soweit ich bei Blockly weiss, kannst Du im Bereich “Funktionen” einen Javascript-Block einfügen.
      Dort kannst du dann Javascript-Text eingeben.

      Gruß,
      Stephan

  4. Mike Antworten

    moin zusammen,
    wie lautet das Script, wenn ich alles – älter 1 Monat löschen möchte?
    Viele Grüße Mike

    • Stephan Autor des BeitragsAntworten

      Hallo Mike,
      Du kannst an das Ende des Skriptes folgendes Einfügen:
      // Lösche Protokoll
      function loescheProtokoll() {
      setState(datenpunkt + "Ereignisse", "");
      }

      // Lösche Protokoll nach 1 Monat
      schedule("00 00 1 * *",loescheProtokoll);

      Habe das Skript oben auch ergänzt!

      • Frank Antworten

        Hallo Stphan,

        ich denke Mike meit das etwas anders. So wie du geantwortet hast wird das Protokoll nach einem Monat komplett gelöscht. Gibt es vielleicht auch eine möglichkeit NUR das zu löschen was älter ist wie ein Monat? Ich würde es bei mir gerne so realisieren das alles was älter ist wie 2 wochen gelöscht wird.

        Gruß Frank

        • Stephan Autor des BeitragsAntworten

          Hallo Frank,
          dazu müsste man das Protokoll in einer Datenbank speichern, damit man auf das Datum reagieren bzw. danach filtern kann.
          Hier wird nur eine Zeichenkette erstellt.

  5. Kim Scholze Antworten

    Guten Morgen, vorab vielen Dank für das tolle Script.
    Nun ist es so, das ich von programmierung absolut keine Ahnung habe 🙁
    Hier unten ist das Script so wie ich es nutze….Meine Frage wäre, was genau bzw. wie muss der Datensatz heissen, um die Ereignisse nach 2 Tagen um 23.59 Uhr selbstständig zu löschen ?? EWäre toll wenn Du mir das zeigen würdest.

    Mit besten Grüßen
    KScho

    // Hauptdatenpunkt unterhalb javascript
    var datenpunkt = “Ereignisprotokoll.”;

    // Mögliche Protokoll-Texte
    const texte = [“Info”,”Warnung”,”Fehler”];

    // Farben zu den Texten (schwarz, gelb, rot)
    const farbe = [“#ffffff”,”#D90000″,”#EF5350″];

    // Symbole zu den Texten
    const symbol = [“ⓘ”,”⚠”,”☠”];

    function Protokoll(typ, Text) {
    // Protokoll abholen
    var Protokoll_Liste = getState(datenpunkt+”Ereignisse”).val;
    var datum = formatDate(new Date(), “TT.MM.JJ hh:mm:ss”);

    // Neues Protokoll generieren
    let tmp_Protokoll = datum + “”
    + symbol[typ] + ” ” + texte[typ] + “” + Text + “”;

    // Neues Protokoll an den Anfang setzen
    Protokoll_Liste = tmp_Protokoll + Protokoll_Liste;

    // Neues Protokoll in Datenpunkt speichern
    setState(datenpunkt + “Ereignisse”, Protokoll_Liste);
    }

    // Zugehörige Datenpunkte erstellen
    function erstelleDatenpunkte() {
    // Datenpunkt Protokoll
    createState(datenpunkt+”Ereignisse”, “”, false, {
    name: “Ereignisprotokolle”,
    desc: “Protokoll Funktion über JavaScript”,
    type: “string”,
    role: “text”,
    unit: “”
    });
    }

    // einmaliger Aufruf zum Erstellen der DP’s
    erstelleDatenpunkte();

    // Protokoll – 0 – Information
    on({id: “deconz.0.Sensors.13.open”, change: “ne”}, function (obj) {
    if (obj.state.val === true) {
    Protokoll(0, “Garagentür AUF”);
    } else {
    Protokoll(0, “Garagentür ZU”);
    }
    });

    • Stephan Autor des BeitragsAntworten

      Hallo Kim,
      am Ende des Skriptes kannst Du folgendes einfügen:

      function Loesche_Log() {
      setState(datenpunkt + "Ereignisse", "");
      }

      schedule('59 23 */3 * *',Loesche_Log); // Alle 3 Tage um 23:59 Uhr wird "Loesche_Log" ausgeführt.

      Gruß,
      Stephan

  6. Wolfgang Antworten

    Das Script funktioniert so wie es soll. Erst einmal vielen Dank.
    Wenn man aber so viele Ereignisse loggen möchte, wird der Datenpunkt schnell sehr voll. Ich habe jetzt versucht, über bestimmte Ereignisse den Datenpunkt wieder zu leeren. Leider ohne Erfolg.
    Hier meine Ergänzung;
    —– snip-snap —— (bestehender Inhalt)
    // Neues Protokoll in Datenpunkt speichern
    setState(datenpunkt + “Ereignisse”, Protokoll_Liste);
    —– snip-snap —— (meine Ergänzung)
    if (typ == 9) {
    // Protokoll loeschen
    setState(datenpunkt + “Ereignisse”, “GELOESCHT”);
    Protokoll_Liste = “GELOESCHT”;
    console.error(([‘LOESCHEN 2’,].join(”)));
    }
    —– snip-snap —— (ENDE)
    Leider wird der Datenpunkt nicht gelöscht, obwohl im ioBroker-Logging der Text “LOESCHEN2” ausgegeben wird.
    Wo mache ich denn da einen Denkfehler?
    Liebe Grüße

    • Stephan Autor des BeitragsAntworten

      Hallo Wolfgang,
      Wenn du den Datenpunkt löschen möchtest, dann kannst Du dies wie folgt erledigen:
      setState(datenpunkt + "Ereignisse", "");

      Somit wird der Datenpunkt “Ereignisprotokoll.Ereignisse” geleert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert