Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Skript - Alexa Speak wenn zwei Bedingungen erfüllt

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Skript - Alexa Speak wenn zwei Bedingungen erfüllt

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 @nils50122 last edited by paul53

      @nils50122 sagte:

      Die rega Variable hat sich aktualisiert.
      Dieser Text soll auch nur bei "true" ausgeführt werden.
      Bei "false" soll ein anderer Text ausgeführt werden.

      So wird auch nur bei Wertänderung getriggert.

      const idSV = 'hm-rega.0.14932'; 
      const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb';
      const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak';
       
      on({id: idSV}, function(dp) { // triggert bei Aktualisierung
         if(!getState(idND).val) {
            let txt = 'anderer Text';
            if(dp.state.val) txt = 'Ich+habe+Regen+erkannt+und+das+Dachfenster+im+Ankleidezimmer+ist+noch+offen%21');
            setState(idSpeak, txt);
         }
      });
      
      nils50122 1 Reply Last reply Reply Quote 1
      • nils50122
        nils50122 @paul53 last edited by

        @paul53

        javascript.0	2020-07-10 07:20:47.824	error	(2329) at processTicksAndRejections (internal/process/task_queues.js:97:5)
        javascript.0	2020-07-10 07:20:47.823	error	(2329) at runMicrotasks (<anonymous>)
        javascript.0	2020-07-10 07:20:47.822	error	(2329) at /opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49
        javascript.0	2020-07-10 07:20:47.821	error	(2329) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
        javascript.0	2020-07-10 07:20:47.820	error	(2329) at /opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:608:33
        javascript.0	2020-07-10 07:20:47.819	error	(2329) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1112:17
        javascript.0	2020-07-10 07:20:47.818	error	(2329) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1521:17
        javascript.0	2020-07-10 07:20:47.817	error	(2329) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1468:37)
        javascript.0	2020-07-10 07:20:47.815	error	(2329) at compile (/opt/iobroker/node_modules/iobroker.javascript/main.js:1245:28)
        javascript.0	2020-07-10 07:20:47.814	error	(2329) at Object.createScript (vm.js:263:10)
        javascript.0	2020-07-10 07:20:47.813	error	(2329) at new Script (vm.js:88:7)
        javascript.0	2020-07-10 07:20:47.812	error	(2329) SyntaxError: Unexpected token ')'
        javascript.0	2020-07-10 07:20:47.811	error	(2329) ^
        javascript.0	2020-07-10 07:20:47.810	error	(2329) if(dp.state.val) txt = 'Ich+habe+Regen+erkannt+und+das+Dachfenster+im+Ankleidezimmer+ist+noch+offen%21');
        javascript.0	2020-07-10 07:20:47.808	error	at script.js.Alexa_TTS_Regenalarm_Ankleidezimmer_Soundbar_Wohnzimmer:8
        javascript.0	2020-07-10 07:20:47.808	error	(2329) script.js.Alexa_TTS_Regenalarm_Ankleidezimmer_Soundbar_Wohnzimmer compile failed:
        
        1 Reply Last reply Reply Quote 0
        • M
          mbw last edited by

          const idSV = 'hm-rega.0.14932'; 
          const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb';
          const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak';
           
          on({id: idSV}, function(dp) { // triggert bei Aktualisierung
             if(!getState(idND).val) {
                let txt = 'anderer Text';
                if(dp.state.val) txt = 'Ich+habe+Regen+erkannt+und+das+Dachfenster+im+Ankleidezimmer+ist+noch+offen%21';
                setState(idSpeak, txt);
             }
          });
          
          nils50122 1 Reply Last reply Reply Quote 1
          • nils50122
            nils50122 @mbw last edited by

            @mbw

            Hatte es in der Zwischenzeit schon selber gefunden, danke.

            @paul53 oder @mbw :

            Ich möchte nun die Anzahl der Scripts auf dem IOBroker reduzieren, bzw. hier nicht jedes mal den neuen Text definieren.

            Ich ändere nun die Systemvariable "Alexa_TTS" auf der HomeMatic und beschreibe diese mit dem Ausgabetext.
            Bei Aktualisierung der Systemvariable "Alexa_TTS" triggert ein HM-Programm die Rega im IOBroker zur sofortigen Aktualisierung.

            Wie ändere ich nun das Javascript ab, sodass es jedes mal wenn die SV aktualisiert wird, dessen Text als speak ausgibt? Natürlich unter Berücksichtigung des Do not disturb.

            1 Reply Last reply Reply Quote 0
            • M
              mbw last edited by

              Meinst du das so, also das der Wert den du einträgst auch ausgegeben wird?

              const idSV = 'hm-rega.0.14932'; 
              const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb';
              const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak';
               
              on({id: idSV}, function(dp) { // triggert bei Aktualisierung
                 if(!getState(idND).val) {
                    let txt = 'anderer Text';
                    if(dp.state.val) txt = dp.state.val;
                    setState(idSpeak, txt);
                 }
              });
              
              nils50122 1 Reply Last reply Reply Quote 1
              • nils50122
                nils50122 @mbw last edited by nils50122

                @mbw

                Genau, also es soll quasi jedes mal wenn sich die SV "Alexa_TTS" ändert dessen Inhalt (Text) ausgegeben werden.
                Das aber auch nur wenn donotdisturb auf false ist.
                Der Inhalt der SV "Alexa_TTS" wird von den HM-Programmen geschrieben.

                Mich iritiert nun ein wenig die Zeile "anderer Text", kann die nicht raus?

                Idealerweise setzen wir vor senden des speak commands (alexa2.0.Echo-Devices.xxxx.Commands.speak-volume) noch die Lautstärke auf z.B. 20 (kann ruhig im Script definiert werden)

                paul53 1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @nils50122 last edited by paul53

                  @nils50122 sagte:

                  "anderer Text", kann die nicht raus?

                  Ja.

                  const idSV = 'hm-rega.0.14932'; 
                  const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb';
                  const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak';
                   
                  on(idSV, function(dp) { // triggert bei Wertänderung
                     if(!getState(idND).val) setState(idSpeak, dp.state.val);
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • M
                    mbw last edited by

                    @nils50122 sagte in Skript - Alexa Speak wenn zwei Bedingungen erfüllt:

                    Idealerweise setzen wir vor senden des speak commands (alexa2.0.Echo-Devices.xxxx.Commands.speak-volume) noch die Lautstärke auf z.B. 20 (kann ruhig im Script definiert werden)

                    const idSV = 'hm-rega.0.14932'; 
                    const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands';
                    const ausgabelautstaerke = 20;
                     
                    on({id: idSV}, function(dp) { // triggert bei Aktualisierung
                        if(!getState(idSpeak + '.doNotDisturb').val) {
                            alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke);
                        }
                    });
                    
                    function alexaSprich(idAlexa, text, lautstaerke) {
                        var alteLautstaerke = getState(idAlexa + '.speak-volume').val;
                        setState(idAlexa + '.speak-volume', lautstaerke);
                        setState(idAlexa + '.speak', text);
                        setState(idAlexa + '.speak-volume', alteLautstaerke);
                    }
                    
                    nils50122 1 Reply Last reply Reply Quote 1
                    • nils50122
                      nils50122 @mbw last edited by

                      @mbw

                      Sogar mit dem setzen der alten Lautstärke, was ein Luxus 🙂
                      Klappt perfekt, besten Dank.

                      Die letzte bitte:

                      Ich würde eine zweite SV "Alexa TTS - High Prio" für Ausgaben die DoNotDisturb nicht interessiert, anlegen.

                      Welchen Teil im Skript muss ich löschen?

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        mbw @nils50122 last edited by

                        @nils50122 sagte in Skript - Alexa Speak wenn zwei Bedingungen erfüllt:

                        Ich würde eine zweite SV "Alexa TTS - High Prio" für Ausgaben die DoNotDisturb nicht interessiert, anlegen.
                        Welchen Teil im Skript muss ich löschen?

                        const idSV = 'hm-rega.0.14932'; 
                        const idSV2 = 'hm-rega.0.14933'; 
                        const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands';
                        const idSpeak2 = 'alexa2.0.Echo-Devices.yyDeviceIDyy.Commands';
                        const ausgabelautstaerke = 20;
                        const ausgabelautstaerke2 = 50;
                         
                        on({id: idSV}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus wenn doNotDisturb nicht gesetzt ist
                            if(!getState(idSpeak + '.Commands.doNotDisturb').val) {
                                alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke);
                            }
                        });
                        
                        on({id: idSV2}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus auch wenn doNotDisturb gesetzt ist
                            alexaSprich(idSpeak2, dp.state.val, ausgabelautstaerke2);
                        });
                        
                        function alexaSprich(idAlexa, text, lautstaerke) {
                            var alteLautstaerke = getState(idAlexa + '.speak-volume').val;
                            setState(idAlexa + '.speak-volume', lautstaerke);
                            setState(idAlexa + '.speak', text);
                            setState(idAlexa + '.speak-volume', alteLautstaerke);
                        }
                        
                        nils50122 1 Reply Last reply Reply Quote 0
                        • nils50122
                          nils50122 @mbw last edited by

                          @mbw

                          Wenn ich das richtig sehe, steuert das Skript nun zwei Devices an, oder?

                          Das soll schon beides auf dem selben ankommen.

                          M 1 Reply Last reply Reply Quote 0
                          • M
                            mbw @nils50122 last edited by

                            @nils50122 sagte in Skript - Alexa Speak wenn zwei Bedingungen erfüllt:

                            Das soll schon beides auf dem selben ankommen.

                            on({id: idSV2}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus auch wenn doNotDisturb gesetzt ist
                                alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke2);
                            });
                            
                            nils50122 1 Reply Last reply Reply Quote 1
                            • nils50122
                              nils50122 @mbw last edited by

                              @mbw

                              Anscheinend funktioniert das DoNotDisturb nicht korrekt (Übertragung IOBroker <-> Alexa).
                              Somit wurden wir nun schon mehrmals Nachts von der TTS geweckt.

                              Kriegen wir es hin zusätzlich in das bereits vorhandene Skript eine Zeitprüfung (Zeitfenster 08:00 Uhr - 22:00 Uhr erlaubt, danach nicht) einzubauen?

                              M 1 Reply Last reply Reply Quote 0
                              • M
                                mbw @nils50122 last edited by

                                @nils50122 Hier sollte doch doNotDisturb nicht beachtet werden.
                                Zeitprüfung:

                                const idSV = 'hm-rega.0.14932'; 
                                const idSV2 = 'hm-rega.0.14933'; 
                                const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands';
                                const idSpeak2 = 'alexa2.0.Echo-Devices.yyDeviceIDyy.Commands';
                                const ausgabelautstaerke = 20;
                                const ausgabelautstaerke2 = 50;
                                 
                                on({id: idSV}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus wenn doNotDisturb nicht gesetzt ist
                                    if(!getState(idSpeak + '.Commands.doNotDisturb').val && compareTime("08:00", "22:00", "between")) {
                                        alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke);
                                    }
                                });
                                 
                                on({id: idSV2}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus auch wenn doNotDisturb gesetzt ist
                                    if (compareTime("08:00", "22:00", "between")) {    
                                        alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke2);
                                    }
                                });
                                 
                                function alexaSprich(idAlexa, text, lautstaerke) {
                                    var alteLautstaerke = getState(idAlexa + '.speak-volume').val;
                                    setState(idAlexa + '.speak-volume', lautstaerke);
                                    setState(idAlexa + '.speak', text);
                                    setState(idAlexa + '.speak-volume', alteLautstaerke);
                                }
                                
                                nils50122 1 Reply Last reply Reply Quote 0
                                • nils50122
                                  nils50122 @mbw last edited by

                                  @mbw

                                  Gibt es eine Möglichkeit die Systemvariable (idSV und idSV2) nach erfolgreicher Übergabe zu leeren?

                                  Ansonsten gibt es momentan immer das Problem, dass bei einem Neustart z.B. der Rega-Instanz, des IOBrokers, der Raspberrymatic die Systemvariable noch einmal übergeben wird.

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

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  534
                                  Online

                                  31.7k
                                  Users

                                  79.8k
                                  Topics

                                  1.3m
                                  Posts

                                  3
                                  18
                                  1011
                                  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