Nach zwei erfolglosen Tagen MQTT und FHEM zusammenzubringen benötige ich ein wenig Hilfe.
# $Id: fhem.pl 6782 2014-10-18 06:14:57Z rudolfkoenig $
# $Id: 01_FHEMWEB.pm 6812 2014-10-26 17:12:41Z rudolfkoenig $
# $Id: 92_FileLog.pm 6769 2014-10-15 17:03:30Z rudolfkoenig $
# $Id: 00_MQTT.pm 6720 2014-10-09 08:49:59Z ntruchsess $
# $Id: 10_MQTT_BRIDGE.pm 6720 2014-10-09 08:49:59Z ntruchsess $
Um 00_MQTT bzw. 10_MQTT_BRIDGE ohne Fehler im FileLog zu bekommen musste noch ein
apt-get install libmodule-pluggable-perl
ausgeführt werden.
Eine Verbindung zum MQTT-Broker (heißt das so richtig?) ist vorhanden:
root@fhem_test:~# mosquitto_sub -h 192.168.178.21 -t "fhem/#" -v
fhem/bad/humidity/set 65.3
fhem/bad/humidity/set 65.6
fhem/bad/humidity/set 65.69
FHEM is wie folgt definiert (in Anlehnung an http://forum.fhem.de/index.php/topic,27532.msg204257.html#msg204257 (http://forum.fhem.de/index.php/topic,27532.msg204257.html#msg204257)):
define bz_humidity dummy
define mqtt MQTT 192.168.178.21:1883
define mqtt_bz_humidity MQTT_BRIDGE bz_humidity
attr mqtt_bz_humidity subscribeSet fhem/bad/humidity/set
Nach einem Neustart von FHEM erscheint im Event-Monitor:
Events:
2014-10-28 15:02:45 MQTT mqtt connection: active
2014-10-28 15:03:46 MQTT mqtt connection: active
2014-10-28 15:04:46 MQTT mqtt connection: active
Aber:
MQTT_BRIDGE mqtt_bz_humidity ???
bzw:
dummy bz_humidity ???
Erwartet hätte ich, dass die Luftfeuchte im dummy bz_humidity angezeigt wird.
Im FileLog lese ich nichts ungewöhliches:
2014.10.28 15:03:26 4: HTTP FHEMWEB:192.168.178.33:50489 GET /fhem?XHR=1&inform=type=status;filter=room=all×tamp=1414505009357
2014.10.28 15:03:45 5: MQTT mqtt message sent: PingReq/at-most-once
2014.10.28 15:03:45 5: SW: c000
2014.10.28 15:03:46 5: MQTT mqtt message received: PingResp/at-most-once
2014.10.28 15:03:46 5: Triggering mqtt (1 changes)
2014.10.28 15:03:46 5: Notify loop for mqtt connection: active
2014.10.28 15:03:46 4: eventTypes: MQTT mqtt connection: active -> connection: active
2014.10.28 15:04:46 5: MQTT mqtt message sent: PingReq/at-most-once
2014.10.28 15:04:46 5: SW: c000
2014.10.28 15:04:46 5: MQTT mqtt message received: PingResp/at-most-once
2014.10.28 15:04:46 5: Triggering mqtt (1 changes)
2014.10.28 15:04:46 5: Notify loop for mqtt connection: active
2014.10.28 15:04:46 4: eventTypes: MQTT mqtt connection: active -> connection: active
Frage: Wie bekomme ich die Luftfeuchte im dummy bz_humidity korrekt angezeigt?
Danke & Gruss,
SommerSonnenWende
nimm dafür lieber MQTT_DEVICE, das funktioniert besser als dummy+MQTT_BRIDGE
Gruß,
Norbert
Danke für den Hinweis - leider kommt keine Verbindung zustande. Ich habe folgende beide Varianten nacheinander ohne Erfolg probiert:
Variante 1:
define mqtt MQTT 192.168.178.21:1883
define bz_humidity MQTT_DEVICE
attr bz_humidity autoSubscribeReadings fhem/bad/+/set
Der reinen Lehre nach sollte ja das passende Attribut automatisch angelegt werden mit dem aktuellen Wert. Dies geschieht nicht.
Variante 2:
define mqtt MQTT 192.168.178.21:1883
define bz_humidity MQTT_DEVICE
attr bz_humidity subscribeReading_state fhem/bad/humidity/set
attr bz_humidity stateFormat measured_humidity
Das Ergebnis ist immer:
MQTT_DEVICE bz_humidity ???
Das Logfile zeigt keinerlei Auffälligkeiten.
Ich habe die Verbindung zum MQTT-Broker auch als User fhem getestet um eventl. Rechteprobleme auszuschliessen:
root@fhem_test:/opt/fhem/log# sudo -H -u fhem mosquitto_sub -h 192.168.178.21 -t "fhem/#" -v
fhem/wohnzimmer/licht/set test100
fhem/bad/humidity/set 72.1
fhem/bad/humidity/set 72
Da der MQTT-Broker nicht auf dem gleichen Gerät läuft wie der FHEM-Server fällt mir nur noch die Frage ein, ob dies ein Problem darstellen könnte?
Danke & Gruss,
SommerSonnenWende
Update: Ich habe eine MQTT-Bridge aufgesetzt und das fhem.cfg entsprechend auf 127.0.0.1:1883 angepasst. Leider keine Lösung.
Ich habe auch das Vorhandensein des Perl MQTT-Modules verifiziert:
root@fhem_test:/opt/fhem# perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC' | grep -i mqtt
/usr/local/share/perl/5.20.1/Net/MQTT/Constants.pm
/usr/local/share/perl/5.20.1/Net/MQTT/TopicStore.pm
/usr/local/share/perl/5.20.1/Net/MQTT/Message.pm
...
Sollte somit passen.
Meine Frage: Wie kann ich das Problem weiter eingrenzen? Wo muss eine eventl. DEBUG-Ausgabe in die Console unter /opt/fhem/FHEM/00_MQTT.pm eingebaut werden, um überhaupt festzustellen, ob sich das Modul mit dem Broker verbindet und welche Messages empfangen werden? (Ich habe von Perl keine Ahnung!)
Danke & Gruss,
SommerSonnenWende
Wenn Du mosquitto als Broker verwendest, kannst Du in der /etc/mosquitto/mosquitto.conf das Logging passend konfigurieren. Per Default ist das nämlich (jedenfalls bei mir auf Debian und Ubuntu) komplett abgestellt.
wg:
define mqtt MQTT 192.168.178.21:1883
define bz_humidity MQTT_DEVICE
attr bz_humidity subscribeReading_state fhem/bad/humidity/set
attr bz_humidity stateFormat measured_humidity
wenn Du mit subscribeReading_state dafür sorgst, dass das topic fhem/bad/humidity/set beim Empfangen von Messages das Reading 'state' aktualisieren soll, dann solltest Du stateFormat auch auf 'state' setzen (oder Stateformat weglassen, der Default ist ja 'state'). Wo soll das Reading 'measured_humidity' denn herkommen?
Gruß,
Norbert
Hallo Norbert,
danke für Deine Geduld, aber es will nicht gelingen :( Der Einfachheit halber habe ich jetzt Dein Beispiel aus http://forum.fhem.de/index.php/topic,27532.msg204257.html#msg204257 (http://forum.fhem.de/index.php/topic,27532.msg204257.html#msg204257) eingesetzt. Die komplette fhem.cfg enthält:
attr global userattr devStateIcon devStateStyle icon sortby webCmd widgetOverride
attr global autoload_undefined_devices 1
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .
attr global motd none
attr global statefile ./log/fhem.save
attr global updateInBackground 1
attr global verbose 5
define telnetPort telnet 7072 global
define WEB FHEMWEB 9083 global
# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log fakelog
define autocreate autocreate
attr autocreate filelog ./log/%NAME-%Y.log
define eventTypes eventTypes ./log/eventTypes.txt
# MQTT
define mqtt MQTT 127.0.0.1:1883\
define licht_kinderzimmer MQTT_DEVICE
attr licht_kinderzimmer publishSet on off fhem/kinderzimmer/licht
attr licht_kinderzimmer subscribeReading_state fhem/kinderzimmer/licht/set
Den Broker mosquitto starte ich von der Kommandozeile:
fhem@fhem_test:/etc/mosquitto$ sudo /usr/sbin/mosquitto -v -p 1883
1414763195: mosquitto version 1.3.4 (build date 2014-08-17 03:42:05+0000) starting
1414763195: Using default config.
1414763195: Opening ipv4 listen socket on port 1883.
...
FHEM verbindet sich mit dem Broker, zumindestens wird ein Ping 'ausgetauscht':
1414765625: Received PINGREQ from Net::MQTT::Message[1550]
1414765625: Sending PINGRESP to Net::MQTT::Message[1550]
In FHEM > Unsorted > MQTT_DEVICE findet sich "licht_kinderzimmer / Glühlampe / on off"
Wenn ich die Glühlampe alsdann 'on' bzw 'off' schalte, kommen _keine_ Meldungen auf der mosquitto-Konsole an!
Das FHEM-Log vermeldet:
2014.10.31 15:31:51 4: HTTP FHEMWEB:192.168.178.33:64543 GET /fhem?XHR=1&cmd.licht_kinderzimmer=set%20licht_kinderzimmer%20off&room=all
2014.10.31 15:31:51 5: Cmd: >set licht_kinderzimmer off<
2014.10.31 15:31:51 1: PERL WARNING: Use of uninitialized value $name in concatenation (.) or string at ./FHEM/00_MQTT.pm line 379.
2014.10.31 15:31:51 5: MQTT message sent: Publish/at-most-once fhem/kinderzimmer/licht
6f 66 66 off
2014.10.31 15:31:51 5: SW: 301c00176668656d2f6b696e6465727a696d6d65722f6c696368746f6666
2014.10.31 15:31:51 5: Triggering licht_kinderzimmer (1 changes)
2014.10.31 15:31:51 5: Notify loop for licht_kinderzimmer off
2014.10.31 15:31:51 4: eventTypes: MQTT_DEVICE licht_kinderzimmer off -> off
2014.10.31 15:31:51 4: eventTypes: MQTT_DEVICE licht_kinderzimmer state: off -> state: off
2014.10.31 15:31:51 5: Triggering licht_kinderzimmer (1 changes)
2014.10.31 15:31:51 5: Notify loop for licht_kinderzimmer transmission-state: outgoing publish sent
2014.10.31 15:31:51 4: eventTypes: MQTT_DEVICE licht_kinderzimmer transmission-state: outgoing publish sent -> transmission-state: outgoing publish sent
2014.10.31 15:31:51 4: /fhem?XHR=1&cmd.licht_kinderzimmer=set%20licht_kinderzimmer%20off&room=all / RL:20 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
Der Event-Monitor ist geschwätzig und zeigt:
2014-10-31 15:31:05 MQTT mqtt connection: active
2014-10-31 15:31:32 MQTT_DEVICE licht_kinderzimmer on
2014-10-31 15:31:32 MQTT_DEVICE licht_kinderzimmer transmission-state: outgoing publish sent
2014-10-31 15:31:51 MQTT_DEVICE licht_kinderzimmer off
2014-10-31 15:31:51 MQTT_DEVICE licht_kinderzimmer transmission-state: outgoing publish sent
Bei Verwendung des von Net::MQTT mitgelieferten Beispielprogrammes net-mqtt-pub erfolgt eine Meldung auf der mosquitto-Konsole:
fhem@fhem_test:~$ echo OFF | net-mqtt-pub fhem/generic/set
1414766071: New connection from 127.0.0.1 on port 1883.
1414766071: New client connected from 127.0.0.1 as Net::MQTT::Message[1575] (c1, k120).
1414766071: Sending CONNACK to Net::MQTT::Message[1575] (0)
1414766071: Received PUBLISH from Net::MQTT::Message[1575] (d0, q0, r0, m0, 'fhem/generic/set', ... (3 bytes))
1414766071: Socket error on client Net::MQTT::Message[1575], disconnecting.
(Ich habe auch ein 'echo ON | net-mqtt-pub fhem/kinderzimmer/licht' probiert - ohne Erfolg / Rückmeldung in FHEM)
Danke & Gruss,
SommerSonnenWende
liegt wohl am fehlenden IODev. (daher auch die Perl-waring in 00_MQTT.pm Line 379). Hab grade einen Fix commited, der das automatische Setzen des IODevs an die richtige Stelle rückt. (http://sourceforge.net/p/fhem/code/6842/).
Gruß,
Norbert
Hallo Norbert,
danke, das war es. Habe den Betreff auf [gelöst] gesetzt.
Schönes Wochenende,
SommerSonnenWende.