MQTT – I2C – Bridge

Vielen Dank für diesen Beitrag an Thomas Plorin

Viele Homeautomationslösungen bieten Connectoren für MQTT. MQTT oder Message Queuing Telemetry Transport ist ein offenes Nachrichtenprotokoll für M2M (Machine-to-Machine) Kommunikation. Die Informationen werden als Nachrichten über sogenannte „Topics“ verschickt. Ein „Topic“ besteht aus einer Zeichenkette getrennt durch „/“. Ein Interessent von Nachrichten, kann sich am MQTT-Server einloggen und sich für bestimmte Topics anmelden. Kommt es zu Nachrichten auf diesen Topics, verteilt der Server diese an die interessierten Clients. Ebenso kann ein Client auf verschiedenen Topics Nachrichten verschicken.

Ich selbst nutze derzeit Node-RED als Homeautomationslösung. Diese bietet zwar auch Nodes für I2C. Diese habe ich aber in einer passablen Zeit nicht zur Laufen bekommen, so dass ich anfing mir selbst etwas zu überlegen. Desweiteren gefiel mir nicht so gut, dass die Automationslösung damit sehr nahe an der verwendeten Hardware gekoppelt wäre. Dies macht ein Wechsel von Hard- bzw. Software immer sehr schwierig. Aus diesem Grund wollte ich das Hardwaresystem möglichst unabhängig von der Automationssoftware halten und habe mich entschieden, selbst etwas umzusetzen. Eine „Brücke“ zwischen „I2C“ und „MQTT“.

Im Folgenden möchte ich die Einrichtung und Funktionsweise kurz erklären. Wen es genauer interessiert, kann sich auf gitlab den Source-Code anschauen. Verbesserungsvorschläge werden immer gern genommen. Gerne könnt Ihr auch einen Fork der Sourcen erstellen und mir Pull-Request zukommen lassen.

 

Vorbereitungen

Die Hardware besteht aus folgenden Komponenten:

IO-Hardware für MQTT

 

Installation Mosquitto

Als aller erstes brauchen wir einen Message-Broker zum Verteilen der MQTT-Nachrichten. Dieser kann einfach über den Paket Manager auf dem Raspberry PI installiert werden.

sudo apt-get install mosquitto

Anschließend startet man den PI neu oder startet mosquitto manuell durch folgenden Befehl:

/etc/init.d/mosquitto start

 

Installation MQTT.Fx

Um das Setup zu überprüfen empfiehlt sich ein MQTT-Client mit GUI. Ein auf Java-basiertes Programm ist MQTT.FX. Nach dem Download und Start des Programmes, legt man ein neues Profil an. In diesem hinterlegt man die IP-Adresse des Systems, auf dem mosquitto installiert wurde. Man vergibt einen sprechenden Namen. Alles andere kann man erstmal auf Standardeinstellungen lassen.

MQTT - Broker Settings

Nach Klick auf OK und „Connect“ im Hauptfenster sollten wir mit dem MQTT-Broker verbunden sein. Als kleinen Test abonnieren wir uns auf dem Subscribe-Tab ein Topic, an welches wir anschließend über den Publish-Tab eine Nachricht verschicken.

Wir abonnieren im Subscribe-Tab den Topic „test“:

MQTT - Erster Test

Dann senden wir auf diesem Topic im Publish-Tab den Payload „Hallo Welt“:

MQTT - Hallo Wlet

Der dann (hoffentlich) auf dem Subscribe-Tab, in dem unteren rechten Bereich, ankommt.

MQTT - Erster Test

Ist unten rechts, in dem schwarzen Bereich mit weißer Schrift „Hallo Welt“ zu sehen, ist das Setup erledigt.

 

i2c-mqtt-bridge-server

Voraussetzung

Ich gehe an dieser Stelle davon aus, dass alle Verbindungen richtig gesteckt sind und man sein Setup mittels der Linux – Tools i2cdetect und i2cset bzw. i2cget überprüft hat. Die Jumper sind richtig gesteckt und die Adressen der IO-Karten sind bekannt. (siehe auch hier)

Installation

Als erstes brauchen wir die GPIO-Interface-Library für den Raspberry PI

sudo apt-get install wiringpi

Anschließend brauchen wir eine Java-Laufzeitumgebung.

sudo apt-get install oracle-java8-jdk

Anschließend hier die aktuelle Version herunterladen.

In dem heruntergeladenen Archiv sind mehrere Jars enthalten. Für die Raspberry PI Version bitte die JAR mit linux im Namen nutzen.

Speziellen User für die Ausführung anlegen

sudo useradd i2cmqtt
sudo passwd i2cmqtt

(Das Passwort spielt hierbei keine Rolle, es sollte aber dennoch nicht leicht zu erraten sein)

User den notwendigen Gruppen hinzufügen „gpio“ und „i2c“

sudo adduser i2cmqtt gpio
sudo adduser i2cmqtt i2c

Die Jar – Datei aus dem ZIP-File an den Installationsort kopieren, z.B.: /opt/i2c-mqtt-server

sudo mkdir /opt/i2c-mqtt-server
sudo cp i2c-mqtt-server-linux-<version>-runnable.jar /opt/i2c-mqtt-server/i2c-mqtt-server-linux.jar

Konfiguration

Dann muss eine Konfigurationsdatei (app.properties) parallel zur JAR angelegt werden. Eine Beispieldatei kann auch vom gitlab-Repository heruntergeladen werden.

wget https://gitlab.com/thomas.plorin/i2c-mqtt/raw/master/i2c-mqtt-server/src/main/resources/app.properties

In der Datei sind dann die Einstellungen für das eigene Setup anzupassen. Das wichtigste hierbei ist die Anpassung von

mqtt.server=<Hier die <IP>:<Port>
(Port ist in der Regel 1883) des mosquitto Servers eintragen>

Der Busname sollte so gelassen werden, wenn man keine besondere Konfiguration für den I2C Bus am Raspberry PI vorgenommen hat.

i2c.busname=bus_1

Definition der vorhandenen Hardware:

i2c.devices=<Komma separierte Liste der angeschlossenen Devices>

Ein Eintrag der Liste setzt sich folgendermaßen zusammen:

<i2cDeviceName>:<name>:<address>:<input|output>:<inverted>

i2cDeviceName = Bis jetzt gibt es nur pcf8574 😉
name = Der Name des Devices für den MQTT-Topic
address = die Hardwareadresse des Chips in Hexadezimalschreibweise
input|output = Über diese beiden Values wird definiert, ob die Karte als Input oder Output arbeiten soll
inverted = true, wenn die Ein/Ausgänge invertierend arbeiten

Die Beispieldefinition der Devices aus der „app.properties“ von gitlab sieht so aus:

i2c.devices=pcf8574:testInput:0x38:input:true,pcf8574:testOutput:0x68:output:true

Sie definiert zwei pcf8574 Devices:

  • den ersten als Input-Device,
    mit dem Namen „testInput“, an der Adresse 0x38,
    mit invertierten Eingängen
  • den zweiten als Output-Device,
    mit dem Namen „testOutput“, an der Adresse 0x68,
    mit invertierten Ausgängen

Weitere Devices können getrennt durch Komma hinzugefügt werden. Der genaue Syntax ist in der Beispiel app.properties beschrieben.

 

Die Berechtigungen müssen jetzt noch korrigiert werden

sudo chown -R i2cmqtt:i2cmqtt /opt/i2c-mqtt-server
sudo chmod 500 /opt/i2c-mqtt-server/i2c-mqtt-server-linux.jar
sudo chmod 400 /opt/i2c-mqtt-server/app.properties

JAR-File als Linux Service einrichten

cd /opt/i2c-mqtt-server
sudo ln -s /opt/i2c-mqtt-server/i2c-mqtt-server-linux.jar /etc/init.d/i2c-mqtt-server
sudo update-rc.d i2c-mqtt-server defaults

Den Status des Services prüfen

(Im Moment sollte dort noch „Not running“ angezeigt werden)

sudo service i2c-mqtt-server status

Start des Programms

sudo service i2c-mqtt-server start

Sollte es zu Problemen kommen, ist das LOG die erste Anlaufstelle:

sudo tail -f /var/log/i2c-mqtt-server.log

Funktionsweise

Durch dieses Setup „Published“ das Input-Device auf folgendem Topic die Eingangsänderungen:

i2c/input/testInput/[1-8]/STAT

Die Ausgangsplatine „lauscht“ auf folgendem Topic, um die Ausgänge schalten zu können.

i2c/output/testOutput/[1-8]/POWER

Der Payload ist hierbei entweder „ON“ oder „OFF“.

Geht z.B. der Eingang 4 auf High, dann wird auf dem Topic:

i2c/input/testInput/4/STAT

der Payload

ON

MQTT - Erster Test

Das „+“ in dem Screenshot ist ein Wildcard. D.h. was in diesem Teil des Topics steht, spielt keine Rolle. Ein Client reagiert damit auf alle Messages von allen Eingängen der Eingabeplatine mit dem Namen „testInput“.

Möchte man z.B. den Ausgang 6 einschalten, dann muss eine Nachricht mit dem Payload „ON“ an folgenden Topic gesendet werden:

i2c/output/testOuput/6/POWER

MQTT - Erster Test

 

 

 

 

 

Nach dem Klick auf „Publish“ sollte bei der Ausgangplatine, der Ausgang 6 auf High gehen.

 

Zusammenfassung

Mit dieser Brücke zwischen I2C-Bus und MQTT-Messaging ist es möglich, IO-Änderungen von den I2C Platinen in MQTT-Messages zu „konvertieren“ und somit, losgelöst von der Hardware, in der jeweiligen Automationslösung zu nutzen. Weitere Platinen können einfach hinzugesteckt, am System konfiguriert und genutzt werden. Das Setup ist vergleichsweise einfach und lässt sich schnell wiederherstellen. 

 

 

 

 

Speichere in deinen Favoriten diesen permalink.

8 Kommentare

  1. Tobias Friedrich

    Hallo,
    Hat jemand schon versucht einen langen Tasten „longpress“ auszuwerten? Damit man zum beispiel Licht am Lichtschalter per „longpress“ dimmen kann?
    Danke

    • Das muss mit der Software gemacht werden, die die MQTT-Messages auswertet. (Bei mir z.B. nodered.) Da kann man dann einen Flow erzeugen, der die Zeit zw. „steigender“ Flanke („ON“) und fallende Flanke („OFF“) misst und es dementsprechend auswertet. Die MQTT-I2C-Bridge selber, mappt nur die i2c Status in MQTT-Messages.

      • Tobias Friedrich

        Wenn ich sie richtig verstehe muss ich die Eingangskarten z.B. sekündlich abfragen und dabei festellen, welcher Eingang eine steigende oder fallende Flanke hat. Bisher Werte ich die Karten nur nach einem „Interrupt“ neu aus und bekomme in Fhem nur ein „on“ oder „off“ zurück.

        • Mqqt ist ein publish / subscriber Protokoll. D.h sie bekommen bei Änderung einen Event. Wie es in fhem ist, weiß ich selber nicht so genau. Nutzen sie überhaupt diese i2c mqtt Bridge oder rufen sie mit fhem irgendwie direkt den i2c Bus ab?

  2. Die Version 1.1.2 ist auf dem pi des i1c-mqtt-bridge-server im Einsatz; die Verbindung zum mqtt-broker auf einem loxberry pi kann nun mit login und password aufgebaut werden.
    Die Schaltzustände der Horter Baugruppe I2EOK werden sauber zum mqtt-broker published.
    Ich werde meine Test-Installation in Richtung Loxone nun weiter vervollständigen und dann einen weiteren Status hier melden.

    Danke für die prompte Unterstützung.

  3. ich habe eine Installation mit getrennten PI’s für den Mqtt Message Broker und den i2c-mqtt-bridge-server vorbereitet.

    ich suche nun wie in im 2c-mqtt-bridge-server in der app.properties die Anmelde-Daten für den Mqtt-Message Broker hinterlegt werden kann.

    Kann mir jemand einen Tipp geben, ob bei dem 2c-mqtt-bridge-server ein remote-login an den Mqtt Message Broker implementiert ist und wie die Properties in der Datei app.properties zu setzen sind.

    Vielen Dank

    • Derzeit wird MQTT nur ohne Login unterstützt. Sollte aber nicht so aufwendig sein es zu integrieren. Werde es mit bei zeiten anschauen, wird aber vermutlich ein wenig dauern. SSL Verschlüsselung ist auch noch nicht integriert. Sollte vermutlich mit offiziellen Zertifikaten funktionierten oder wenn man in den Java-TrustStore die eigenen Zertifikate importiert. Ist aber derzeit auch ungetestet.

Schreibe einen Kommentar

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