code checkin unter fhem/lib/FHEM

Begonnen von herrmannj, 07 Februar 2022, 09:26:44

Vorheriges Thema - Nächstes Thema

herrmannj

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?

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

herrmannj

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.

Sidey

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/
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

herrmannj

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.

Sidey

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker