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.

 

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);
  }    
}

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)
Datenpunkte.0.StatusDoorOpenText (Zeichenfolge)
Datenpunkte.0.StatusWindowOpen (Zahl)
Datenpunkte.0.StatusDoorOpen (Zahl)

 

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.StatusWindowOpenText', openWindowsText );
  setState('Datenpunkte.0.StatusDoorOpenText', openDoorText );
  setState('Datenpunkte.0.StatusWindowOpen', openWindows );
  setState('Datenpunkte.0.StatusDoorOpen', openDoors );
}

 

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.

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

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

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.

11 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

  • 30. Oktober 2018 um 13:10
    Permalink

    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

  • 6. November 2018 um 6:34
    Permalink

    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
  • 7. November 2018 um 10:34
    Permalink

    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
    • 7. November 2018 um 10:41
      Permalink

      Hallo,

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

      Viele Grüße,
      Matthias

      Antwort
      • 22. November 2018 um 22:32
        Permalink

        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
  • 7. November 2018 um 22:22
    Permalink

    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
    • 8. November 2018 um 6:35
      Permalink

      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
  • 17. Dezember 2018 um 0:24
    Permalink

    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
    • 27. Dezember 2018 um 11:12
      Permalink

      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

Schreibe einen Kommentar

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

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich akzeptiere