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.
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.
Was war:
Am Fhem Server wo die Readings erzeugt wurden ist der Mosquitto MQTT Server
define Mosquitto MQTT 127.0.0.1:1883
Weiters 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
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?
Darf ich nochmals nachhaken?
Du willst lediglich von einer Fhem Instanz zu ner andern den temperatur Wert deiner Heizung übertragen?
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.
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
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...)
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.
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!
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.
Yeep! :)
Das hat schon mal funktioniert
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).
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!