(FHEM) MQTT
Inhaltsverzeichnis
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]
- 31_Nello: Ist eine Haustuer-Freisprecheinrichtung (nello.io) Implementation von Oskar Neummann (Hat auf github auch ein cooles Powermeter https://github.com/oskarn97/Powermeter)
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