FHEM - Hausautomations-Systeme > MQTT

MQTT Bridge, Set Kommandos werden immer doppelt ausgeführt

(1/2) > >>

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

--- Code: ---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
--- Ende Code ---

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 :(

--- Code: ---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'

--- Ende Code ---


Ich bin total ratlos :(

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:

--- Code: ---attr MQTT_Bridge_MPD_DG subscribeSet_previousXX{($message eq "1")?fhem("set $device Previous"):0;;} /home/dg/music/set/next;
--- Ende Code ---
ergibt folgedes Log wenn ich die fhem interne CallFn function logge:

--- Code: ---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
--- Ende Code ---

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

--- Code: ---set sonos_Wohnzimmer Previous
set sonos_Wohnzimmer previousXX 1
--- Ende Code ---

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.

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.

--- Ende Zitat ---
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}

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

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

Ich bin ratlos und seh den fehler nicht....

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.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln