Fensterkontakte in ioBroker integrieren

Lesedauer 10 Minuten

Ich muss mal eine Lanze für das ioBroker-Forum brechen. Aber eine ganz dicke Lanze! Keine Spur von „RTFM“ oder „Lies die FAQ“ oder gar „Kannst Du nicht die SuFu bedienen?“. Die Leute helfen, wo sie nur können. Ich wusste auch nicht, wie ich die 433 MHz Fensterkontakte in das SmartHome als Geräte bekomme. Aber das ist eigentlich nicht sooo schwer, auch wenn es eben nicht automagisch funktioniert.

Ziel:

Im ioBroker werden wir uns ein Skript erstellen, dass ein von der Bridge empfangenes Datenpaket zerlegt und einem von uns erstellten Gerät zuweist.

Hier werde ich wirklich alles Schrit-für-Schritt erklären, sodass es auch absolute N00bs (Anfänger) verstehen können.

Verwendete Hardware:

Golden Security GS-WDS07(1)
Sonoff RF Bridge 433(1)

IMG 20210401 194823
Karton mit der Sonoff-Bridge und den Fensterkontakten

Warum denn bitte keine Zigbee- oder Homematic-Tür-/Fensterkontakte (TFK)?

Da kostet ein Kontakt mindestens einen Zehner. Meistens eher 15 bis 20 Euro.
Wir haben aber 34 Fenster und Türen, die wir gerne überwacht sehen würden.
340 Euro zzgl. einer jeweiligen Bridge (oder deren mehrere) ergibt Kosten von mindestens 400 bis 800 Euro.
Das ist nicht darstellbar!
Das rentiert sich niemals!

Für die TFK habe ich aus China (kurz vor Corona) pro Stück 2,45 Euro bezahlt.
Mit Versand!
Die bereits mit Tasmota geflashte Sonoff Bridge schlug mit nicht ganz 20 Euro zu Buche.
Aufgerundet nicht ganz 105 Euro, also ein Viertel.

Nachteile:

Die Integration ist nicht so geschmeidig wie bei den teureren TFK
Die TFK sind klobig
Senden unverschlüsselt
Status nicht abfragbar, reine Sender

Vorteile:

Preiswert in der Anschaffung
Billig im Unterhalt durch normale AAA-Batterien
Gut zu modifizieren
Leicht mit einem Sabotage-Alarm erweiterbar

Das Reed-Relais lässt sich einfach auslöten und (z. B. für den Einsatz in einem Briefkasten) flexibel einsetzen.
Die Antenne kann man leicht durch einen passenden Draht ersetzen. Ebenfalls gut für die Verwendung als Postmelder.

IMG 20210401 194936
Lieferumfang eines TFK im Beutel: TFK, Magnet, zwei Klebepads

IMG 20210408 160102
Betrieb mit einer AAA Batterie, die ca. 1 Jahr lang hält

IMG 20210408 160122
Bastelfreundlicher Aufbau mit vorgebohrten Lötpunkten

IMG 20210408 160133
Oberseite mit Reed-Relais, Antenne und LED

 

Grundsätzliches:

Versuchen wir zu verstehen, wie diese Kontakte mit der günstigsten und einfachsten Lösung, einer Sonoff 433 MHz Bridge (Tasmota geflasht), überhaupt funktionieren.
Die Bridge empfängt nur Daten wie:

TFK Sonoff Empfang resized

18:58:56 MQT: tele/433-Bridge/RESULT = {"Time":"2021-04-01T18:58:56","RfReceived":{"Sync":14040,"Low":500,"High":1360,"Data":"44D00E","RfKey":"None"}}
18:58:57 MQT: tele/433-Bridge/RESULT = {"Time":"2021-04-01T18:58:57","RfReceived":{"Sync":13980,"Low":530,"High":1430,"Data":"44D00A","RfKey":"None"}}

Uns interessiert nur der übertragene Datensatz („Data“): „44D00E“
Davon sind die ersten vier Byte die ID des TFKs (Tür-Fenster-Kontakt). In diesem Falle „44D0“.
Der Status des Fensterkontaktes besteht aus den letzten beiden Bytes: „0E“.

Es gibt folgende Zustände:
0E = geschlossen
0A = offen
06 = Batterie leer

ID und ZUSTAND werden mit sechs Bytes übertragen:
IDIDZZ

Beispiel:

Die Bridge empfängt die Meldung 12340E, das bedeutet, dass der Fensterkontakt 1234 den Zustand 0E meldet. Das Fenster ist also geschlossen.
Mit mehr können und müssen wir gar nicht arbeiten.

 

Die Sonoff-Bridge konfigurieren

Wir ändern die IP-Adresse unseres Rechner zu 192.168.4.2 und verbinden uns mit dem WLAN des Sonoff-Adapters.
Wir öffnen dessen Webend unter 192.168.4.1 und stellen die Bridge so ein, dass sie sich mit unserem Netzwerk verbindet. –> Configure WIFI

TFK Sonoff WLAN resized
WLAN konfigurieren (Beispiel)

Nun stellen wir auf unserem Rechner wieder unsere alte IP-Adresse (oder DHCP) ein, warten einen Moment und schauen dann im Backend unseres Routers nach, welche IP-Adresse die Bridge zugewiesen bekommen hat.

Aus meiner Sicht kommen wir hier zu einem echten Design-Fehler, denn auf der Bridge können wir keine feste IP-Adresse eintragen!

Das müssen wir im Backend unseres Routers machen. Das variiert je nach Modell, da kann ich jetzt nicht helfen.
Zur Not geht es aber auch ohne, das macht Euer Netzwerk aber nicht übersichtlicher.

Nach der Installation von Tasmota weiß das Gerät nicht, was es ist. Wir klicken auf –> Configure Modul und stellen das wie folgt ein:

Sonoff Bridge Type resized
Modul Type: Sonoff Bridge (25), GPIOs brauchen wir hier nicht

Wieder zurück –> Configuration
Auf —> Configure MQTT

TFK Sonoff MQTT resized
Host: Die IP-Adresse Eures ioBrokers
Port: Den habe ich geändert, weil bei mir bereits der Stromzähler über diesen Port sendet, ich aber die eingehenden Daten der Bridge nur mit dem Sonoff-Adapter auslesen möchte.
Client: Erscheint als Name im ioBroker
User: Einen selber ausgedachten MQTT-User
Passwort: Ein selbst ausgedachtes MQTT-Passwort
Topic: Erscheint als Datenpunkt im ioBroker

Wir wechseln in ioBroker

Den Sonoff-Adapter installieren:

Im ioBroker gehen wir auf Adapter —> Filter und geben dort „Sonoff“ ein. Diesen Adapter über das Drei-Punkte-Symbol installieren.

TFK Sonoff Adapter installieren resized

Wir wechseln zu den Instanzen und klicken auf den Schraubenschlüssel bei Sonoff

TFK Sonoff Adapter Konfig resized
Hier geben wir den geänderten Port, den Namen und das Passwort unseres MQTT-Users ein, mit dem sich die Bridge anmelden möchte

Ist dies erledigt, finden wir unter —> Objekte den Adapter sonoff.0 und den Namen unserer Bridge als Datenpunkt mit Unterpunkten:

TFK Sonoff Objekt resized
Uns interessiert hier „ftReceived“ und darunter „Data“.
Bewegen wir den Magnet an unserem TFK, ändert sich der Wert von Data (letzte Spalte).
Das ist gut.

Eigene Devices erstellen:

ioBroker bietet uns die Möglichkeit eigene Devices zu erstellen. Davon machen wir Gebrauch.

Unter —> Objekte finden wir bereits einen angelegten Datenpunkt, nämlich „0_userdata.o“.
Unter diesem können wir weitere, eigene Datenpunkte erstellen.
Dazu klicken wir auf —> „0_userdata.o“ und dann auf das —> „+“-Symbol.

TFK neues geraet resized
Den ersten Datenpunkt, den wir anlegen, der bekommt den Typ „Gerät“ zugewiesen.

TFK Geraet erstellt resized
Diesen wählen wir durch einen Klick aus und fügen ihm mit dem „+“-Symbol einen Tochterdatenpunkt zu.

TFK Datenpunkt batterie resized
Den ersten nennen wir „Batterie leer“, er ist vom Typ her ein „Datenpunkt“ und bekommt als Datenpunkttyp „Logikwert“ zugewiesen.

TFK fertiges Device resized
Den zweiten Datenpunkt nennen wir „Fenster offen“, auch er ist ein Datenpunkt mit dem Typ Logikwert.

Warum haben wir als Datenpunkt quasi Fragen definiert? „Fenster offen?“ „Batterie leer?“
Weil der TFK nur diese Zustände sendet und wir diese gut mit einem Logikwert (true, false) abbilden können.

Skript erstellen

—> Scripte —> „+“ —> Blockly

TFK Blockly erstellen resized 1
Wir erstellen ein neues Blockly-Script
Das Script soll die Änderungen, die es von der Bridge empfängt in unsere oben erstellten Geräte als Zustände schreiben.
Irgendwie muss das Script a getriggert werden, wenn sich etwas bei der Bridge tut.

TFK Trigger resized
Anklicken: —> Trigger —> Falls Objekt – Objekt ID

Der Trigger wird in das Script eingefügt.
Die Objekt-ID ändern wir, indem wir sie anklicken. Es erscheint die Übersicht der Objekt. Wir suchen das Objekt sonoff.

TFK Blockly Datenpunkt Trigger resized2
Unter unserer Bridge —> RESULT —> RfReceived —> Data auswählen und OK anklicken.
„Falls Objekt ID – Objekt ID“ wird in diesen Datenpunkt geändert.

Falls sich also etwas ändert, wollen wir dies in zwei Variablen schreiben: ID sowie Zustand.
Wir benötigen als Erstes eine Fenster ID (oder wie immer Ihr sie nennen möchtet):
—> Variablen —> Variable erstellen —> „Fenster_ID“.

tfk Blockly Var Fenster ID resized
Fenster ID erstellen und „setze auf“ auswählen.

TFK Blockly setze Fenster ID resized
Falls sich beim Datenpunkt Data der Bridge etwas ändert, dann setze die Variable Fenster_ID auf… einen Teil des übermittelten Wertes.
Dazu brauchen wir —> Text“ —> „Im Text nimm…“

tfk blockly text ab resized
Dies ändern wir auf „nimm Teil ab erster“ „bis“ „Buchstabe“ und löschen dort die Variable „Text“. Sie wird durch einen —> Trigger ersetzt

TFK Blockly trigger objekt id resized
Wir wählen den Trigger —> „Objekt ID“

TFK Blockly text trigger wert resized
Und ändern ihn in „Wert“.
Nun haben wir einen Text mit dem Wert, des Datenpunktes „Data“. Von diesem brauchen wir nur die ersten vier Byte (Buchstaben in dem Falle) für unsere Fenster_ID

TFK Blockly Mathe Zahl resized
—> Mathematik —> Zahl

TFK Blockly Fenster ID vollstaendig resized
Die Zahl ändern wir auf „4“ und so wird die Variable Fenster_ID auf die ersten vier Buchstaben von „Data“ gesetzt. Prima! Fehlt nur noch der Zustand!

TFK Blockly Var Zustand resized
—> Variablen —> Variable erstellen —> „Zustand“. „Setze Zustand“ anklicken und auch in unsere Klammer „Falls Objekt“ hineinziehen.

Wir klicken unser grünes „im Text“ Puzzlestück an. Es wird gelb umrandet.
Strg-C, Strg-V, eine Kopie davon wird eingefügt
Wir lassen das neue Stück an „setze Zustand“ einrasten und ändern es wie folgt:

TFK Blockly Zustand vollstaendig resized
„Nimm Teil ab erster“ ändern wir in „nimm Teil ab“. Es erscheint ein Platzhalter für diese Zahl. —> Mathematik —> Zahl —> anklicken, in die Lücke ziehen und auf „5“ ändern.
Die bis-Zahl ändern wir auf „6“. Nun werden die Stellen 5 und 6, der Zustand aus „Data“, an die Variable „Zustand“ übergeben.

Somit haben wir den „Data“-Wert zerlegt und den Variablen „Fenster_ID“ und „Zustand“ zugewiesen.

Der Zustand für „Batterie leer“ wird bei neuen TFKs eher nicht übertragen. Trotzdem sollten wir ihn setzen, damit unsere erstellten Geräte einen ersten Zustand zugewiesen bekommen.
Keine Sorge, falls sich dieser Zustand ändern sollte, werden wir in den nächsten Schritten den tatsächlich gesendeten Zustand berücksichtigen.
Wir benötigen also noch die Variable „Batterie_leer“.

TFK Var Batterie leer resized
—> Variablen —> Variable erstellen —> „Batterie_leer“.

—> „setze Batterie_leer auf“ anklicken und in die Trigger-Klammer einfügen. Nur… diese Variable soll keine Zahl sein, sondern ein Logikwert.

TFK Blockly Batt Logik resized
Also —> Logik —> wahr anklicken und einrasten lassen

TFK Blockly Batt vollstaendig resized
Den Wert auf „falsch“ ändern, denn die Batterie ist nicht leer.

Nun müssen wir die Variablen füllen:
Wir benötigen dazu —> Logic —> „falls mache“:

falls mache resized
Auswählen

fals mache eingefuegt resized
In die Trigger-Klammer setzen

fals mache logik gleich resized
— Logik —> „ist wahr“ einfügen

falls mache wert resized
—> Text einfügen, mit „06“ (Batterie leer) definieren

fals mache zustand 06 resized
—> Variable „Zustand“ einfügen
Unter „mache“ setzen wir —> Variablen —> setze Batterie_leer einfügen

falls mache batt leer wahr resized
—Logik —> wahr/falsch einfügen und auf „wahr“ stellen.

sonst falls hinzu
Auf das Zahnradsymbol klicken

sonst falls
Zweimal „sonst falls“ nach rechts ziehen

sonst falls fenster offen resized
Das erste logisch „ist wahr“ von „falls“ kopieren und bei „sonst falls“ einsetzen. Textfeld auf „0A“ (offen) ändern.

neue variable fenster offen resized
—Variablen —> Variable erstellen —> „Fenster_offen“

fenster offen resized
—> Variablen —> „setze Fenster_offen auf“ einfügen,
—> Logik —> „wahr“ anhängen

fenster offen fertig
Logikwert und Variable der Einfachheit halber wieder kopieren und am zweiten „sonst falls“ anhängen.
Textfeld auf „0E“ ändern, Logikwert auf „falsch“

Nun sind alle Variablen definiert und werden mit Daten gefüllt. Diese Variablen müssen nun in die Datenpunkte „Batterie_leer“ und „Fenster_offen“ der passenden eigenen Geräten kopiert werden.

Zustände zum Gerät übertragen

der fall ist resized
—> Logik —> „Der Fall ist…“
In die Trigger-Klammer ziehen.
—> Variablen —> „Fenster_ID“ einfügen

fenster id abfragen resized
—> Text —> „Text“ einfügen

SPÄTESTENS JETZT DAS SKRIPT SPEICHERN!

id kopieren resized
Zurück in die Objektliste wechseln.

Fensterkontakte anlernen

Den Magneten an den gewünschten Fensterkontakt halten (oder das Fenster eben öffnen oder schließen).
Unter sonoff.0 den gerade empfangenen Data-Wert mit dem Kopier-Symbol kopieren.

Fensterkontakte
Diesen Wert einfach in das Textfeld einfügen.

im falle von copy gekueruzt resized
Die letzten beiden Stellen (den Zustand) löschen. Wir haben nun eine Abfrage zu diesem Fensterkontakt.

aktualisiere objekt resized
Unter „machen“ benötigen wir —> System —> „aktualisiere Objekt ID“

aktualisiere eingefuegt resized
Wir klicken auf „Object ID“ und wähler in der sich nun öffnenden Übsersicht der Objekte:

batterieleer resized
Den Datenpunkt „Batterie_leer“ unseres Fensterkontaktes

batterieleer ausgewaehlt resized
—> Variablen —> „Batterie_leer“ einfügen.

batterileer kopiert resized
Und gleich den Block kopieren und einfügen.

Auf die Objekt ID „Batterie leer“ klicken und es öffnet sich die Übersicht.

objekt fenster offen resized
Das Objekt „Fenster offen“ auswählen.

fertig resized
In die „der Fall ist“-Klammer ziehen, Variable auf „Fenster offen“ ändern.

aktualisiere objekt resized
—> System —> Kommentar

kommentar resized
Diesen Kommentar über „der Fall ist“ ziehen und mit einem sprechenden Namen versehen, damit wir wissen, dass der Block darunter die Daten exakt dieses TFK enthält.

Wir starten unser Script und sehen…

noch leer resized 1
Die Datenpunkte sind orange, das bedeutet, dass noch keine Daten verarbeitet wurden.

Jetzt schliessen wir das Fenster (oder legen den Magneten auf den TFK).

laeuft resized2
Die Werte werden grün und unser Script hat perfekt gearbeitet.

Wir öffnen das Fenster und…

fenster zu resized
Fenster_offen wird wahr (true). Auch das läuft.

Weitere Fensterkontakte können wir nun sehr einfach hinzufügen, indem wir den ganzen Block kopieren und wieder unten einfügen:

noch ein kontakt resized
Folgendes muss angepasst werden:
Textfeld (ID des TFK)
„Batterie leer“-Objekt ID auf die des neu angelegten Gerätes „Ganz neuer Fensterkontakt“
„Fenster offen“-Objekt ID auf die des neu angelegten Gerätes „Ganz neuer Fensterkontakt“

Hinweise
  1. Werbung[][]

13 Gedanken zu „Fensterkontakte in ioBroker integrieren“

  1. Hallo, alles gut erklärt und mein Skript läuft auch. Aber meine Fenster-Kontakte lösen auch aus ohne dass diese zusätzlich im Skript eingefügt sind. Dies ist sicher nicht ganz so richtig. Verwende dieselbe Bridge und dieselben Kontakte. Vielleicht gibt es eine Idee dazu?
    Viele Grüße Uwe

    Antworten
      • Also ich bin ein Anfänger mit Blockly, deshalb habe ich auch Dein Skript verwendet.
        Der FK schaltet eine Leuchte, diese Leuchte soll ebenso von weiteren FK ebenso geschaltet werden. Also habe ich Dein Skript dahingehend weitergeführt, wie Du auch geschrieben hast (bin zumindest der Ansicht).

        Ich füge mal dazu etwas ein:

        var T_C3_BCr_ID, Zustand, Batterie_leer, T_C3_BCr_offen;

        on({id: ’sonoff.0.SonoffBridge.RESULT.RfReceived.Data‘, change: „ne“}, async function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        T_C3_BCr_ID = (obj.state ? obj.state.val : „“).slice(0, 4);
        Zustand = (obj.state ? obj.state.val : „“).slice(4, 6);
        Batterie_leer = false;
        if (Zustand == ’06‘) {
        Batterie_leer = true;
        } else if (Zustand == ‚0A‘) {
        T_C3_BCr_offen = true;
        } else if (Zustand == ‚0E‘) {
        T_C3_BCr_offen = false;
        }
        // Haustürkontakt

        switch (T_C3_BCr_ID) {
        case ‚0BA1‘:
        setState(„0_userdata.0.Türkontakt.Batterie_leer“/*Batterie leer*/, Batterie_leer, true);
        setState(„0_userdata.0.Türkontakt.Tür_offen“/*Tür offen*/, T_C3_BCr_offen, true);

        break;
        }
        // FKTerrasseMitte

        switch (T_C3_BCr_ID) {
        case ‚378E‘:
        setState(„0_userdata.0.Türkontakt.Batterie_leer“/*Batterie leer*/, Batterie_leer, true);
        setState(„0_userdata.0.Türkontakt.Tür_offen“/*Tür offen*/, T_C3_BCr_offen, true);

        break;

        Antworten
        • Okay, ich denke, dass die Kommentarfunktion einer Website kein Forum ersetzen kann. Ein wenig helfen kann ich ja, aber viel schneller wird Dir garantiert im Forum geholfen:
          https://forum.iobroker.net/category/94/blockly
          Ich kann nicht nachvollziehen, warum Dein Script beim Öffnen JEDES Fensters reagiert.

          Ich habe aktuell auch keinen IOBroker am Start, um das gegenzuchecken, da ich den vor einigen Tagen aus Dummheit neu installierte und das Backup noch nicht wieder eingespielt habe. Einfach zu viel andere Dinge um die Ohren. 🙁

          Antworten
  2. Hallo, mit großem Interesse habe ich deinen Artikel gelesen. Ich bin absoluter Beginner bei iobroker und einem smarthome. Ich habe Fensterkontakte die mit 868 Mhz arbeiten. Hast du eine Idee wie ich solche Werte abfragen kann??

    Antworten
  3. Guten Tag,

    könnt ihr das Skript/Blockly ggf als XML bereitstellen, so dass man es ggf. in iobroker direkt importieren kann?

    Besten Dank & frohes neues Jahr

    Antworten

Schreibe einen Kommentar

Ich bin mit der Datenschutzerklärung und der Speicherung meiner eingegebenen Daten einverstanden.