[gelöst] MQTT2 zu MQTT2

Begonnen von maci, 08 April 2025, 12:18:33

Vorheriges Thema - Nächstes Thema

maci

Hallo,
Ich habe 2 Fhem Instanzen, die bisher Readings über MQTT ausgetauscht habe.
Nach der Neuinstallation einer Instanz funktioniert das nicht mehr. Der Port 1883 ist immer geschlossen, obwohl MQTT mit Mosquitto am laufen ist.
Habe nun begonnen den MQTT2_Server zu installieren. Ich komme aber trotz der zahlreichen Beschreibungen nicht dahinter wie ich Readings die im Device mit MqttName, MqttRoom MqttReading angelegt sind über den MQTT2_SERVER an die andere Instanz senden kann.
Der MQTT2_Server funktioniert, denn von Shellys und ESP8266 kommen Readings.
Auf den 2. Instanz, die eben empfangen soll habe auch versucht den MQTT2_Client mit der IP der zu sendenen Instanz zu installieren.
Kein Erfolg.
Ich blinke da nicht wirklich durch um ehrlich zu sein.
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Beta-User

Zitat von: maci am 08 April 2025, 12:18:33Ich blinke da nicht wirklich durch um ehrlich zu sein.
Leider ist es vermulich nicht nur für mich auch einigermaßen schwierig, da soweit durchzublicken, dass man helfen kann: Deine Beschreibung wirft viele Fragen auf...

Vielleicht beschreibst du erst mal, wie das gelöst gewesen war:
Zitat von: maci am 08 April 2025, 12:18:33Ich habe 2 Fhem Instanzen, die bisher Readings über MQTT ausgetauscht habe.
Also:
- Wo war der MQTT-Server (mosquitto?)?
- Wie sind "Readings" (von welchen Devices/TYPE) von Instanz 1 nach Instanz 2 gekommen?
- dto. (falls das der Fall war? "ausgetauscht"?) für die andere Richtung?

Falls du im Moment alte list, cfg-Auszüge oä. hast: Es muss ja irgendeinen Mechanismus gegeben haben, der für das publish verantwortlich gewesen war. Stichworte dazu MQTT_BRIDGE, MQTT_GENERIC_BRIDGE, at/notify/DOIF mit publish-Anweisung(en)?

Falls nichts "altes" vorhanden ist: Beschreibe mal an einem Device auf einer Instanz, was du konkret erreichen willst.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

maci

Was war:
Am Fhem Server wo die Readings erzeugt wurden ist der Mosquitto MQTT Server
define Mosquitto MQTT 127.0.0.1:1883Weiters ein Notify mit Inhalt:
Internals:
   DEF        .*:.* {
my $mqttRoom = AttrVal($NAME, 'mqttRoom', '');
my $mqttName = AttrVal($NAME, 'mqttName', '');
my @mqttReadings = split(/,/, AttrVal($NAME, 'mqttReadings', ''));

if ($mqttRoom ne '' && $mqttName ne '') {
        my $reading = "";
        my $message = "";

if ($EVENT =~ qr/(.*?): (.*)/p) {
$reading = $1;
$message = $2;
} else {
$reading = "state";
$message = $EVENT;
}

if (grep(/^$reading/, @mqttReadings)) {
            my $topic = "/SmartHome/$mqttRoom/$mqttName/$reading";

            fhem("set Mosquitto publish $topic $message");
}
}
}
   FUUID      5d77ec4b-f33f-72fd-5727-ea709c6237d943c9
   FVERSION   91_notify.pm:0.258880/2022-03-27
   NAME       n_publish_mqtt
   NR         204
   NTFY_ORDER 50-n_publish_mqtt
   REGEXP     .*:.*
   STATE      2025-04-08 19:10:49
   TRIGGERTIME 1744132249.60406
   TYPE       notify
   READINGS:
     2025-03-22 18:13:19   state           active
     2025-04-08 19:10:49   triggeredByDev  at_Zeit
     2025-04-08 19:10:49   triggeredByEvent Next: 19:11:19
Das Device das die Readings erzeugt:
Internals:
   ALARM      0
   DEF        DS18B20 FF5167901605
   ERRCOUNT   0
   FUUID      5d77c185-f33f-72fd-ff87-31d62e598ac10cd5
   FVERSION   21_OWTHERM.pm:0.235530/2021-01-19
   INTERVAL   300
   IODev      1W_USB
   NAME       Boilertemperatur
   NOTIFYDEV  global
   NR         197
   NTFY_ORDER 50-Boilertemperatur
   OW_FAMILY  28
   OW_ID      FF5167901605
   PRESENT    1
   ROM_ID     28.FF5167901605.57
   STATE      Temperatur: 49.93 °C
   TYPE       OWTHERM
   eventCount 4897
   owg_temp   49.9375
   owg_th     110
   owg_tl     0
   Helper:
     DBLOG:
       Boiler_temp:
         DBLogging:
           TIME       1744132442.8553
           VALUE      49.93
   READINGS:
     2025-04-08 19:14:02   Boiler_temp     49.93
     2025-03-22 18:13:20   IODev           1W_USB
     2025-04-08 19:14:02   state           T: 49.94 °C
     2025-04-08 19:14:02   temperature     49.9375
   tempf:
     factor     1
     offset     0
Attributes:
   DbLogExclude .*
   DbLogInclude Boiler_temp
   IODev      1W_USB
   fp_Heizungsschema 345,250,3,Boiler_temp,
   group      Boiler
   icon       sani_boiler_temp
   model      DS18B20
   mqttName   Boiler
   mqttReadings Boiler_temp
   mqttRoom   1wire
   room       2.01_Heizung,2.06_Boiler
   sortby     1
   stateFormat {sprintf("Temperatur: %.2f °C",ReadingsVal($name,"Boiler_temp",0))}
   tempHigh   110
   tempLow    0
   userReadings Boiler_temp:temperature.* { int ( 100 * ReadingsVal($name,"temperature",0) + 0.05 ) / 100 }

Am zu empfangenden Server dann noch dieses Device
Internals:
   DEF        10.0.0.8:1883
   DeviceName 10.0.0.8:1883
   FD         54
   FUUID      612fa5fb-f33f-0d7f-5dcc-58c271ca9a930517
   FVERSION   00_MQTT.pm:0.249810/2021-09-16
   NAME       HeizungsPi
   NOTIFYDEV  global
   NR         476
   NTFY_ORDER 50-HeizungsPi
   PARTIAL   
   STATE      opened
   TYPE       MQTT
   buf       
   eventCount 12929
   msgid      69
   ping_received 1
   timeout    60
   READINGS:
     2025-04-08 19:12:03   connection      active
     2025-04-04 08:37:54   state           opened
   messages:
Dann noch die MQTT_DEVICEs
Wo die Daten aus dem SendeServer angzeigt werden.
Internals:
   FUUID      612fa5fb-f33f-0d7f-2e60-0341a379194ec378
   FVERSION   10_MQTT_DEVICE.pm:0.249520/2021-09-11
   IODev      HeizungsPi
   NAME       Boilertemperatur
   NR         477
   STATE      Temperatur: 49.93 °C
   TYPE       MQTT_DEVICE
   eventCount 5174
   READINGS:
     2025-03-30 19:50:11   IODev           HeizungsPi
     2025-04-08 19:14:02   Temperatur      49.93
     2025-04-08 19:14:02   transmission-state incoming publish received
   message_ids:
   sets:
   subscribe:
     /SmartHome/1wire/Boiler/Boiler_temp
   subscribeExpr:
     ^\/SmartHome\/1wire\/Boiler\/Boiler_temp$
   subscribeQos:
     /SmartHome/1wire/Boiler/Boiler_temp 0
   subscribeReadings:
     /SmartHome/1wire/Boiler/Boiler_temp:
       cmd       
       name       Temperatur
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Beta-User

OK, das ist zumindest mal nachvollziehbar. Ich unterstelle mal (da der Code an sich sehr generisch gestaltet ist), dass das ein Beispiel von vielen ist...

Und welche Teile dieser Datenstrecke willst du jetzt ersetzen bzw. wo genau hakt es?

Mal unterstellt, du hast deine Hauptinstanz neu aufgesetzt (also der Server, auf dem das Device "Boilertemperatur" vom TYPE "MQTT_DEVICE" war(?)) und auf dem läuft jetzt auch ein MQTT2_SERVER:
- Verbinde die vorhandene Instanz des TYPE "MQTT" (dein "Mosquitto"-benanntes Device auf dem Heizungs-PI) mit dem MQTT2_SERVER. Das sollte gehen, wenn du einfach die IP (von 127.0.0.1) auf die der Hauptinstanz änderst (und ggf. die Zugangsdaten ergänzt).
- Dann kannst du mosquitto (den Dienst) auf dem Heizungs-PI abschalten (es sei denn, er wird noch für was anderes benötigt).

- Was die empfangende Seite angeht: Du kannst auch TYPE=MQTT auf den (internen) MQTT2_SERVER hören lassen (also von 10.0.0.8 auf localhost umstellen) und dann alles lassen, wie es ist (brauchst dann aber die für den "MQTT-alt"-Betrieb erforderlichen Perl-Module), oder du läßt dir die Daten dann einfach von MQTT2_SERVER+autocreate auswerten und bekommst direkt eine neue MQTT2_DEVICE-Instanz mit den Daten vom Heizungs-PI.
Falls das mehrere Devices waren: Einfach die readingList (mit Hilfe der RAW-DEF) auseinandernehmen und auf verschiedene Instanzen verteilen. Das würde dann die Devices vom TYPE=MQTT_DEVICE ersetzen.

- Wenn du die sendende Seite erneuern willst, wäre m.E. das zukunftsweisende Stichwort MQTT_GENERIC_BRIDGE (die dann auf dem Heizungs-PI das notify ersetzt und mit anderen Attributen deine bisherigen (globalen) userAttr "mqttName", "mqttReadings" und "mqttRoom" ersetzen würde).

- Falls das Problem die "sendende" Seite ist: Du brauchst nicht unbedingt TYPE="MQTT" als IO für die publish-Anweisungen im notify, das würde genauso mit einem MQTT2_CLIENT (oder MQTT2_SERVER) gehen. (Über das coding sprechen wir im Moment nicht, das ist imo einigermaßen ineffektiv...)

Nachvollziehbar?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DasQ

Darf ich nochmals nachhaken?

Du willst lediglich von einer Fhem Instanz zu ner andern den temperatur Wert deiner Heizung übertragen?
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

maci

Ich brauche noch etwas, das alles irgendwie zu begreifen.

Habe mal versucht was Beta-User geschrieben hat irgendwie umzusetzen, passt aber noch nicht.
Da ich haufenweise Fehler im Log bekomme. Daher wieder alles dekativiert.

Ich denke, ich werde mir mal 2 Testserver auf meinem Proxmox aufsetzen und da mal versuchen MQTT2 zu verstehen.
Dazu muss ich aber zuerst meinen Kopf etwas freikriegen um das zu behirnen, denn die ganze MQTT2 Geschichte begreife ich nicht wirklich.
Meine bisherige Installation habe ich damals nach den Videos mit Kurs von Hausautomatisierung installiert.
MQTT hat dann funktioniert, doch nun will es nicht mehr.
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

eisman

#6
vielleicht sowas

B =  MQTT_GENERIC_BRIDGE
C = MQTT2_CLIENT
S = MQTT2_SERVER

benutzt werden  3 Attributes
- mqttDefaults,
  -- mqttSubscribe
oder
  -- mqttPublish)

aufwand pro Device ca. 10min ohne nachdenken....

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 7x ESP
1x FHEM Debian, Homematic,Z2M             / 1X Raspberry, ConBee / 6x ESP
1x FHEM Debian,MQTT2                             / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

Beta-User

Zitat von: maci am 10 April 2025, 18:06:50werde mir mal 2 Testserver auf meinem Proxmox aufsetzen und da mal versuchen MQTT2 zu verstehen.
Imo ist diese Vorgehensweise "überkomplex". "MQTT2" ist auch einfach nur MQTT, nur die Syntax zur Einrichtung _in FHEM_ ist halt etwas anders als mit der alten Modulgeneration. Die "2" dient ja nur dazu, die Modulgenerationen innerhalb FHEM unterscheiden zu können.

Zitat von: maci am 10 April 2025, 18:06:50Daher wieder alles dekativiert.
Diese Vorgehensweise mit "allem auf einmal" solltest du ggf. mal überdenken.

Mein Vorschlag:
Wir gehen die Kette mal vom Ende her durch, und du machst das alles Schritt für Schritt?

Also: Es gibt es in deiner Installation schon einen laufenden MQTT-Server, oder?
Zitat von: maci am 08 April 2025, 12:18:33Der MQTT2_Server funktioniert, denn von Shellys und ESP8266 kommen Readings.
Auf welchem Rechner befindet sich der?

Optimalerweise auf der _empfangenden Instanz_ (also da, wo dein "Boilertemperatur"-Device vom TYPE MQTT_DEVICE war).

Zur Klarstellung: Du brauchst insgesamt nur einen einzigen MQTT-Server (man kann auch mehrere haben, aber das verkompliziert nur alles...)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DasQ

#8
Naja so richtig helfen kann ich dir noch immer nicht, aber ich mach das mal anders rum.

Ich habe 2 Fhem Instanzen die sich eine Datenbank teilen. Ich stand auch mal vor dem Punkt über welchen Weg gehst du um die Daten zur Verfügung zu stellen.

Hat man viele zeitkritische Daten, müllt man sich das Netzwerk zu. Vom Aufwand dürfte es aber gleich sein, ob über sql oder mqtt.

Ich hab ein Master Fhem auf dem Mac mini (unter ubuntu nativ) und an der Heizung hängt ein alter Raspberry pi 2 der liest die Heizung und noch ein paar andere Sachen im Keller aus und schreibt nur diese Werte in die Datenbank.


Das kann jetzt nicht die optimale Lösung sein, aber es funktioniert hier schon ne kleine Ewigkeit.
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

maci

Hallo,
Ich hole diesen Thread vom mir wieder nach oben, da ich nun Zeit finde mich diesem Thema erneut zu widmen.

Die Ausgangslage: 2 Fhem Instanzen, Hauptserver und Heizungsserver.
Der Hauptserver erledigt die meisten Dinge, der Heizungsserver kümmert sich fast ausschließlich um die Heizung.
Am Heizungsserver hängt auch eine Display.

Auf beiden Instanzen läuft ein MQTT2_SERVER. Am Heizungsserver wird es von einem ESP Device genutzt. Am Hauptserver sind es mehrere externe Devices.
Weiters gibt es noch eine "alte" MQTT Verbindung vom Heizungsserver zum Haupserver, die Temperaturwerte überträgt.

Mein Wunsch ist es nun Readings von mehreren Devices am Hauptserver auf den Heizungsserver zu übertragen.
Hier fängt mein Problem nun an, da mir nicht in den Kopf will, was ich dazu anlegen muss. Habe mir mal ein MQTT2_CLIENT Gerät am Hauptserver mit der IP:PORT des Heizungsservers angelegt. Das Device ist opened.
Doch wie geht es nun weiter? Wie kann ich die Readings wählen?

Hier blicke ich nicht mehr durch. Auch das mehrmalige Lesen des Wikis dazu bringt mich nicht auf die Spur.
Habe sozusagen ein Brett vorm Kopf  ;)  und sehe die Lösung nicht.
Ich ersuche euch daher bitte mir einen Wegweiser mit einem evtl Lösungsbeispiel zu geben.
Danke im Vorraus!
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Beta-User

ZitatWie kann ich die Readings wählen?
Dazu gäbe es mehrere Varianten.

Vielleicht fängst du erst mit einem "simplen" set-Befehl an.
set <MQTT2_CLIENT-Name> publish FHEM/example/temperature [einDevice:einTempReadingName]
Dann sollte auf dem Heizungs-FHEM was eingehen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

maci

Yeep!  :)
Das hat schon mal funktioniert
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Beta-User

Zitat von: maci am 09 Juli 2025, 18:09:35Yeep!  :)
Das hat schon mal funktioniert

8)

Als nächstes musst du entscheiden, wie die Topic-Struktur in diese Richtung aussehen soll, dann, welcher Event-Handler oder Timer auf dem Haupt-FHEM eingesetzt werden soll, um das Aktualisieren zu übernehmen (at, notify, DOIF oder MQTT_GENERIC_BRIDGE).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

maci

Habe mich dazu entschieden die Übertragung mit teilweise mit at und auch mit notify zu machen.
Einiges habe ich bereits gemacht und funktioniert.

Danke vielmals!
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan