(FHEM) MQTT

Aus TippvomTibb
Zur Navigation springen Zur Suche springen

Allgemeines

Eigentlich bin euphorisch gestartet. Die MQTT-Kommunikation zwischen den (Mikrocontroller-)CLients und Mosquitto klappte perfekt und nun ging es um die Integration in FHEM. Und dann fingen die Probleme an. Das Beschriebene oft veraltet, Infos ueber Foren verteilt und und und ... Schade.

Erst mal alle die Lage checken.

Google Suche: MQTT OR mqtt site:fhem.de

13.330 Ergebnisse! Ich bin erstaunt. Dann mal differenzierter.

MQTT OR mqtt site:wiki.fhem.de
MQTT OR mqtt site:forum.fhem.de

89:12900

MQTT OR mqtt site:fhem.de -site:wiki.fhem.de -site:forum.fhem.de

0

Wo jetzt die restlichen 13330 - 12900 - 89 noch stecken habe ich keine Ahnung.

Aber bringe ich erstmal Ordnung in die 89 Wiki-Ergebnisse (https://wiki.fhem.de/wiki/Spezial:Alle_Seiten) rein.

  • MQTT (erstellt: 16.11.2018 bearbeitet: 22.06.2020)
  • MQTT2-Module - Praxisbeispiele (erstellt: 2.11.2018 bearbeitet: 19.07.2022)
  • MQTT2 CLIENT (erstellt: 23.01.2019 bearbeitet: 20.05.2022)
  • MQTT2 DEVICE (erstellt: 23.01.2019 bearbeitet: 12.01.2022)
  • MQTT2 DEVICE - Schritt für Schritt (erstellt: 10.01.2022 bearbeitet: 13.04.2022)
  • MQTT (Modul) (erstellt: 28.03.2018 bearbeitet: 30.09.2021)
  • MQTT DEVICE (erstellt: 28.03.2018 bearbeitet: 18.11.2018)
  • MQTT Einführung (erstellt: 21.03.2019 bearbeitet: 20.09.2021)
  • MQTT Einführung Teil 2 (erstellt: 27.03.2017 bearbeitet: 23.11.2018)
  • MQTT Einführung Teil 3 (erstellt: 01.04.2017 bearbeitet: 23.11.2018)
  • MQTT GENERIC BRIDGE (erstellt: 28.01.2021 bearbeitet: 31.05.2022)
  • EBUS-MQTT2
  • IR-MQTT-Gateway

Ob sich alle Suchergebnisse auf diese 13 Seiten verteilen wird sich zeigen.

https://fhem.de/commandref.html#MQTT2_SERVER https://fhem.de/commandref.html#MQTT_GENERIC_BRIDGE ...

Inspektion

Was zu Beginn auffaellt und oft thematisiert und auch oft fuer Verwirrung sorgt ist die Unterscheidung MQTT und MQTT2. Was man gut an den Bearbeitungszeiten ablesen kann ist, dass es 2018/2019 einen Wechsel von MQTT nach MQTT2 gab.

find /opt/fhem -type f -exec grep -l mqtt {} \; > mqtt_filelist.txt
for file in $(cat mqtt_filelist.txt); do ll $file;  done;

Versionsänderungen bis 6.0 vom 26.01.2020:

- change:  dummy/MQTT2_DEVICE/ZWave: setExtensionsEvent attr (Forum #95581)
- feature: mqtt2.template: A_00_MQTT2_CLIENT_general_bridge revised for better
 - feature: 00_10_MQTT2_CLIENT added (Forum #92888)
 - new:     10_MQTT_GENERIC_BRIDGE an MQTT bridge, which simultaneously
            their readings via MQTT or set readings from
            the incoming MQTT messages or executes them
 - added:   00_MQTT: ability for client notifications: on connect,
 - fixed:   00_MQTT: failure on handling with mqtt-devices without
 - change:  maintainer change for 00_MQTT, 10_MQTT_DEVICE, 10_MQTT_BRIDGE
 - new:     00_MQTT2_SERVER / 10_MQTT2_DEVICE
 - bugfix:  00_MQTT: topics and payload patch
 - feature: 00_MQTT: topic with space or colon
 - feature: 10_MQTT_DEVICE: add SetExtensions
 - bugfix:  00_MQTT: small bugfix
 - feature: 00_MQTT: new attribute "client-id"
 - bugfix: 31_Nello: updated MQTT IP
 - bugfix:  10_MQTT_DEVICE: fix set arguments
 - bugfix:  10_MQTT_BRIDGE: fix comandref $device
 - bugfix:  00_MQTT: fix event-on-change Reading
 - bugfix:  00_MQTT: fix Undef
 - bugfix:  00_MQTT: added delete
 - feature: 00_MQTT: OnMessageFn, last-will, onConnect/onDisconnect
 - feature: 10_MQTT_DEVICE: improved publishSet, retain, subscribeReadings
 - feature: 10_MQTT_BRIDGE: improved retain, subscribeSet
 - bugfix:  MQTT: undef patch
 - bugfix:  MQTT_DEVICE: publishSet patch (Forum #msg648963)
 - feature: MQTT_DEVICE: publishSet patch (Forum #msg648596)
 - bufix:   00_MQTT: fixed delete MQTT_DEVICE
 - bufix:   00_MQTT: fixed delete MQTT device
 - feature: 00_MQTT: Added username password (optional).
 - added: MQTT: connect fhem with mqtt
 - added: MQTT_BRIDGE: bidirectional mapping of existing fhem-device to
 - added: MQTT_DEVICE: fhem-device that can be controlled by and publishes to

MQTT steckt in FHEM anfolgenden Stellen drin:

-rw-rw-r-- 1 501 20 50419 26. Jan 2020  ./FHEM/lib/AttrTemplate/httpmod.template
-rw-rw-r-- 1 501 20 157694 26. Jan 2020  ./FHEM/lib/AttrTemplate/mqtt2.template
-rw-rw-r-- 1 501 20 1078 26. Jan 2020  ./FHEM/lib/Net/MQTT.pod
-rw-rw-r-- 1 501 20 5874 26. Jan 2020  ./FHEM/lib/Net/MQTT/Message.pm
-rw-rw-r-- 1 501 20 11022 26. Jan 2020  ./FHEM/10_MQTT_BRIDGE.pm
-rw-rw-r-- 1 501 20 32299 26. Jan 2020  ./FHEM/10_MQTT2_DEVICE.pm
-rw-rw-r-- 1 501 20 19950 26. Jan 2020  ./FHEM/00_MQTT2_SERVER.pm
-rw-rw-r-- 1 501 20 167185 26. Jan 2020  ./FHEM/10_MQTT_GENERIC_BRIDGE.pm
-rw-rw-r-- 1 501 20 17653 26. Jan 2020  ./FHEM/00_MQTT2_CLIENT.pm
-rw-rw-r-- 1 501 20 22207 26. Jan 2020  ./FHEM/31_Nello.pm
-rw-rw-r-- 1 501 20 31183 26. Jan 2020  ./FHEM/00_MQTT.pm
-rw-rw-r-- 1 501 20 13548 26. Jan 2020  ./FHEM/10_MQTT_DEVICE.pm

-rw-rw-r-- 1 501 20 1636 26. Jan 2020  ./contrib/AttrTemplate/99_attrTmqtt2_ebus_Utils.pm
-rw-rw-r-- 1 501 20 48673 26. Jan 2020  ./contrib/AttrTemplate/mqtt2.ebus.template
-rw-rw-r-- 1 501 20 1804 26. Jan 2020  ./contrib/AttrTemplate/99_attrTmqtt2_roborock_Utils.pm

Irgendwie faellt mir gerade auf, dass mein fhemuser und fhemgroup nicht mehr da sind.

Bei der Liste der beteiligten Dateien fallen ein paar aus dem Rahmen (.pm).

  • .template: AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen. Der Befehl attrTemplate ist in einer Vielzahl von Modulen verfuegbar.
  • .pod: Plain Old Documenation Ist eine Dokumentationsmethode in Perl [1]


Hindernisse/Hinweise

#1

Der mosquitto-Server (Broker) akzeptiert nur Clients vom gleichen Rechner. Also mosquitto_sub und _pub bei der Option -h nur die Parameter localhost oder 127.0.0.1. Beim Starten des mosquitto-Servers wird dieser Umstand auch angezeigt.

1660112143: mosquitto version 2.0.10 starting
1660112143: Using default config.
1660112143: Starting in local only mode. Connections will only be possible from clients running on this machine.
1660112143: Create a configuration file which defines a listener to allow remote access.
1660112143: For more details see https://mosquitto.org/documentation/authentication-methods/
1660112143: Opening ipv4 listen socket on port 1883.
1660112143: Opening ipv6 listen socket on port 1883.
1660112143: mosquitto version 2.0.10 running

Man erhaelt bei den Client-Tools mosquitto_pub und _sub dann folgende Fehlermeldung:

Error: Connection refused

Ein weiterer Umstand in diesem Zusammenhang sei noch erwaehnt.

1660112254: New connection from 127.0.0.1:32814 on port 1883.
1660112254: New client connected from 127.0.0.1:32814 as auto-89A987EC-CDDE-E8DD-2076-F349660FFBB3 (p2, c1, k60).
...
1660112294: New connection from ::1:43544 on port 1883.
1660112294: New client connected from ::1:43544 as auto-337B003C-4BF1-AE40-F6BF-7947F459511B (p2, c1, k60).

Bei der Verwendung von localhost bei der Kontaktaufnahme mit mosquitto (-h) wird die IPv6-Adresse verwendet.

#2

Hinweis #1 ist noch weitreichender wenn man den Zugriff von "auszerhalb" freigeben, bzw. teilweise einschraenken moechte. Im Abschnitt Security der mosquitto.conf findet man:

clientid_prefix

Wenn festgelegt, koennen nur Clients, die ein übereinstimmendes Präfix in Ihrer ClientID fuehren, sich mit dem Broker verbinden. Standardmaeßig: Alle Clients koennen eine Verbindung herstellen. Zum Beispiel wuerde die Einstellung von "secure-" hier bedeuten, dass ein Client "secure-client" eine Verbindung herstellen koennte, ein anderer mit clientid "mqtt" jedoch nicht.

allow_anonymous

Standardmäßig ist false festgelegt, es sei denn, in der Konfigurationsdatei sind keine Listener definiert. In diesem Fall ist sie auf true festgelegt, aber Verbindungen sind nur vom lokalen Computer aus zulässig.

D.h. erst mit Anlegen eines Listener-Eintrags wird allow_anonymous aktiv.

und

listener

listener port-number [ip address/host name/unix socket path]

Der mosquitto-Server hoert damit auf einer entsprechenden port-nummer (obligatorisch) und einer IP-Adresse, einem Hostnamen oder einem Unix-Socket (optional). Die Option listener kann mehrfach eingerichtet werden. Wenn diese Variable verwendet wird und weder bind_address noch Port angegeben ist, wird der Standardlistener nicht gestartet. Listener hoert standardmaeszig auf alle Interfaces nicht aber einzelne Hosts oder auch (Sub-)Netze. Dies muss ueber die Firewall geregelt werden.

#3

Die Verbindung von mosquitto_pub beim Senden einer Nachricht fuehrt beim mosquitto-Server zu einem Connect und nach dem Uebertagen der Nachricht zu einem Disconnect. Beim der Verwendung von mosquitto_sub bleibt die Verbindung bestehen. Nach einem Connect folgt also kein Disconnect. Erst beim Beenden von mosquitto_sub erfolgt ein Disconnect. Wird waehrend der Verbindung eines Subcribers der mosquitto-Server neu gestartet wird der Subscriber automatisch wieder connected. mosquitto_sub muss also nicht neu gestartet werden.

#4

Beim Starten des mosquitto-Server unbedingt die gewuenschte Config mit der Option -c angeben.

Module im Detail

Dateiname Modul Kurzbeschreibung Dateigroesze (V6.0) Codezeilen (V6.0) Maintainer
00_MQTT.pm fhem Verbindung (bridge) zu einem MQTT-Server (Broker) 30,5 KiB 958 Codezeilen 2019-02-24 20:20:51Z hexenmeister
00_MQTT2_SERVER.pm Standalone MQTT message broker (ist der alte Name fuer Server) 19,5 KiB 565 Codezeilen 2019-11-04 10:37:40Z rudolfkoenig
00_MQTT2_CLIENT.pm Verbindung zu einem externen MQTT Server 17,2 KiB 488 Codezeilen 2019-09-17 16:25:01Z rudolfkoenig
10_MQTT_DEVICE.pm Ein physikalischen Device mit MQTT-Unterstuetzung wird in FHEM als Device eingebunden. 13,2 KiB 258 Codezeilen 2018-09-17 12:57:29Z hexenmeister
10_MQTT2_DEVICE.pm Ueber den MQTT2_SERVER oder MQTT2_CLIENT kommunizierende Geraete 31,5 KiB 804 Codezeilen 2020-01-13 17:02:05Z rudolfkoenig
10_MQTT_BRIDGE.pm
seit fhem V6.1 veraltet
MQTT_BRIDGE dient/agiert also als Bruecke (bridge) zwischen einem bestehenden fhem-Device und macht es ueber anzulegende MQTT-Topics "MQTT-faehig". 10,8 KiB 217 Codezeilen 2018-09-17 12:57:29Z hexenmeister
10_MQTT_GENERIC_BRIDGE.pm MQTT_BRIDGE dient/agiert also als Bruecke (bridge) zwischen allen bestehenden fhem-Device und macht es ueber anzulegende MQTT-Topics "MQTT-faehig". 163,3 KiB 2884 Codezeilen 2019-06-28 15:56:35Z hexenmeister (Alexander Schulz)

Neben message.pm befinden sich noch weitere Dateien in /opt/fhem-6.0/FHEM/lib/Net/MQTT/.

Dateiname eines FHEM-Moduls
Ein FHEM-Modul wird als Perl-Modul mit der Dateiendung *.pm abgespeichert. Der Dateiname folgt dabei folgendem Schema:
   [Schlüsselnummer]_[Modulname].pm
   Schlüsselnummer - Eine zweistellige Zahl zwischen 00 - 99. Die Schlüsselnummer hat aktuell keine technische Relevanz mehr. In früheren FHEM-Versionen ist sie relevant für zweistufige Module (Reihenfolge für Dispatch() um logische Module zu prüfen). Die allgemeine Empfehlung ist hierbei eine Schlüsselnummer eines Moduls zu verwenden, welches eine ähnliche Funktionalität bietet. Die Schlüsselnummer 99 hat hierbei eine besondere Bedeutung, da alle Module mit dieser Schlüsselnummer beim Start von FHEM automatisch geladen werden, selbst, wenn sie in der Konfiguration nicht verwendet werden. Daher wird für myUtils 99 als Schlüsselnummer verwendet (99_myUtils.pm). Module mit der Schlüsselnummer 99 werden im SVN nicht akzeptiert (siehe SVN Nutzungsregeln)
   Modulname - Der Name des Moduls wie er in FHEM bei dem Anlegen einer Gerätedefinition zu verwenden ist. Der Modulname sollte nur aus den folgenden möglichen Zeichen bestehen: Groß-/Kleinbuchstaben, Zahlen sowie Unterstrich (_)

Der offensichtlichste Unterschied zwischen MQTT- und MQTT2-Modulen ist die Herkunft. Wie aus der o.g. Tabelle zu lesen ist, werden die MQTT_Module von hexemeister und die MQTT2-Module von rudolgfkoenig unterhalten.

MQTT_DEVICE wird verwendet, wenn das physikalische Device (Sensor oder Aktor) über mqtt kommuniziert. Es ist Kein dummy-Device mehr nötig! MQTT_DEVICE agiert als ein fhem-device das mqtt-topics 'gemapt' hat.
MQTT_BRIDGE ist für den Fall, dass ein fhem-device existiert und dieses über mqtt sicht- bzw. steuerbar gemacht werden soll. MQTT_BRIDGE dient/agiert also als Bruecke (bridge) zwischen einem bestehenden fhem-Device und macht es ueber anzulegende MQTT-Topics "MQTT-faehig".


Die Inhalte der Commandref sind aus dem 'Pidgin-English' auf deutsch uebersetzt und ggf. durch mich ergaenzt. Die MQTT-Module (nicht MQTT2) sind in einem FHEM-Forumsbeitrag am 01. Oktober 2014 veroeffentlicht und beschrieben worden.

00_MQTT.pm

[Zurueck Uebersicht] [Erlaeuterung, Anwendung und Beispiele]

Ein einzelnes MQTT-Gerät kann mehrere MQTT_DEVICE, MQTT_GENERIC_BRIDGE Clients und (veraltete) MQTT_BRIDGE Clients bedienen.  Jedes MQTT_DEVICE fungiert als Brücke zwischen einem Fhem-Gerät und mqtt. 
Hinweis: Dieses Modul basiert auf Net::MQTT, das zuerst von CPAN installiert werden muss.

Define

define <name> MQTT <ip:port> [<username>] [<password>]

Set

set <name> connect
set <name> disconnect
set <name> publish [qos:?] [retain:?] <topic> <message>

Get

 

Readings

  

Attributes

keep-alive
attr <name> last-will [qos:?] [retain:?] <topic> <message>
attr <name> client-id client id
on-connect, on-disconnect
on-timeout

00_MQTT2_SERVER

Zurueck Uebersicht [Erlaeuterung, Anwendung und Beispiele]

MQTT2_SERVER ist eine integrierte 'Reinraumimplementierung' eines MQTT-Servers, die keine externen Bibliotheken verwendet. Es dient als IODev für MQTT2_DEVICES, kann aber als Ersatz für eigenständige Server wie mosquitto (mit weniger Funktionen und Leistung) verwendet werden. Es soll den Anschluss von MQTT-Geräten an FHEM vereinfachen.

Define

define <name> MQTT2_SERVER <tcp-portnr> [global|IP]

Set

publish [-r] topic value
clearRetain

Get

 

Readings

  

Attributes

allowfrom
autocreate [no|simple|complex]
binaryTopicRegexp <regular-expression>
clientId <name>
clientOrder [MQTT2_DEVICE] [MQTT_GENERIC_BRIDGE]
disable
hideRetain [0|1]
ignoreRegexp
keepaliveFactor
rawEvents <topic-regexp>
rePublish
SSL
sslVersion
sslCertPrefix

00_MQTT2_CLIENT

[Zurueck Uebersicht] [Erlaeuterung, Anwendung und Beispiele]

 MQTT2_CLIENT ist eine Reinraumimplementierung eines MQTT-Clients (der eine Verbindung zu einem externen Server wie mosquitto herstellt) ohne Perl-Bibliotheken. Es dient als IODev für MQTT2_DEVICES..

Define

define <name> MQTT2_CLIENT <host>:<port>

Set

publish -r topic value
password <password> value
connect
disconnect

Get

 

Readings

  

Attributes

autocreate [no|simple|complex]
binaryTopicRegexp <regular-expression>
clientId <name>
clientOrder [MQTT2_DEVICE] [MQTT_GENERIC_BRIDGE]
connectTimeout <seconds>
disable
disabledForIntervals
disconnectAfter <seconds>
keepaliveTimeout <seconds;>
lwtRetain
mqttVersion 3.1,3.1.1
msgAfterConnect [-r] topic message
msgBeforeDisconnect [-r] topic message
qosMaxQueueLength <number>
rawEvents <topic-regexp>
subscriptions <subscriptions>
SSL
sslargs
username <username>

10_MQTT2_DEVICE

[Zurueck Uebersicht] [Erlaeuterung, Anwendung und Beispiele]

MQTT2_DEVICE wird verwendet, um einzelne Geräte darzustellen, die mit dem MQTT2_SERVER verbunden sind. MQTT2_SERVER und  MQTT2_DEVICE soll den Anschluss von MQTT-Geräten an FHEM vereinfachen.

Define

define <name> MQTT2_DEVICE [clientId]

Set

<set setList attribute>

Get

<get getList attribute>

Readings

  

Attributes

 autocreate {0|1}
bridgeRegexp <regexp> newClientId ...
devicetopic value
devPos value
disable
getList cmd reading [topic|perl-Expression]...
imageLink href
jsonMap oldReading1:newReading1 oldReading2:newReading2...
periodicCmd <cmd1>:<period1> <cmd2>:<period2>...
readingList <regexp> [readingName|perl-Expression] ...
setExtensionsEvent
setList cmd [topic|perl-Expression] ...
setStateList command command ...

10_MQTT_DEVICE

[Zurueck Uebersicht] [Erlaeuterung, Anwendung und Beispiele]

Ein MQTT_DEVICE fungiert als fhem-device, das mqtt-topics zugeordnet ist.

Define

define <name> MQTT_DEVICE

Set

set <name> <command>
set <name> <reading> <value>
set extensions

Get

  

Readings

  

Attributes

attr <name> publishSet [[<reading>:]<commands_or_options>] <topic>
attr <name> publishSet_<reading> [<values>]* <topic>
attr <name> autoSubscribeReadings <topic>
attr <name> subscribeReading_<reading> [{Perl-expression}] [qos:?] [retain:?] <topic>
attr <name> retain <flags> ...
attr <name> qos <flags> ...
attr <name> useSetExtensions <flags>

10_MQTT_BRIDGE

[Zurueck Uebersicht] [Erlaeuterung, Anwendung und Beispiele]

Das Modul ist seit der Version 6.1 veraltet (deprecated) und wurde in das Verzeichnis ./contrib/deprecated/ verschoben. Um es zu benutzen kann es in das Verzeichnis ./FHEM/ kopiert werden und mit einem Neustart von FHEM aktiviert werden.


Fuer ein bestehendes FHEM-device wird eine Verbindung zum mqtt angelegt. Es wird die im IODev-attribute angegebne MQTT-verbindung verwendet. Die Verbindung funktioniert bidirektioinal.

Define

define <name> MQTT_BRIDGE <fhem-device-name>

Set

 

Get

 

Attributes

subscribeSet [{Perl-expression}] [qos:?] [retain:?] <topic>
subscribeSet_<reading> [{Perl-expression}] [qos:?] [retain:?] <topic>
publishState <topic>
publishReading_<reading> <topic>
publish-topic-base <topic>
retain <flag> or retain <topic> <flag> <topic> <flag> ... 
qos <flag> or qos <topic> <flag> <topic> <flag> ...

10_MQTT_GENERIC_BRIDGE

[Zurueck Uebersicht] [Erlaeuterung, Anwendung und Beispiele]

Dieses Modul ist eine MQTT-Brücke, die gleichzeitig Daten von mehreren FHEM-Geräten sammelt und deren Messwerte über MQTT weitergibt, Messwerte von eingehenden MQTT-Nachrichten festlegt oder eingehende Nachrichten als "Set" -Befehl für das konfigurierte FHEM-Gerät ausführt. Einer für die Gerätetypen könnte als IODev dienen: MQTT, MQTT2_CLIENT oder MQTT2_SERVER.

Define

defmod mqttGeneric MQTT_GENERIC_BRIDGE [prefix] [devspec,[devspec]

Set

 

Get

version
devlist [<name (regex)>]
devinfo [<name (regex)>]

Readings

device-count
incoming-count
outgoing-count
updated-reading-count
updated-set-count
transmission-state

Attributes

IODev (zwingend erforderlich)
disable 
globalDefaults
globalAlias
globalPublish
globalTypeExclude
globalDeviceExclude
forceNEXT
mqttDefaults
mqttAlias
mqttPublish
mqttSubscribe
mqttForward
mqttDisable

Links

Ein Exkurs von Heise mit Beispielen, deutsch, sehr lesenswert MQTT FX - ein sehr praktisches Analysetool