Ich werde gern unter fhem/lib/FHEM/Utilities etwas code einchecken, welcher dafür gedacht ist, dass beliebige Module auch MQTT topics abonnieren können. Das Unterverzeichnis müsste erstellt werden. Recht es wenn ich das via svn commit mache?
Hallo Jörg
Es reicht wenn Du es entsprechend commitest. Funktioniert ohne Probleme. Die entsprechenden Module müssen natürlich Dein Modul einbinden. Und es wäre zu empfehlen das Du es entsprechend als package machst.
Grüße
Zitat von: CoolTux am 07 Februar 2022, 09:31:38
Hallo Jörg
Es reicht wenn Du es entsprechend commitest. Funktioniert ohne Probleme. Die entsprechenden Module müssen natürlich Dein Modul einbinden. Und es wäre zu empfehlen das Du es entsprechend als package machst.
Grüße
perfekt, danke. package: check, einbinden (use ..): check. Noch ein wenig Qualitätskontrolle, dann checke ich das ein. Manual als pod, ich stelle das dann aber auch hier nochmal vor, mit Anleitung und Beispiel wie man es einbindet.
Wenn Du es als Package bereitstellst, dann kannst Du es auch gleich im richtigen Lib VZ bereitstellen:
https://svn.fhem.de/fhem/trunk/fhem/lib/FHEM/
und da liegt es jetzt auch. :)
NAME
FHEM::Utility::MQTT2_Dispatcher - Subscribe to MQTT messages in fhem modules
SYNOPSIS
package main;
use FHEM::Utility::MQTT2_Dispatcher qw( :DEFAULT );
sub X_Define {
...
$hash->{Listener} = on_mqtt('home/#', sub {
X_MQTT($hash, @_);
}) or do {
Log3($hash, 2, $@);
};
};
sub X_MQTT {
my ($hash, $topic, $value, $io_name) = @_;
};
# required for rereadcfg etc
sub X_Undef {
...
del_mqtt($hash->{Listener});
return;
};
DESCRIPTION
This module provides a couple of helper functions to let a fhem module subscripe to MQTT topics using a defined MQTT2_SERVER or MQTT2_CLIENT.
FUNCTIONS
on_mqtt ($topic, sub {})
This function subscribes to a given $topic. MQTT wildcards are allowed. The MQTT2 IO device, of course, must receive that topic. The coderef can be an anonyious sub or a variable holding one. This function receive 3 params: the $topic (unicode), the $value (raw) and the $name of the receiving IO device.
Returns an identifier that is used to delete that handler at any time. Undef in case of an error.
Multiple handlers can be installed at the same time.
del_mqtt ($id)
This function removes (deletes) the handler specified with $id. It must be called in X_Undef function of the embedding fhem module.
Hallo herrmannj,
Ich habe vor, das Package bei mir einzubinden.
Leider klappt es nicht :( Liegt vielleicht am Benutzer. Ziemlich sicher bin ich aber, dass was mit dem Löschen der Matchlist nicht stimmt:
In Zeile 103:
$io_dev->{MatchList} = []; # force rebuild
Ich lasse MQTT2_Client patchen, aber das löschen der MatchList führt kein rebuild oder sowas aus.
Vermutlich wolltest Du den .clientArray löschen damit dieser neu berechnet wird oder tatsächlich eine neue MatchList schreiben, wobei ich nicht glaube dass FHEM das Package laden könnte, da es natürlich kein FHEM Modul ist.
Da MatchList dazu da ist, noch nicht geladene FHEM Module zu laden, könnte die Zeile (103) vermutlich komplett entfernt werden. Vor allem, da in ...._resetClients die Matchlist wieder gesetzt wird, solange das IO noch nicht gepatcht wurde. Das Löschen findet ja unter anderen Bedingungen trotzdem statt.
Nach dem Einbinden war jedenfalls meine Matchlist leer und damit würden MQTT2_DEVICE und MQTT_GENERIC_BRIDGE nie geladen werden.
Internals:
._io_patched 1
BUF
Clients :MQTT2_Dispatcher:MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
ClientsKeepOrder 1
DEF mqtt:1883
DeviceName mqtt:1883
FD 4
FUUID 695e9c21-f33f-c986-e617-d7301881c4685bc6
NAME mqtt_broker
NR 49
PARTIAL
STATE opened
TYPE MQTT2_CLIENT
WBCallback
clientId mqtt_broker
eventCount 1
lastMsgTime 1768736553.88505
nextOpenDelay 10
nrConnects 1
MatchList:
READINGS:
2026-01-18 12:42:33 state opened
Attributes:
autocreate simple
verbose 5
Grüße Sidey