MQTT Bridge, Set Kommandos werden immer doppelt ausgeführt

Begonnen von Tobias, 20 Oktober 2017, 14:20:27

Vorheriges Thema - Nächstes Thema

Tobias

Hi,
ich bin gerade dabei meine Sonos Lautsprecher und MPD Deckenlautsprecher per MQTT via ESP32 und einem Nextion 7" Display anzubinden.

Mit den ersten erfolgreichen Schaltversuchen habe ich festgestellt, das jeder set Befehl beim Zieldevice (hier Sonos oder MPD) doppelt ausgeführt wird. Ich habe alles durchgeschaut und ich finde keinen Fehler.
Schaut mal bitte auf die Logs:
Hier mein MQTT Bridge Device
defmod MQTT_Bridge_MPD_DG MQTT_BRIDGE sonos_Wohnzimmer
attr MQTT_Bridge_MPD_DG DbLogExclude .*
attr MQTT_Bridge_MPD_DG IODev mqtt
attr MQTT_Bridge_MPD_DG publishReading_Album /home/dg/music/get/album
attr MQTT_Bridge_MPD_DG publishReading_Artist /home/dg/music/get/artist
attr MQTT_Bridge_MPD_DG publishReading_Name /home/dg/music/get/name
attr MQTT_Bridge_MPD_DG publishReading_PlaylistPositionSec /home/dg/music/get/playlistpositionsec
attr MQTT_Bridge_MPD_DG publishReading_Pos /home/dg/music/get/playlistpos
attr MQTT_Bridge_MPD_DG publishReading_Time /home/dg/music/get/time
attr MQTT_Bridge_MPD_DG publishReading_Title /home/dg/music/get/title
attr MQTT_Bridge_MPD_DG publishReading_Track /home/dg/music/get/track
attr MQTT_Bridge_MPD_DG publishReading_currentTrackProvider /home/dg/music/get/currenttrackprovider
attr MQTT_Bridge_MPD_DG publishReading_elapsed /home/dg/music/get/elapsed
attr MQTT_Bridge_MPD_DG publishReading_mute /home/dg/music/get/mute
attr MQTT_Bridge_MPD_DG publishReading_playlistcollection /home/dg/music/get/playlistcollection
attr MQTT_Bridge_MPD_DG publishReading_playlistduration /home/dg/music/get/playlistduration
attr MQTT_Bridge_MPD_DG publishReading_random /home/dg/music/get/random
attr MQTT_Bridge_MPD_DG publishReading_repeat /home/dg/music/get/repeat
attr MQTT_Bridge_MPD_DG publishReading_volume /home/dg/music/get/volume
attr MQTT_Bridge_MPD_DG publishState /home/dg/music/get/state
attr MQTT_Bridge_MPD_DG retain 1
attr MQTT_Bridge_MPD_DG room MQTT
attr MQTT_Bridge_MPD_DG stateFormat transmission-state
attr MQTT_Bridge_MPD_DG subscribeSet_mute {($message =~ m/^(on|off)$/)?fhem("set $device mute $message"):0;;} /home/dg/music/set/mute
attr MQTT_Bridge_MPD_DG subscribeSet_next {($message eq "1")?fhem("set $device Next"):0;;} /home/dg/music/set/next
attr MQTT_Bridge_MPD_DG subscribeSet_pause {($message eq "1")?fhem("set $device Pause"):0;;} /home/dg/music/set/pause
attr MQTT_Bridge_MPD_DG subscribeSet_play {($message eq "0")?fhem("set $device Play"):fhem("set $device Play $message");;} /home/dg/music/set/play
attr MQTT_Bridge_MPD_DG subscribeSet_playlist {($message ne "")?fhem("set $device playlist $message"):0;;} /home/dg/music/set/playlist
attr MQTT_Bridge_MPD_DG subscribeSet_previous {($message eq "1")?fhem("set $device Previous"):0;;} /home/dg/music/set/previous
attr MQTT_Bridge_MPD_DG subscribeSet_refreshplaylists {($message eq "1")?fhem("get $device playlists"):0;;} /home/dg/music/set/refreshplaylists
attr MQTT_Bridge_MPD_DG subscribeSet_repeat {fhem("set $device repeat");;} /home/dg/music/set/repeat
attr MQTT_Bridge_MPD_DG subscribeSet_stop {($message eq "1")?fhem("set $device stop"):0;;} /home/dg/music/set/stop
attr MQTT_Bridge_MPD_DG subscribeSet_volume {($message =~ m/^[\d]{0,100}$/)?fhem("set $device volume $message"):0;;} /home/dg/music/set/volume
attr MQTT_Bridge_MPD_DG verbose 4
Diesen Befehl setze ich jetzt ab:
[code] mosquitto_pub -q 1 -t /home/dg/music/set/next -m 1


Was passiert jetzt? In der Trackliste wird nicht ein Track sondern 2 Tracks gesprungen. Das passiert auch bei "previous". ODer bei Play oder Pause etc... Noch mehr merkt man das bei einem Toggle ;) erst gehts an - dann sofort wieder aus

Hier ein Log mit Verbose 5, schaut mal auf 14:04:29. Ein Evaluating des Commands, und 2 Quittierungen des sonos :(
2017.10.20 14:04:28 5: publish received for /home/dg/music/set/next, 1
2017.10.20 14:04:28 5: evaluating cmd: {($message eq "1")?fhem("set $device Next"):0;}
2017.10.20 14:04:28 5: calling DoSet(sonos_Wohnzimmer,next,1
2017.10.20 14:04:28 5: Notify for sonos_Wohnzimmer
2017.10.20 14:04:28 5: PlaylistPositionSec: 606, 'PlaylistPositionSec', '606'
2017.10.20 14:04:28 5: PlaylistPositionPct: 14, 'PlaylistPositionPct', '14'
2017.10.20 14:04:29 5: Notify for sonos_Wohnzimmer
2017.10.20 14:04:29 5: LastActionResult: Next: Success!, 'LastActionResult', 'Next: Success!'
2017.10.20 14:04:29 5: Notify for sonos_Wohnzimmer
2017.10.20 14:04:29 5: LastActionResult: Next: Success!, 'LastActionResult', 'Next: Success!'
2017.10.20 14:04:30 5: Notify for sonos_Wohnzimmer
2017.10.20 14:04:30 5: currentTrack: 4, 'currentTrack', '4'



Ich bin total ratlos :(
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Tobias

Hi,
nach vielem Debuggen auch innerhalb der fhem.pl habe ich den "Fehler endlich gefunden.
Problem ist, das die MQTT_Bridge bei einem SubscribeSet mit definiertem Command sowohl das interne "set <device> subscribtion" als auch das im Attribut definierte Command ausführt.

einfaches Bsp:
attr MQTT_Bridge_MPD_DG subscribeSet_previousXX{($message eq "1")?fhem("set $device Previous"):0;;} /home/dg/music/set/next;
ergibt folgedes Log wenn ich die fhem interne CallFn function logge:
2017.10.23 10:48:38 1: MyTest: Aufruf CallFn: sonos_Wohnzimmer - SetFn - SONOSPLAYER_Set : HASH(0x2b22230),sonos_Wohnzimmer,Previous
2017.10.23 10:48:38 5: calling DoSet(sonos_Wohnzimmer,previousXX,1
2017.10.23 10:48:38 1: MyTest: Aufruf CallFn: sonos_Wohnzimmer - SetFn - SONOSPLAYER_Set : HASH(0x2b22230),sonos_Wohnzimmer,previousXX,1


Es werden also 2 Kommandos durch MQTT_BRIDGE abgesetzt obwohl ich den SetBefehl ja mit dem Command überschrieben habe:
set sonos_Wohnzimmer Previous
set sonos_Wohnzimmer previousXX 1


Ist das works-as-designed? Oder ein Bug? Oder habe ich die Commandref nur nicht korrekt verstanden?
Ich habe verstanden, wenn ein Command angegeben ist, dann wird dieses ausgeführt und nichts weiter.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

hexenmeister

Zitat von: Tobias am 23 Oktober 2017, 11:07:57
Ist das works-as-designed? Oder ein Bug? Oder habe ich die Commandref nur nicht korrekt verstanden?
Ich habe verstanden, wenn ein Command angegeben ist, dann wird dieses ausgeführt und nichts weiter.
Works as designed. Je nach Rückgabewert des Ausdrucks wird das Set-Befehl ausgeführt oder eben nicht (default true=>ausführen). Wenn Du das nicht möchtest, schreibe einfach eine 0 am Ende. Also {....;;0}
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Tobias

Hi,
ich komm damit immer noch nicht so ganz klar. Folgendes Problem:
ich schicke folgende MEssage los:/home/dg/music/set/radio Radio.Teddy.m3u
Mein mqtt_Bridge Eintrag sieht so aus:attr MQTT_Bridge_MPD_DG subscribeSet_startradioX {($message ne "")?fhem("set $device playlist $message");;;;0} /home/dg/music/set/radio

Jetzt wird aber NUR ein einzigens Kommando abgesetzt, meine PERL Expression wird komplett ignoriert:startradioX Radio.Teddy.m3u

Ich bin ratlos und seh den fehler nicht....
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

hexenmeister

Auf den ersten Blick (kann gerade nicht ausprobieren) ist die Expression fehlerhaft. Der Operator ? Ist ternär, es fehlt der obligatorische letzte Part. Ersetze vlt. Besser durch IF und probiert vorher in der Konsole einzeln.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Tobias

der letzte Part war schuld. ICh dachte das er wirklich obligatorisch ist, also weggelassen werden kann. Dem ist leider nicht so. ICh habe einfach ein :"" angehängt und schon läuft es. DANKE :)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

hexenmeister

Du meinst sicher "optional". Obligatorisch bedeutet, man kann es nicht weglassen.  :)
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

jungeradleresw

Hallo in die Runde.

Ich habe auch das Problem.

Mit MQTTfx sehe ich das es 2 Nachrichten gibt.

Mein Aufbau:  Google ist mit https://about.gbridge.io verbunden, der MQTT-Broker fungiert als bridge zwischen der gBridge und FHEM und wird an den Fritdect Thermostat witergereicht.

Hier die .conf datei von mosquitto

connection kappelt-gbridge
address mqtt.gbridge.kappelt.net:8883
bridge_attempt_unsubscribe true
bridge_protocol_version mqttv31
cleansession true
remote_username gbridge-u###
remote_password Geheim
remote_clientid gbridge-u##-#######


topic gBridge/u###/+/+ both 0 "" ""
topic gBridge/u###/+/+/set both 0 "" ""
#topic cmnd/# in 0 SmartHome/ gBridge/u###/
#topic stat/# out 0 SmartHome/ gBridge/u###/
#you might need to change the path of the CA files
#This one is valid for most Debian based systems
bridge_capath /etc/ssl/certs/
bridge_tls_version tlsv1.2



Da ich in perl nicht so fit bin, finde ich keine Lösung.


defmod mqtt_du_Heizung_Schlafzimmer_EG MQTT_BRIDGE du_Heizung_Schlafzimmer_EG
attr mqtt_du_Heizung_Schlafzimmer_EG IODev Mosquitto
attr mqtt_du_Heizung_Schlafzimmer_EG group Schlafzimmer_EG
attr mqtt_du_Heizung_Schlafzimmer_EG publishReading_desiredTemperaturex gBridge/u###/d####/tempset-setpoint/set
attr mqtt_du_Heizung_Schlafzimmer_EG publishReading_modex gBridge/u###/d####/tempset-mode/set
attr mqtt_du_Heizung_Schlafzimmer_EG publishReading_temperature gBridge/u###/d####/tempset-ambient/set
attr mqtt_du_Heizung_Schlafzimmer_EG room MQTT_HM
attr mqtt_du_Heizung_Schlafzimmer_EG stateFormat transmission-state
attr mqtt_du_Heizung_Schlafzimmer_EG subscribeSet_desiredTemperature { fhem("set FBDECT_router_09995_0135518 desired-temp $message");;;; 0 } gBridge/u###/d####/tempset-setpoint
attr mqtt_du_Heizung_Schlafzimmer_EG subscribeSet_mode { if($message eq "off"){ fhem("set di_Heizung_Schlafzimmer_EG_Auto cmd_3");; 0 }elsif(($message eq "heat") || ($message eq "on")){ fhem("set di_Heizung_Schlafzimmer_EG_Auto cmd_1");; 0 }elsif($message eq "eco"){ fhem("set di_Heizung_Schlafzimmer_EG_Auto cmd_2");; 0 } } gBridge/u###/d####/tempset-mode



Über eure Hilfestellungen würde ich mich freuen.