Hallo zusammen,
ich bin gerade dabei, einige Devices mit MQTT_GENERIC_BRIDGE an einen Mosquitto-Broker anzubinden. Hierfür verwende ich einen MQTT2_CLIENT mit folgender Definition:
Internals:
BUF
DEF 127.0.0.1:1883
DeviceName 127.0.0.1:1883
FD 12
FUUID 5e19cd15-f33f-e8bf-ccf3-7b1fb7e7edec986c
NAME MOSQUITTO_BROKER
NR 40
PARTIAL
SSL 1
STATE opened
TYPE MQTT2_CLIENT
WBCallback
clientId fhem
lastMsgTime 1578850172.17745
nextOpenDelay 5
Helper:
DBLOG:
state:
System.DbLog:
TIME 1578849714.01531
VALUE publish fhem/light/group/wohnzimmer/scene/set 9H5d7SbWoq1u3CT
READINGS:
2020-01-12 18:21:23 state opened
Attributes:
SSL 1
clientId fhem
room System
username fhem
Für meine Hue Devices habe ich eine entsprechende MQTT_GENERIC_BRIDGE eingerichtet (aufgrund der Menge der Devices habe ich sie gekürzt):
Internals:
DEF mqtt Light\.(?!Plot).*
FUUID 5e1a1e14-f33f-e8bf-2875-7501ff174fba0b98
IODev MOSQUITTO_BROKER
NAME MQTT.Lights
NR 357
NTFY_ORDER 50-MQTT.Lights
STATE ???
TYPE MQTT_GENERIC_BRIDGE
devspec Light\.(?!Plot).*
prefix mqtt
Helper:
DBLOG:
outgoing-count:
System.DbLog:
TIME 1578850314.78772
VALUE 18
transmission-state:
System.DbLog:
TIME 1578850314.78232
VALUE outgoing publish sent
READINGS:
2020-01-12 18:21:06 device-count 45
2020-01-12 18:21:05 incoming-count 0
2020-01-12 18:31:54 outgoing-count 18
2020-01-12 18:31:54 transmission-state outgoing publish sent
2020-01-12 18:21:05 updated-reading-count 0
2020-01-12 18:21:05 updated-set-count 0
devices:
:global:
:defaults:
pub:base {"fhem/" . lc($device)}
pub:qos 0
pub:retain 1
sub:base {"fhem/" . lc($device)}
sub:qos 2
sub:retain 1
:publish:
*:
mode R
resendOnConnect last
topic {"$base/$name/value"}
Light.Bad.Deckenleuchte1:
:subscribe:
HASH(0x4db27c0)
Light.Bad.Deckenleuchte2:
:subscribe:
HASH(0x4db3320)
Light.Bad.Deckenleuchte3:
:subscribe:
HASH(0x4d8ea28)
...
globalDeviceExcludes:
globalReadingExcludes:
globalTypeExcludes:
pub:
FHEMWEB *
Global *
MQTT transmission-state
MQTT_BRIDGE transmission-state
MQTT_DEVICE transmission-state
MQTT_GENERIC_BRIDGE *
telnet *
sub:
FHEMWEB *
Global *
MQTT transmission-state
MQTT_BRIDGE transmission-state
MQTT_DEVICE transmission-state
MQTT_GENERIC_BRIDGE *
telnet *
subscribe:
Attributes:
IODev MOSQUITTO_BROKER
debug 1
globalDefaults base={"fhem/" . lc($device)} retain=1 pub:qos=0 sub:qos=2
globalPublish *:topic={"$base/$name/value"} *:resendOnConnect=last
room Test
In jedem dieser Devices habe ich ein entsprechendes mqttSubscribe definiert, um die Geräte steuern zu können:
Internals:
CFGFN ./FHEM/devices_light.cfg
CHANGED
DEF 3 IODev=HUE_BRIDGE
FUUID 5c91108d-f33f-e8bf-d429-21ef8ceac4dc38a3
FVERSION 31_HUEDevice.pm:0.209360/2020-01-10
ID 3
INTERVAL
IODev HUE_BRIDGE
NAME Light.Wohnzimmer.Deckenleuchte
NR 173
STATE off
TYPE HUEDevice
manufacturername Philips
modelid LTW010
name Deckenleuchte
productid Philips-LTW010-1-A19CTv2
swconfigid 7A2E82CC
swversion 1.46.13_r26312
type Color temperature light
uniqueid 00:17:88:01:04:56:62:cc-0b
READINGS:
2020-01-12 18:21:21 alert select
2020-01-12 18:21:21 bri 254
2020-01-12 18:21:21 colormode ct
2020-01-12 18:21:21 ct 156 (6410K)
2020-01-10 12:44:32 mode homeautomation
2020-01-12 18:21:21 onoff 0
2020-01-12 18:21:21 pct 0
2020-01-12 18:21:21 reachable 1
2020-01-12 18:21:21 rgb e8ecff
2020-01-12 18:21:21 state off
helper:
alert select
battery -1
bri 254
colormode ct
ct 156
devtype
effect
hue -1
mode
on 0
pct 0
reachable 1
rgb e8ecff
sat -1
update_timeout -1
xy
json:
manufacturername Philips
modelid LTW010
name Deckenleuchte
productid Philips-LTW010-1-A19CTv2
productname Hue ambiance lamp
swconfigid 7A2E82CC
swversion 1.46.13_r26312
type Color temperature light
uniqueid 00:17:88:01:04:56:62:cc-0b
capabilities:
control:
maxlumen 806
mindimlevel 1000
ct:
max 454
min 153
streaming:
config:
archetype sultanbulb
direction omnidirectional
function functional
startup:
mode powerfail
state:
alert select
bri 254
colormode ct
ct 156
mode homeautomation
swupdate:
lastinstall 2019-03-19T18:38:16
state noupdates
Attributes:
IODev HUE_BRIDGE
alias Deckenleuchte Wohnzimmer
color-icons 2
devStateIcon {(HUEDevice_devStateIcon($name),"toggle")}
event-on-change-reading .*
genericDeviceType light
group Licht
homebridgeMapping ColorTemperature=ct::ct,minValue=154,maxValue=454
model LTW010
mqttSubscribe *:stopic={"fhem/" . join("/", split(/\./, lc($device))) . "/$name/set"} *:qos=2
room Wohnzimmer,HomeKit
siriName Deckenleuchte
subType ctdimmer
userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 mqttAlias:textField-long mqttDefaults:textField-long mqttDisable:both,incoming,outgoing mqttForward:all,none mqttPublish:textField-long mqttSubscribe:textField-long
webCmd on:off
Änderungen der Readings werden einwandfrei an den MQTT-Broker gesendet. Allerdings funktioniert ein set über MQTT nicht nach einem Neustart von FHEM. Wenn ich mqttSubscribe erneut manuell setze, funktioniert es bis zu einem weiteren Neustart. Die set-Events werden die ganze Zeit an FHEM zugestellt (kann ich im Mosquitto Logfile sehen), verursachen aber keine Aktion im Device, bis ich das Attribut (auch auf den alten Wert) wieder neu setze.
Meine erste Idee war, dass es an dem Perl-Statement, das das Topic zusammenbaut, liegt, jedoch besteht das Problem auch, wenn ich mqttSubscribe auf einen festen Wert für ein Device setze, zum Beispiel:
scene:stopic=fhem/light/group/wohnzimmer/scene/set scene:qos=2
Hat jemand von euch eine Idee, woran das liegen könnte?
Vielen Dank und viele Grüße
Manuel
Ich kann das Problem nachvollziehen, falls dabei sich um ein MQTT-Server Neustart handelt.
Bist Du sicher, dass der MQTT-Server bei der FHEM-Start erreichbar ist?
Ja, der MQTT-Server läuft die ganze Zeit. Das Problem tritt bei einem Neustart von FHEM auf. Ich habe auch schon mit der Reihenfolge der Devices in der fhem.cfg rumgespielt, was aber leider auch keine Änderung gebracht hat.
Ich konnte die Fehlerursache herausfinden: Das Problem tritt auf, wenn man mehrere MQTT_GENERIC_BRIDGE Devices mit unterschiedlichen devspecs anlegt. Ich habe jetzt testweise nur eine MQTT_GENERIC_BRIDGE angelegt und das Problem trat auch nach mehreren Neustarts von Fhem nicht auf.
Ich weiß nicht, ob es gedacht war, mehrere MQTT_GENERIC_BRIDGE Devices anzulegen, zumindest konnte ich in der commandref und im Wiki nichts dazu finden. Mit mehreren Devices wollte ich eine Trennung der globalDefaults etc. für die verschiedenen Devicetypen meines Systems erreichen.