ioBrokerioBroker Tutorials

ioBroker – Aufzählungen für das Zählen von offenen Fenstern oder Türen verwenden

In diesem Artikel zeige ich Dir, wie Du eigene Aufzählungen in ioBroker für das Zählen von offenen Fenstern oder Türen nutzen kannst. 

Nach der Installation und Einrichtung von ioBroker verfügt die Installation bereits über eigene Aufzählungen. Diese können über den Bereich links im Menü geöffnet werden. Mit weiteren Adaptern wie z.B. Homematic werden die Aufzählungen erweitert und die Geräte bereits zugeordnet. In meiner Produktivumgebung nutze ich Homematic, eigene Sensoren über MQTT und Xiaomi über den zigbee Adapter. Aus diesem Grund habe ich mich dazu entschieden eine eigenen Aufzählung anzulegen, mit der ich den Status von offenen Fenstern und Türen besser steuern kann.

Verwendete Sensoren:

Im ersten Schritt wechseln wir nun in den Bereich Aufzählungen und legen dort über die Plus-Schaltfläche eine neue Aufzählung an.

Nach dem Klick auf die Plus-Schaltfläche wählen wir hier den Menüpunkt „Benutzerdefinierte Gruppe“ aus.

Im neuen Fenster können wir hier den Name der Aufzählung, oder hier Kategorie genannt, vergeben. Ich lege in diesem Schritt eine Aufzählung mit dem Namen „windowStatus“ an. Nach dem die Aufzählung gespeichert wurde, können wir direkt eine weitere mit dem Namen „doorStatus“ anlegen. Damit können wir nun den Status von Türen und Fenstern getrennt auswerten.

In der Übersicht der Aufzählungen sind nun zwei neue Aufzählungen (Enums…) zu finden.

Im nächsten Schritt müssen wir den JavaScript-Adapter neu starten, sodass die Aufzählungen neu initialisiert werden. Bei mehreren Adaptern, bitte alle JavaScript-Adapter neustarten.

Nach dem wir nun die Aufzählungen angelegt haben, können wir im nächsten Schritt den Datenpunkt der jeweiligen Sensoren von Türen und Fenstern der Funktion „doorStatus“ oder „windowStatus“ zuordnen. Dazu klicken wir bei dem Datenpunkt, der den aktuellen Zustand des Fensters (true=offen, false=geschlossen) speichert, in die Spalte Funktion und wählen dort unsere neue Aufzählung „doorStatus“ oder „windowStatus“ an.



Nach dem wir diese Zuordnung vorgenommen haben, sollten wir den jeweiligen Sensor unterhalb der Aufzählung finden. In meiner Umgebung habe ich die HomeMatic Sensoren den Datenpunkt „STATE“ verwendet. Die Zigbee Sensoren von Xiaomi laufen über den Datenpunkt „is open“.

Nun wechseln wir in den Bereich Skripte. Im Berech Skripte erstellen wir uns ein neues leeres JavaSkript.

Mit dem folgenden Skript-Code können wir nun die zugeordneten Sensoren aus der Auflistung auslesen. In der Schleife werden alle zugeordneten Datenpunkt ausgegeben. Somit können wir per getState() Funktion den aktuellen Zustand ermitteln.

function listEnumDevices() {
  log("Liste der Fenster und Status:");
  var windows = getObject("enum.functions.windowstatus").common.members;
  for(let i = 0; i < windows.length; i++) {
    var Status = getState(windows[i]).val;
    log(windows[i] + " " + Status);
  }

  log("Liste der Türen und Status:");
  var doors = getObject("enum.functions.doorstatus").common.members;
  for(let i = 0; i < doors.length; i++) {
    var Status = getState(doors[i]).val;
    log(doors[i] + " " + Status);
  }
}

listEnumDevices();

Die Ausführung der Funktion bringt nun folgendes Ergebnis:

Im folgenden Skript-Code gehe ich noch einen Schritt weiter. Zum einen zähle ich die offenen Fenster und Türen und schreibe dann das Ergebnis in eigene Datenpunkte. Diese Datenpunkte nutze ich in meiner Visualisierung um damit den Zustand von geöffneten Fenstern und Türen zu visualisieren. Folgende Datenpunkte müssen in den Objekten angelegt werden:

Datenpunkte.0.StatusWindowOpenText (Zeichenfolge, Schreibzugriff)
Datenpunkte.0.StatusDoorOpenText (Zeichenfolge, Schreibzugriff)
Datenpunkte.0.StatusWindowOpen (Zahl, Schreibzugriff)
Datenpunkte.0.StatusDoorOpen (Zahl, Schreibzugriff)

function countOpenWindowsDoors()
{
    var openWindows = 0;
    var openDoors = 0;
      
    // Fenster
    var windows = getObject("enum.functions.windowstatus").common.members;
    for(let i = 0; i < windows.length; i++) {
        var Status = getState(windows[i]).val;
        if ( Status ) { 
            openWindows = openWindows + 1;
        }
    }
    
    // Türen
    var doors = getObject("enum.functions.doorstatus").common.members;
    for(let i = 0; i < doors.length; i++) {
        var Status = getState(doors[i]).val;
        if ( Status ) { 
            openDoors = openDoors + 1;
        }
    } 
    
    var openWindowsText = "Kein Fenster geöffnet";
    var openDoorText = "Keine Tür geöffnet";
    
    if ( openWindows > 0 ) {
        openWindowsText = openWindows + " Fenster geöffnet"; 
    }
    
   
    if ( openDoors > 0 ) {
        openDoorText = openDoors + " Türe(n) geöffnet"; 
    }    

    setState('Datenpunkte.0.Visualisierung.Uebersicht.StatusWindowOpenText', openWindowsText );
    setState('Datenpunkte.0.Visualisierung.Uebersicht.StatusDoorOpenText', openDoorText );        
    setState('Datenpunkte.0.Visualisierung.Uebersicht.StatusWindowOpen', openWindows );
    setState('Datenpunkte.0.Visualisierung.Uebersicht.StatusDoorOpen', openDoors );    
}

$('state(functions=windowstatus)').on(function(obj) {
    countOpenWindowsDoors();
});

$('state(functions=doorstatus)').on(function(obj) {
    countOpenWindowsDoors();
});

countOpenWindowsDoors();

Bei einer Änderung eines Fenster- oder Türstatus kann über den jQuery Selektor eine on-Subscription auf die Aufzählung „windowStatus“ und „doorStatus“ eingerichtet werden um damit automatisch die aktuelle geöffneten Fenster oder Türen zu ermitteln.



In meiner Visualisierung kann ich so den Status der geöffneten Fenster und Türen darstellen. Mehr Informationen zur Visualisierung bekommst Du in meiner Artikel-Serie über die Planung und die Implementierung meiner ioBroker Visualisierung.

Mittels dieser Vorgehensweise ist es auch deutlich leichter neue Sensoren in das Smart-Home einzubinden. Ich werde in Zukunft mehr über Aufzählungen lösen, auch Beleuchtungsszenarien sind damit noch einfach und flexibler handhabbar.

Ich hoffe Dir gefällt der Artikel. Schreibe mir bei Fragen oder Problemen einfach einen Kommentar unter den Artikel oder eine E-Mail ?

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

76 Gedanken zu „ioBroker – Aufzählungen für das Zählen von offenen Fenstern oder Türen verwenden

  • Pingback: Visualisierung – Teil 4.1 – Implementierung – Datenpunkte – smarthome-tricks.de

  • Helmut Schade

    Hallo!
    Ich habe bei mir die beiden Punkte wie beschrieben angelegt
    doorStatusenum.rooms.doorstatus und windowStatusenum.rooms.windowstatus
    Wen ich jetzt aber auf Datenpunkte Funktion gehe sehe ich aber doorStatus und windowStatus nicht!
    Es werden mir nur die Gewerke angezeigt die in der RaspberryMatic angelegt sind.

    Antwort
  • Pingback: Visualisierung – Teil 4.2 – Implementierung – Übersicht – smarthome-tricks.de

  • Ja.rod

    Hallo,
    ich bin ein absuluter Neuling was Scripte betrifft, entschuldige deshabb mein Frage:
    Bei mir steht bei deinem Script „countOpenWindowsDoors“ eine Hinweismeldung in Zeile 16 und zwar „‚Status‘ is already defined“.
    Gehärt sich das so?

    Gruß
    Ja.rod

    Antwort
  • Jarod

    Bin ein absoluter Anfänger im Script-Bereich. ich habe dein Script angelegt, dabei wird aber in Zeile 16 die Meldung angezeit „‚Status‘ is already defined“. Es läuft daher nicht durch. Wo liegt der Fehler?

    Über einen Tipp würde ich mich freuen.

    Gruß
    Ja.rod

    Antwort
    • Matthias Korte

      Hallo,

      hast Du den Code exakt so wie oben übernommen, das sollte so problemlos funktionieren?

      Viele Grüße,
      Matthias

      Antwort
      • Jarod

        Hallo Matthias,
        ich habe das ganze nochmals von Anfang an gestartet und erstmal mit deinem Script zur Auflistung der Geräte gestartet. Hier das log, paßt schon mal nicht
        22:26:13.107 [info] javascript.0 Stop script script.js.common.listEnumDevices
        22:26:13.121 [info] javascript.0 Start javascript script.js.common.listEnumDevices
        22:26:13.121 [info] javascript.0 script.js.common.listEnumDevices: registered 0 subscriptions and 0 schedules

        Als Sensoren nutze ich einen Fenstersensor von Homematic und einen von Xiaomi.

        Gruß
        Ja.rod

        Antwort
  • Hendrik

    Bekomme den selben Fehler wie Jarod, in Zeite 16 sagt er mir genau das Status schon definiert wurde.

    Außerdem setzt du einfach so in all deinen Tutorials einige dinge vorraus die als Anfänger nicht selbst verständlich sind das man weiß was mit den anzufangen ist in diesem Tutorial jetzt den Code ich hab erst überlegt hau ich den jetzt irgendwie in ein Vis Teil rein oder wie.

    Und das zieht sich leider bisschen so durch durch fast alle Teile auch bei deinem Vis anfang auf einmal hast du ein Hintergrund in deine Vis implementiert schreibst aber nicht wie du das gemacht hast

    Antwort
    • Matthias Korte

      Moin Hendrik,
      danke für Deine Rückmeldung.

      Der Hinweis „Status is already defined“ ist eine Warnung im Skript, dass die Variable Status bereits definiert ist. Das kann aber nicht der Grund sein, warum das Skript nicht funktioniert. Deklarierte Variablen innerhalb von Schleifen haben ihren Gültigkeitsbereich auch nur in der deklarierten Schleife, von daher kann das hier nicht das Problem sein.

      Ich setze weiter unten im Skript voraus, dass bestimmte Datenpunkte angelegt sind, habt ihr die Datenpunkte dazu angelegt?

      Bitte schickt mir doch mal den Auszug aus dem ioBroker Log, dass wir dort den wirklichen Fehler erkennen können.

      Wenn in anderen Artikeln Vorgehensweisen unklar sind oder Wissen vorausgesetzt wird, welches nicht vorhanden ist, dann postet das bitte unter dem jeweiligen Artikel und nicht hier. Wir wollten hier nur das Thema des Artikels behandeln, da es sonst ziemlich unübersichtlich wird. Danke!

      Antwort
  • Thorsten

    Hallo,
    ich versuche gerade deinen Code zu verstehen. Habe allerdings wenig Erfahrung mit JS und bin eher Gelegenheitsprogrammierer und versuche durch Beispiel zu lernen.
    Das meiste kann ich nachvollziehen, habe allerdings mit folgender Zeile Schwierigkeiten.
    getObject(„enum.functions.windowstatus“).common.members;
    Leider hilft mir auch die Beschreibung von „http://www.iobroker.net/docu/?page_id=5809&lang=en#getObject “ nicht weiter.
    Folgende Fragen: Wie sieht den das Objekt aus das nachher in „windows“ gespeichert wird?
    Was bewirkt „common.members“? Sind das Methoden? Woher kennst Du die? Ich finde dazu einfach keine Beschreibung etc.
    Ich hoffe die Fragen sind nicht zu dämlich.
    Ich will aber nicht einfach Code kopieren und fertig.
    Danke auf alle Fälle für Deine Mühe
    Gruß
    Thorsten

    Antwort
    • Matthias Korte

      Hallo,
      mit dem Aufruf getObject(…) wird das eigentliche Objekt geholt. Über die Anweisung common.members werden nun die einzelnen Objekte der Auflistung members zurückgegeben. Common ist hier keine Methode sondern eine Eigenschaft. Ich habe die Vorgehensweise aus der Hilfe entnommen. Alternativ im iobroker Forum nochmals nachschauen, da sind auch einige Erklärungen vorhanden.

      Antwort
  • Fabian

    Hallo Matthias,

    super Beitrag, gefällt mir gut.
    Für mein Einsatzszenario wäre es jedoch wichtig, dass die jeweils erkannten und hoch gezählten (z.B. offenen Fenster) auch namentlich ausgegeben werden. Also konkret soll in den State „openWindowsText“ nicht ein vorgegebener Text, sondern die Bezeichnungen der Fenster (mit Komma separiert) z.B. ausgegeben werden.
    Egal ob für vis oder auch als Email, mich interessiert WELCHE Fenster konkret offen sind.
    Vielleicht kannst Du ja die dazu nötigen Codezeilen noch spendieren 🙂

    Dankeschön vorab,
    Grüße
    Fabian

    Antwort
  • Jens

    Zuerst: Sehr gute Anleitung(en)!! Vielen Dank dafür!

    Nachdem ich jetzt einige Stunden mit meinen ersten „Gehversuchen“ in JS gemacht habe, habe ich endlich auch dieses Beispiel adaptiert und zum Laufen gebracht 🙂
    Dazu ein Hinweis: Nach der Anlage eigner Aufzählungen muss der Javascript-Adapter neu gestartet werden! Hat einige Zeit gedauert, bis ich die Ursache ergooglet hatte, warum die subscription nicht geklappt hat…
    Wäre evtl. sinnvoll, den Hinweis zu ergänzen, denn darüber werden alle stolpern, die das (ansonsten sehr gute) Tutorial Schritt für Schritt durchführen wollen…

    Antwort
  • Christoph

    Hallo zusammen,
    leider wird mir bei der Zeile getObject(„enum.functions.windowstatus“).common.members; beim klick auf members folgende Meldung angezeigt:

    „Property ‚members‘ does not exist on type ‚StateCommon | ObjectCommon | ChannelCommon | OtherCommon‘.
    Property ‚members‘ does not exist on type ‚StateCommon‘. “

    Kann mir jemand erklären wo der Fehler liegt?
    Vielen Dank!

    Antwort
  • thomas

    Also erst mal danke für den Guide. Leider bekomme ich es nicht zum laufen:
    20:55:45.916 [info] javascript.0 Stop script script.js.Aufzählung.listEnumDevices
    20:55:45.932 [info] javascript.0 Start javascript script.js.Aufzählung.listEnumDevices
    20:55:45.935 [info] javascript.0 script.js.Aufzählung.listEnumDevices: registered 0 subscriptions and 0 schedules

    Trotz neustart des JS adapter.
    Interessanterweise will ich die enom function per id einfügen. Das geht aber nicht da ich die nicht finden kann im JS editor. Wenn ich unter objekten schaue sind sie aber da. Ist das normal?

    Antwort
    • Matthias Korte

      Hallo,
      hast Du den Code als neues JavaScript Script eingefügt und aktiviert? Stehen evtl. noch Fehler im Log?

      Antwort
  • Christoph

    Hallo zusammen,
    ich habe mit der Zeile
    var windows = getObject(„enum.functions.windowstatus“).common.members;

    ein Problem. Es wird angezeigt Property ‚members‘ does not exist on type…

    Ich hab keine Ahnung wo ich ansetzen muss um den Fehler zu beheben.
    Vielleicht könnt ihr mir weiterhelfen.
    Gruß
    Christoph

    Antwort
    • Matthias Korte

      Versuche mal bitte folgenden Code:

      var windows = getObject('enum.functions.windowstatus').common.members;

      Antwort
      • Ich habe den gleichen Hinweis wie Christoph, die Anpassung des Codes hat den Fehler aber auch nicht behoben.

        Antwort
        • Michael Hoffmann

          Auch bei mir der gleiche Fehler. Was hat es mit dem common.mnembers auf sich? Muss ich dafür noch irgend etwas anlegen? Wenn ja, wo?

          Antwort
  • Carsten

    Hallo Leute!

    iobroker ist für mich noch recht NEU ….Ich komm leider nicht ganz zurecht.

    Datenpunkte anlegen und die Skripte im JavaSkript Editor erzeugen (wie oben) alles kein Problem.

    Doch wie lasse ich mir die Sachen im Vis darstellen? Welches Widget muss ich da nehmen?
    Und wo schriebe ich das Skript:

    $(’state(functions=windowstatus)‘).on(function(obj) {
    countOpenWindowsDoors();
    });
    $(’state(functions=doorstatus)‘).on(function(obj) {
    countOpenWindowsDoors();
    });

    hin??????

    Vielen Dank für die Hilfe und einen schönen Sonntag.

    Antwort
    • Matthias Korte

      Moin Carsten,

      den JavaScript-Code musst Du im Bereich der Scripts einfügen. Nicht in VIS!
      Die Datenpunkte kannst Du nun z.B. Number Widget darstellen. Dazu einfach die Object-ID auswählen 🙂

      Viele Grüße,
      Matthias

      Antwort
  • Chester

    Hallo Matthias,
    ich versuche mich hier durch deine tollen Tutorials durchzukämpfen und diese für mich zu nutzen.
    Momentan habe ich das Problem, dass ich dein Script übernommen habe, und um Lichter ergänzt habe, da ich noch auf Fenster- und Türsensoren warte.
    Leider ändert sich aber der Wert des Datenpunkts „StatusLightOpen“ nicht. Er zeigt „0%“ an und bleibt auch so, egal ob ich Lichter einschalte.
    Wo genau muss der Codeteil:
    „$(’state(functions=windowstatus)‘).on(function(obj) {
    countOpenWindowsDoors();
    });

    $(’state(functions=doorstatus)‘).on(function(obj) {
    countOpenWindowsDoors();
    }); “
    eingefügt werden? Ist das ein eigenens JS oder wird es einfach an den vorherigen Code unten angehängt?
    Ausserdem habe ich ebenfalls das Problem wie meine Vorredner mit dem Eintrag „commom.members“
    Wäre Dir unendlich dankbar, wenn Du einem Noob etwas auf die Sprünge helfen könntest.

    Danke im Voraus!

    Grüße
    Chester

    Antwort
    • Matthias Korte

      Hallo Chester,

      Du kannst den Code einfach an den bestehenden Code anfügen. Bitte prüfe die genaue Schreibweise, nicht dass hier die Anführungszeichen wie im Eintrag weiter oben falsch sind.

      Grüße,
      Matthias

      Antwort
  • Kann man über doors[i] auch den channelName in den Datenpunkt schreiben?

    Antwort
    • ja, ich benutze es so fuer die Fenster, name aus objectID:

      …..
      var openWindowslist =““;

      // Fenster
      var windows = getObject(‚enum.functions.windowstatus‘).common.members;
      for(let i = 0; i 0 ) {
      openWindowsText = openWindows + “ Fenster geöffnet: „+openWindowslist;

      Antwort
      • Kannst du das mit der openWindowslist nochmal genauer erklären?
        Die Funktion würde mich auch interessieren.

        Danke
        Gruß David

        Antwort
  • Alexander Höhfeld

    Hallo zusammen,

    ich habe das gleiche Problem wie o.a.:

    In der Zeile

    > var windows = getObject(„enum.functions.windowstatus“).common.members;

    bekomme ich die Fehlermeldung

    Property ‚members‘ does not exist on type ’stateCommon | Object Common | ChannelCommon | OtherCommon‘.

    angezeigt. Hat sich die API ggf. geändert?

    lg
    Alex

    Antwort
    • Matthias Korte

      Moin,
      ich habe das gerade mal mit neuesten Stand in meiner Test-Umgebung geprüft und hierbei keinerlei Probleme feststellen können. Bitte prüfe ob die Aufzählung auch wirklich sauber unter „Funktions“ angelegt wurde. Kannst Du den Objekten die Funktion zuweisen? Bitte prüfe zudem die genaue Schreibweise der Id im Code.

      Antwort
  • Michael Hoffmann

    Gerade Habe ich dieses Script 1:1 übernommen. Auch ich erhalte die Fehlermeldung
    Property ‚members‘ does not exist on type ’stateCommon | Object Common | ChannelCommon | OtherCommon‘.
    Mir scheint da ist tatsächlich irgendwo der Wurm drin. Angelegt sind die Aufzählungen unter Funktionen. Ich habe ausschließlich TFK von Homematic. Muss ich noch irgendwelche Datenpunkte anlegen?

    Antwort
    • Matthias Korte

      Hallo,

      danke für Dein Feedback, ich habe gerade nochmals den Artikel angepasst, damit sollte es laufen. Bitte gebe mir eine kurze Rückmeldung. Danke 🙂

      Viele Grüße,
      Matthias

      Antwort
  • Torsten Kollek

    Hallo ich habe ebenfalls dieses Problem
    In der Zeile

    var windows = getObject(„enum.functions.windowstatus“).common.members;

    bekomme ich die Fehlermeldung

    Property ‚members‘ does not exist on type ’stateCommon | Object Common | ChannelCommon | OtherCommon‘.

    angezeigt. Meine ScripEngine ist Version 4.1.12.

    lg
    Torsten

    Antwort
    • Matthias Korte

      Hallo,

      danke für Dein Feedback, ich habe gerade nochmals den Artikel angepasst, damit sollte es laufen. Bitte gebe mir eine kurze Rückmeldung. Danke 🙂

      Viele Grüße,
      Matthias

      Antwort
  • Thomas Kuhn

    Hallo,

    bei mir wird bei beiden Skripten ebenfalls members markiert und dieser Fehler angezeigt. Beide Skripte laufen nicht, geben in den Logs aber auch keine besonderen Fehler aus. Da bei mir andere Skripte einwandfrei laufen, scheint irgendeine Voraussetzung nicht erfüllt zu sein, die in der eigentlich tollen Beschreibung als Selbstverständlich vorausgesetzt wird. Die Frage ist nun, wo ist der Unterschied, was fehlt, was ist nicht oder noch nicht definiert?

    Ich würde das Skript schon gerne einsetzen, denn es ist, im Vergleich zu anderen Skripten und Ansätzen bei weiten nicht so groß und aufwendig und nutzt die Möglichkeiten von iobroker.

    Ich hoffe, wir finden den Grund und eine Lösung.

    Antwort
    • Matthias Korte

      Hallo,

      danke für Dein Feedback, ich habe gerade nochmals den Artikel angepasst, damit sollte es laufen. Bitte gebe mir eine kurze Rückmeldung. Danke 🙂

      Viele Grüße,
      Matthias

      Antwort
  • Maddin

    Hey ho, erstmal super Guide, bis hier hin, leider.

    Ich komme gerade über den VIS Guide, wie wahrscheinlich die meisten, die am Script zum Auszählen gescheitert sind.

    Gerade dieser entscheidende Knackpunkt wurde etwas „vernachlässigt“. In den beiden Beiträgen wirken die Infos „dahingeworfen“.

    Mag vielleicht mackern auf hohem Niveau sein, doch die anderen Guides sind sehr ausführlich nach dem Prinzip klick hier, klick da.

    Der Code Bereich allerdings is einfach so: „Da is der Code. Kuck wies weiter geht!“

    Nicht falsch verstehen, ich weiss das solche Dinge wirklich sehr umfangreich und zeitaufwendig sind, doch das ist ein Hilferuf meinerseits. Ich komm nemme weiter.

    Meine Scripte sind kopiert, gespeichert.
    Einziger Fehler ist der bereits bekannte „…. common.members“ Fehler, brauche ich sicher net nochmal zu posten.
    Das Script startet auch, wirft keine auffälligen Meldungen, Mir scheint es so als würde der StatusDoorOpenText Datenpunkt einfach nicht befüllt werden.

    Danke schonmal für die Hilfe im Voraus.

    Gruß
    Maddin

    Antwort
    • Matthias Korte

      Hallo,

      danke für Dein Feedback, ich habe gerade nochmals den Artikel angepasst, damit sollte es laufen. Bitte gebe mir eine kurze Rückmeldung. Danke 🙂

      Viele Grüße,
      Matthias

      Antwort
      • Thomas Kuhn

        Hallo,

        sie funktionieren hier weiterhin nicht. Ich habe schon mehrfach Javaskript und sogar komplett ioBroker neu gestartet ohne einer Änderung. Das einzige was bei mir nach dem Start der Skripte ausgegeben wird, ist folgendes:

        11:54:07.072 info javascript.0 Stop script script.js.common.Visualisierung.StatusTuerFenster
        11:54:07.072 info javascript.0 Start javascript script.js.common.Visualisierung.StatusTuerFenster
        11:54:07.072 info javascript.0 script.js.common.Visualisierung.StatusTuerFenster: registered 0 subscriptions and 0 schedules

        Mehr passiert nicht. Wenn wenigstens das erste Skript laufen würde, dann wüßte ich das etwas mit den angelegten Datenpunkten nicht stimmt, aber auch das einfachere tuts „noch“ nicht.

        Ich hoffe dir fällt noch was ein.

        Thomas

        Antwort
  • Stefan

    Hallo Matthias,

    kannst Du kurz erklären, wie das gemeint ist bzw. funktionier?
    „…Bei einer Änderung eines Fenster- oder Türstatus kann über den jQuery Selektor eine on-Subscription auf die Aufzählung „windowStatus“ und „doorStatus“ eingerichtet werden um damit automatisch die aktuelle geöffneten Fenster oder Türen zu ermitteln….“

    Danke,
    Stefan

    Antwort
  • stephan matz

    hallo, das skript funktioniert bei mir soweit fast komplett ,danke dafür schon mal.
    allerdings wenn ich einen kontakt verändere passiert zunächst nichts, erst wenn ich das javaskript neu starte werden die offenen kontakte gezählt und richtig in die datenpunkte geschrieben. Fehlt mir da noch etwas? vielleicht ist es der letzte absatz, den ich nicht verstehe bzw. heißt dass das ich noch was machen muss zum aktualisieren/zählen der kontakte oder macht dass das script automatisch?
    danke

    Antwort
    • Hallo!
      Habe genau das gleiche Problem und noch keine Lösung gefunden.
      Ich wäre sehr dankbar wenn man mir da weiterhelfen könnte,
      Gruß Ben

      Antwort
  • Hallo zusammen,

    danke für die Scripte, bei mir funktioniert es gut. Allerdings werden bei mir die Fenster gezählt, die geschlossen sind. Heißt, wenn alle geschlossen sind, wird angezeigt „10 Fenster geöffnet“.

    Wie kann ich den Wert „umkehren“?

    Antwort
    • Matthias Korte

      Hallo Klaus,

      in der Funktion countOpenWindowsDoors wird mit der folgenden Zeile geprüft ob das Fenster geöffnet ist:

      if ( Status ) { openWindows = openWindows + 1; }

      Wenn bei Dir die Objekte anders aussehen, dann einfach die Abfrage so umdrehen:

      if ( !Status ) { openWindows = openWindows + 1; }

      Viele Grüße,
      Matthias

      Antwort
      • Vielen Dank, klappt super 🙂

        Antwort
  • Benjamin

    Hallo Matthias,
    erst einmal vielen Dank für die guten Anleitungen und Skripte.
    Ich habe in diesem Fall das Problem das eine Änderung der Fenster und Türen erst gezählt werden wenn ich das Skript neu starte, sonst passiert leider nichts. Danach wird in den Datenpunkten allerdings der richtige Wert angezeigt.
    Gruß Ben

    Antwort
    • ste matz

      hey, hab genau das selbe problem das es erst beim neustart vom script zähhlt. hab das hier sicher schon 3x als kommentar gepostet aber ist noch nie erschienen, entweder wird der vom admin nicht freigegeben oder die komentarfunktion spinnt.
      hab hierzu im netz nichts finden können. hat sich das problem bei dir gelöst?
      danke

      Antwort
  • Jetzt muss ich doch nochmal nerven. Das Script zählt immer 2 Fenster zu viel. Wenn keines geöffnet ist, wird angezeigt „Es sind 2 Fenster geöffnet“.
    In den Objekten werden alle Fenster auf 1 angezeigt. Heißt alles geschlossen.

    Antwort
  • Klaus

    Habs hinbekommen 🙂
    Danke nochmal

    Antwort
  • Hallo Matthias, danke für die Skripte.
    Eine Sache verstehe ich noch nicht ganz, mit

    log(windows[i] + “ “ + Status);

    werden im Log tatsächlich alle Stati (der Fenster) aufgeführt. Wie aber übergebe ich diesen Logstatus in ein Datenpunkt, so dass ich z.B. im VIS danach triggern kann, welches Fenster offen ist?

    Antwort
  • Hallo Matthias, danke für die Skripte!
    Ich habe noch eine Verständnisfrage, mit

    log(windows[i] + “ “ + Status);

    bekomme ich den Status aller Fenster im Log angezeigt, das funktioniert einwandfrei. Wie kriege ich aber diesen Status (Liste aller offenen Fenster) in ein Datenpunkt übergeben, so dass ich z.B. VIS danach triggern kann?

    Danke, viele Grüße
    Max

    Antwort
  • Max

    Habe leider das selbe Problem wie einige hier zuvor. Der Script funktioniert nur wenn ich ihn manuell neustarte. Hat jemand eine Idee woran es liegen kann?

    Antwort
  • Frank

    Hallo Matthias,
    danke für das tolle Script. Es funktioniert soweit. Leider aktualisiert sich der jeweilige Datenpunkt nur nach manuellem Neustart. Kannst Du hier helfen, was fehlt noch zur automatischen Aktualisierung?

    Antwort
  • Wolfgang

    Hallo Matthias,
    ich möchte deine Vorlage gerne erweitern (mit Unterstützung 😉 ), damit zum einen alle Fensterkontakte eines Raumes, als auch alle Fensterkontakte gesamt, als Status geschrieben werden.
    Wie müsste das Script aussehen, damit es alle Räume automatisch überwacht?
    Herzlichen Dank
    Gruß Wolfgang

    Antwort
  • André

    Servus Matthias,
    bei mir bringt er folgende Fehler:
    javascript.0 (14518) script.js.Rollläden.Anzahl_Fenster_offen: script.js.Rollläden.Anzahl_Fenster_offen:22
    javascript.0 (14518) at countOpenWindowsDoors (script.js.Rollläden.Anzahl_Fenster_offen:22:46)
    javascript.0 (14518) at script.js.Rollläden.Anzahl_Fenster_offen:40:1

    Ich denke es hat was mit den Datenpunkten zu tun, komme aber nicht so recht weiter.

    Danke im Voraus

    Antwort
  • Achim

    Hallo Matthias,
    erst mal hezlichen Dank für das Script. Läuft bei mir reibungslos durch. nur das Problem das script zu starten habe ich auch. Das
    “ jQuery Selektor eine on-Subscription auf die Aufzählung „windowStatus“ und „doorStatus“ “
    sagt mir leider als iobroker neuling gar nichts. bitte einen kleinen tip.
    Danke für deine Arbeit!
    Gruß aus HH
    Achim

    Antwort
  • Reiner

    Hallo Matthias, ich habe mit Begeisterung Dein Script implementiert und auf meine lokalen States etc angepasst (bei mir kommen die Infos aus dem Haus via KNX Aktoren).
    Ein anderer User hatte zwischendurch die sehr gute Frage gestellt, dass nicht nicht die Anzahl der offenen Fenster von Interesse ist, sondern eben auch welche. Statt auf Umwegen sich jetzt manuell alle Fensteraktoren einzeln abzufragen um z.B, in die VIS zu übergeben, könntest Du als Owner der tollen Abfrage über eine Ergänzung nachdenken, wie die tatsächlich offenen Fenster aus der Abfrage herauspurzeln?
    EErwiterungsidee technisch abstrakt angedacht
    Aktuell ist ja jetzt eine Variable inkludiert, die die gezählten Fenster (status offen) beinhaltet.
    Könnt nicht eine Variable gebaut werden, die jeweils immer einen Textstring beinhaltet der bei der Abfrage der göffneten Fenster (z.B. EG Küche Süd, EG Küche Nord) die aus der Bezeichnung der konkreten Stats (bei mir KNX Adpater) abgeleitet werden und zusammesetzt als ein Objekt (=String)?
    Mit dieser Variablen könnte doch in der VIS auch das wieder ausgegeben werden, o.k. ein bisschen Formatierung wird nötig sein oder aber per Blockly das String in JS Objekt wandeln.
    Leider habe ich noch keine VIS gut am laufen und schaue interessiert in Deine Widget Tutorials hinein, habe da aber noch nichts gefunden.
    Hoffe Du kommst mit meinen Anregungen zurecht und nimmst Dir Zeit für einen 2. Teil der collen Fensterüberwachung, die ja übrigens auch auf andere Stati in der Hausatomatisation übertragen werden könnte (Bewegungsmelder, Rauchmelder etc).

    Antwort
  • Hallo,

    vielen Dank für den veröffentlichen Beitrag.

    Weißt du wie man den den passenden Raum zum Sensor ausliest?

    Grüße
    Patrick

    Antwort
  • Tom Son

    Hi… ich möchte das selbe nur mal testen, bin auch blutiger Anfänger 🙂 Aber bei dem Script bekomme ich einen Fehler schon in Zeile 8
    for(let i = 0; i &lt; windows.length; i++) { die Meldung dass amp; und lt; nicht gefunden werden kann.
    amp; ist doch eigentlich ein & und lt; ist ein > Zeichen, das habe ich in verschiedenen Varianten ausprobiert, aber es bleibt immer bei dem Fehler…
    Desweiterne habe ich auch das .common.members; Problem, wie einige oben schon geschrieben haben. Ich komme hier nicht weiter, was kann ich noch probieren?

    danke
    Thomas

    Antwort
  • Thomas

    Hallo, bin auch erst Anfänger und bekomme auch den Fehler dass in der Zeile 8 etwas nicht stimmt.
    for(let i = 0; i < windows.length; i++) {

    kann mir da jemand helfen?

    Danke

    Antwort
    • Matthias Korte

      Hallo Thomas,

      im Code war ein Fehler durch eine Plugin-Umstellung. Bitte kopiere den Code nochmals in das ioBroker-Script.

      Viele Grüße,
      Matthias

      Antwort
  • Thomas

    Habe das gleiche problem wie Tom Son kann uns keiner helfen?

    Danke

    lg Tom

    Antwort
    • Matthias Korte

      Hallo,

      im Code war ein Fehler durch eine Plugin-Umstellung. Bitte kopiere den Code nochmals in das ioBroker-Script.

      Viele Grüße,
      Matthias

      Antwort
  • Hallo,
    bekomme Fehler in Zeile 4 angezeigt

    for(let i = 0; i &amp;amp;lt; windows.length; i++) {

    javascript.0 (16342) script.js.System.TuerFenster_Status compile failed: at script.js.System.TuerFenster_Status:4

    Eine Idee?

    Gruss Hardy

    Antwort
    • Matthias Korte

      Moin Hardy,

      bitte übernehme den Code nochmals, sorry hier war durch eine Umstellung im Artikel ein Fehler passiert :-/

      Grüße,
      Matthias

      Antwort
  • Hallo Matthias,

    leider immer noch der gleiche Fehler

    javascript.0 (4603) script.js.Sicherheit.TuerFenster_Status compile failed: at script.js.Sicherheit.TuerFenster_Status:4

    Gruss Hardy

    Antwort
  • Matthias

    Hallo Matthias,

    leider immer noch der gleiche Fehler

    javascript.0 (4603) script.js.Sicherheit.TuerFenster_Status compile failed: at script.js.Sicherheit.TuerFenster_Status:4

    Gruss Matthias

    Antwort
  • Peter

    Nutzloser Artikel
    script.js.tests.test compile failed: at script.js.tests.test:4

    Antwort
    • Matthias Korte

      Danke für Deinen konstruktiven Kommentar. Ich habe das Script berichtigt, hier ist durch eine Umstellung am Blog die Darstellung des JavaScript-Codes beschädigt worden.

      Antwort
  • Aike

    Erst einmal Danke für die Anleitung und den Code. Ich konnte deinen Code soweit für mich erweitern, dass ich all meine Fenster und Türen in meinem iQontrol-Kacheln ein paar mehr Informationen mitgeben kann.
    Jedoch funktioniert die Auswertung (Ausführung des Scripts) nur einmalig. Wie genau kann ich dieses Script nun ausführen lassen, wenn es eine Änderung im „enum“ meiner Fenster bzw. Türen gab?

    Außerdem wird mir im Javascript_Editor von iobroker „member“ immer rot unterstrichen. Da scheint die IDE etwas falsch zu machen. Hat hier jemand Erfahrungen?

    Grüße & Danke für die Antworten 🙂

    Antwort
  • Markus

    Ich habe es soweit zum laufen bekommen, super Arbeit.
    Bei meinen Homematic Drehgriffkontakten wird unter State open, closed und tilted zurückgegeben kann man das Script so ändern das es auf „nicht closed“ anstatt auf true und false abfragt ?
    Es gibt bei den Drehkontakten einen state-boolean der true und false zurückgibt aber bei manchen Kontakten verliert er den state-boolean, er wird erst nach einem Neustart wieder angezeigt.
    Danke

    Antwort
  • Klemens

    Hallo, zunächst danke für die Arbeit.
    Leider erhalte ich auch die Warnmeldungen
    Property ‚members‘ does not exist on type ‚StateCommon | ObjectCommon | ChannelCommon | OtherCommon‘.
    Gibt es jetzt schon eine Erklärung und einen Tipp, was zu verändern ist?
    Gruß

    Antwort
  • Rene Zobel

    Hallo und danke für den Denkanstoss!

    Zu dem Fehler „Property ‚members‘ does not exist on type ‚StateCommon | ObjectCommon | ChannelCommon | OtherCommon‘.“:

    Der erscheit bei mir mit dem Code nun wenn ich in eine TypeScript-Datei einfüge. In JavaScript geht der Code. Vielleicht liegt bei meinen Mitkommentatoren ja hier auch schon der Fehler.

    Eine Übersetzung in TS habe ich allerdings auch noch nicht hinbekommen.

    Grüße

    Antwort
  • Hallo Matthias,
    bestend Dank für diese Anleitung und das einwandfrei funktionierende Script!

    Hast Du eventuell einen (Denk-) Ansatz parat, mit dem man auch die Bezeichnugen der ermittelten geöffneten z.B. Türen ausgeben kann? Wie kann man das abfragen?

    Grüße
    Kai

    Antwort
    • Matthias Korte

      Hallo Kai,
      danke für den Hinweis, das werde ich direkt berichtigen 🙂

      LG Matthias

      Antwort
  • Konny Hafner

    Hallo,
    ich bin ziemlich neu in dieser Thematik.
    Es funktioniert soweit alles, aber das Zählen der Fenster/Türen klappt nur bei einem manuellen Neustart des Skripts.
    Dann wird auch die richtige Anzahl der Fenster/Türen in den jeweiligen Datenpunkt geschrieben.
    Hab gelesen, dass hier mehrere das gleiche Problem haben.
    Vielleicht hat ja schon jemand eine Lösung gefunden.
    Wäre dafür sehr dankbar.
    Gruß
    Konny

    Antwort

Schreibe einen Kommentar zu Matthias Korte Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht.