Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Mehrfachauslösung von Schalter: wo kommt's her?

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Mehrfachauslösung von Schalter: wo kommt's her?

    This topic has been deleted. Only users with topic management privileges can see it.
    • I
      IobNordlicht last edited by

      Hi zusammen,

      ich hab hier einen vierfach Schalter mittels Zigbee, der an sich gut funktioniert.
      44322f27-e4cd-40bc-b024-925f01e0ac33-image.png
      Diesen möchte ich nutzen, um bestimmte MP3s lokal abzuspielen, um nicht mehr in's OG
      brüllen zu müssen 😁

      Leider 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);
      });
      

      b8066b10-7573-455a-a81c-42036e6436af-image.png

      Das ganze Thema Payload verstehe ich noch nicht, was ist das? Ein Rückgabewert bei Klick?

      Neugierige Grüße
      nordlicht

      Codierknecht I 2 Replies Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @IobNordlicht last edited by Codierknecht

        @iobnordlicht
        Super - den interessanten Teil hast Du weggeschnitten.

        Was soll ein switch(true) machen?
        true ist und bleibt true - da switcht nix.

        Kann man zwar auch so einsetzen, liest sich aber kacke.

        Versuch's mal so:

        308f90c6-fe22-4b49-b594-efd4894a7c45-image.png

        I 1 Reply Last reply Reply Quote 0
        • I
          IobNordlicht @Codierknecht last edited by

          @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 bleibt true - da switcht nix.

          Kann man zwar auch so einsetzen, liest sich aber kacke.

          Versuch's mal so:

          308f90c6-fe22-4b49-b594-efd4894a7c45-image.png

          Stimmt, das habe ich zu kompliziert gedacht. Sollte aber trotzdem gehen, oder nicht?
          Ich teste das gleich mal morgen und mach es clean...

          1 Reply Last reply Reply Quote 0
          • I
            IobNordlicht @IobNordlicht last edited by

            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?

            Codierknecht 1 Reply Last reply Reply Quote 0
            • Codierknecht
              Codierknecht Developer Most Active @IobNordlicht last edited by

              @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.

              I 1 Reply Last reply Reply Quote 0
              • I
                IobNordlicht @Codierknecht last edited by

                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?

                Asgothian 1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @IobNordlicht last edited by Asgothian

                  @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 und stderr mal mit loggen.

                  I 1 Reply Last reply Reply Quote 0
                  • I
                    IobNordlicht @Asgothian last edited by

                    @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:
                    aa8d7204-a2c7-4b99-b808-185c67e086cd-image.png

                    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...

                    I 1 Reply Last reply Reply Quote 0
                    • I
                      IobNordlicht @IobNordlicht last edited by

                      ..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.

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate
                      FAQ Cloud / IOT
                      HowTo: Node.js-Update
                      HowTo: Backup/Restore
                      Downloads
                      BLOG

                      868
                      Online

                      32.0k
                      Users

                      80.5k
                      Topics

                      1.3m
                      Posts

                      blockly doppelt exec javascript mehrfach trigger zigbee
                      3
                      9
                      408
                      Loading More Posts
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes
                      Reply
                      • Reply as topic
                      Log in to reply
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                      The ioBroker Community 2014-2023
                      logo