NEWS
Mehrfachauslösung von Schalter: wo kommt's her?
-
Hi zusammen,
ich hab hier einen vierfach Schalter mittels Zigbee, der an sich gut funktioniert.
Diesen möchte ich nutzen, um bestimmte MP3s lokal abzuspielen, um nicht mehr in's OG
brüllen zu müssenLeider löst aber irgendetwas mehrfach aus. Ich vermute, dass daher die Audioausgabe nicht geht?
Außerdem bekomme ich vom Shellcommando den Output vermittels Variable result nicht geliefert, warum auch immer?Im folgenden Log habe ich Knopf#1 und #2 je einmal und dann doppelt gedrückt. Wie man sieht, wird es aber alles doppelt ausgelöst:
2024-01-25 14:59:42.792 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/nice-alida.mp3 2024-01-25 14:59:42.823 - warn: javascript.0 (101442) script.js.common.Schalter: 2024-01-25 14:59:42.792 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/nice-alida.mp3 2024-01-25 14:59:42.823 - warn: javascript.0 (101442) script.js.common.Schalter: 2024-01-25 14:59:45.084 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/ang-alida.mp3 2024-01-25 14:59:45.120 - warn: javascript.0 (101442) script.js.common.Schalter: 2024-01-25 14:59:45.084 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/ang-alida.mp3 2024-01-25 14:59:45.120 - warn: javascript.0 (101442) script.js.common.Schalter: 2024-01-25 14:59:47.204 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/nice-mj.mp3 2024-01-25 14:59:47.244 - warn: javascript.0 (101442) script.js.common.Schalter: 2024-01-25 14:59:47.204 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/nice-mj.mp3 2024-01-25 14:59:47.244 - warn: javascript.0 (101442) script.js.common.Schalter: 2024-01-25 14:59:50.407 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/ang-mj.mp3 2024-01-25 14:59:50.451 - warn: javascript.0 (101442) script.js.common.Schalter: 2024-01-25 14:59:50.407 - info: javascript.0 (101442) script.js.common.Schalter: exec: /usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/ang-mj.mp3 2024-01-25 14:59:50.451 - warn: javascript.0 (101442) script.js.common.Schalter:
Nach einiger Recherche habe ich ein paar Fehlerquellen ausgemerzt:
- send_payload am Objekt ist "true"
- Ich "höre" auf "true"
Folgend das javascript aus blockly. Bitte nicht am überflüssigen "if" in Zeile 7 aufhalten, das ist nur der Optik im blockly halber:
var arLinks, iIndex, sUrl, result; arLinks = ['nice-alida', 'nice-mj', 'nice-mama', 'nice-papa', 'ang-alida', 'ang-mj', 'einkaufen', 'fahren', 'essen', 'schlafen', 'gehen', 'maedels']; on({ id: [].concat(['alias.0.4fach_#1.1_single']).concat(['alias.0.4fach_#1.1_double']).concat(['alias.0.4fach_#1.1_hold']).concat(['alias.0.4fach_#1.2_single']).concat(['alias.0.4fach_#1.2_double']).concat(['alias.0.4fach_#1.2_hold']).concat(['alias.0.4fach_#1.3_single']).concat(['alias.0.4fach_#1.3_double']).concat(['alias.0.4fach_#1.3_hold']).concat(['alias.0.4fach_#1.4_single']).concat(['alias.0.4fach_#1.4_double']).concat(['alias.0.4fach_#1.4_hold']), val: true }, async (obj) => { iIndex = 0; if (true) { switch (true) { case (obj.common ? obj.common.name : "") == '1_single': iIndex = 1;break; case (obj.common ? obj.common.name : "") == '2_single': iIndex = 2;break; case (obj.common ? obj.common.name : "") == '3_single': iIndex = 3;break; case (obj.common ? obj.common.name : "") == '4_single': iIndex = 4;break; case (obj.common ? obj.common.name : "") == '1_double': iIndex = 5;break; case (obj.common ? obj.common.name : "") == '2_double': iIndex = 6;break; case (obj.common ? obj.common.name : "") == '3_double': iIndex = 7;break; case (obj.common ? obj.common.name : "") == '4_double': iIndex = 8;break; case (obj.common ? obj.common.name : "") == '1_hold': iIndex = 9;break; case (obj.common ? obj.common.name : "") == '2_hold': iIndex = 10;break; case (obj.common ? obj.common.name : "") == '3_hold': iIndex = 11;break; case (obj.common ? obj.common.name : "") == '4_hold': iIndex = 12;break; } } sUrl = ['/usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/',arLinks[(iIndex - 1)],'.mp3'].join(''); exec(sUrl, async (error, result, stderr) => { console.warn(result); }); console.warn("exec: " + sUrl); });
Das ganze Thema Payload verstehe ich noch nicht, was ist das? Ein Rückgabewert bei Klick?
Neugierige Grüße
nordlicht -
@iobnordlicht
Super - den interessanten Teil hast Du weggeschnitten.Was soll ein
switch(true)
machen?
true
ist und bleibttrue
- da switcht nix.Kann man zwar auch so einsetzen, liest sich aber kacke.
Versuch's mal so:
-
@codierknecht sagte in Mehrfachauslösung von Schalter: wo kommt's her?:
@iobnordlicht
Super - den interessanten Teil hast Du weggeschnitten.Was soll ein
switch(true)
machen?
true
ist und bleibttrue
- da switcht nix.Kann man zwar auch so einsetzen, liest sich aber kacke.
Versuch's mal so:
Stimmt, das habe ich zu kompliziert gedacht. Sollte aber trotzdem gehen, oder nicht?
Ich teste das gleich mal morgen und mach es clean... -
Wie zu erwarten, die Verzweigungslogik war umständlich, aber funktionierte ja bereits.
Interessanterweise ist dadurch aber trotzdem mein erstes Problem gelöst, keine Doppelauslösung, warum auch immer...Also zurück zu den weiteren Fragen:
@iobnordlicht sagte in Mehrfachauslösung von Schalter: wo kommt's her?:
Außerdem bekomme ich vom Shellcommando den Output vermittels Variable result nicht geliefert, warum auch immer?
[..]
Das ganze Thema Payload verstehe ich noch nicht, was ist das? Ein Rückgabewert bei Klick?Könnt ihr mir hier bittte weiterhelfen?
-
@iobnordlicht sagte in Mehrfachauslösung von Schalter: wo kommt's her?:
Das ganze Thema Payload verstehe ich noch nicht, was ist das? Ein Rückgabewert bei Klick?
Das kommt auf das jeweilige Gerät an.
Das kann etwas sein was das Gerät Dir mitteilen will oder auch etwas, was an das Gerät gesendet wird.
Oft als JSON. Wie das dann genau aufzubauen ist, ist von Gerät zu Gerät unterschiedlich. -
Ok, also doch nicht so einfach
Verbleibt noch das eigentliche Problem:
Warum löst das Kommando nicht aus und warum bekomme ich kein Output von der Ausführung, bzw. einen Fehler? -
@iobnordlicht sagte in Mehrfachauslösung von Schalter: wo kommt's her?:
Verbleibt noch das eigentliche Problem:
Warum löst das Kommando nicht aus und warum bekomme ich kein Output von der Ausführung, bzw. einen Fehler?Hast du mal geschaut ob am Zigbee Adapter (davon ist anscheinend die Kachel in deinem 1. Post) eine Reaktion kommt, so das der Trigger überhaupt aktiv wird ?
Das mit dem Payload wird nur erklärbar wenn du mal mehr dazu zeigst.
A.
Nachtrag: Du lässt dir nur den "result" ausgeben. ggf. hat der Befehl aber gar keine text-ausgebe als result, oder bringt sogar einen Fehler ?
Was passiert wenn du z.Bsp.
/usr/bin/mpg321 http://iobroker:8082/vis.0/FR/Audio/ang-mj.mp3
in der Konsole des ioBroker Rechners ausführst ?Ansonsten solltest du ggf. auch die variable
error
undstderr
mal mit loggen. -
@asgothian
Danke dir, bin jetzt heute noch mal sehr viel weiter gekommen:Ich habe nun mplayer verwendet, um mehr Ausgaben zu provozieren. ICh kann nun sehen, dass der Befehl aufgerufen wird, jedoch scheitert er, weil angeblich das Ausgabegerät belegt sei:
CommandLine: '-vo' 'null' '-v' '/opt/iobroker/vis.0/FR/Audio/gehen.mp3' Playing /opt/iobroker/vis.0/FR/Audio/gehen.mp3. get_path('sub/') -> '/opt/iobroker/.mplayer/sub/' [file] File size is 45292 bytes STREAM: [file] /opt/iobroker/vis.0/FR/Audio/gehen.mp3 STREAM: Description: File STREAM: Author: Albeu libavformat version 58.76.100 (external) Trying demuxer 17 based on filename extension ==> Found audio stream: 0 demux_audio: seeking from 0xB0E6 to start pos 0xAC demux_audio: audio data 0xAC - 0xB0EC Audio only file format detected. Load subtitles in /opt/iobroker/vis.0/FR/Audio/ get_path('sub/') -> '/opt/iobroker/.mplayer/sub/' ========================================================================== Opening audio decoder: [mpg123] MPEG 1.0/2.0/2.5 layers I, II, III dec_audio: Allocating 8192 + 131072 = 139264 bytes for output buffer. MPEG 1.0 layer III, VBR, 48000 Hz joint-stereo AUDIO: 48000 Hz, 2 ch, s16le, 128.0 kbit/8.33% (ratio: 16000->192000) Selected audio codec: [mpg123] afm: mpg123 (MPEG 1.0/2.0/2.5 layers I, II, III) ========================================================================== Building audio filter chain for 48000Hz/2ch/s16le -> 0Hz/0ch/??... [libaf] Adding filter dummy [dummy] Was reinitialized: 48000Hz/2ch/s16le [dummy] Was reinitialized: 48000Hz/2ch/s16le Trying preferred audio driver 'pulse', options '[none]' Trying preferred audio driver 'alsa', options '[none]' alsa-init: requested format: 48000 Hz, 2 channels, 9 alsa-init: using ALSA 1.2.6.1 alsa-init: setup for 1/2 channel(s) alsa-init: using device default alsa-init: opening device in blocking mode Trying preferred audio driver 'sdl', options 'aalib' [AO SDL] Samplerate: 48000Hz Channels: Stereo Format s16le [AO SDL] using aalib audio driver. Uninit audio filters... [libaf] Removing filter dummy Uninit audio: mpg123 Audio: no sound Freeing 0 unused audio chunks. Video: no video Freeing 0 unused video chunks. vo: x11 uninit called but X11 not initialized.. Exiting... (End of file) stderr= do_connect: could not connect to socket connect: No such file or directory Failed to open LIRC support. You will not be able to use your remote control. AO: [pulse] Init failed: Connection refused Failed to initialize audio driver 'pulse' [AO_ALSA] alsa-lib: pcm_hw.c:1716:(snd_pcm_hw_open) open '/dev/snd/pcmC0D0p' failed (-16): Device or resource busy [AO_ALSA] alsa-lib: pcm_dmix.c:1032:(snd_pcm_dmix_open) unable to open slave [AO_ALSA] Playback open error: Device or resource busy Failed to initialize audio driver 'alsa' [AO SDL] Unable to open audio: No available audio device Failed to initialize audio driver 'sdl:aalib' Could not open/initialize audio device -> no sound.
Lustig ist, dass ich als eingeloggter User iobroker überhaupt keine Schwierigkeiten mit exakt dem gleichen Befehl habe?
Der User und die Gruppen passt auch:
Und bitte geflissentlich jetztet die Gruppe sudo ignorieren, hat wohlüberlegte debugging Gründe, wie z.B. genau jetzt.
Warum gibt es einen Unterschied zwischen der Ausführung in
exec
und lokaler user shell? Beide laufen unter dem gleichen User, den gleichen Gruppen... -
..und wieder etwas gelernt, irgendwie kommen sich ALSA und Pulseaudio server in die Quere... Ok, ich denke, damit ist es zwar nicht gelöst, aber das Thema des Threads passt nimmer.