Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. Голосовое управление

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Голосовое управление

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

      @aurodionov:

      на мобильном работает распознавание, но скрипту похоже не передается

      да , на компе в хроме тоже работает распознование `
      if (voice == 'включить+свет'){ пропиши без + 'включить свет'

      1 Reply Last reply Reply Quote 0
      • I
        instalator last edited by

        @Haus:

        @aurodionov:

        на мобильном работает распознавание, но скрипту похоже не передается

        да , на компе в хроме тоже работает распознование if (voice == 'включить+свет'){ пропиши без + 'включить свет'
        Это ничего не изменит, так как уже добавлено:

         var voice = obj.newState.val.toLowerCase().toString().replace(/\ /g, "+");
        

        И с компа у мня работает этот скрипт, а вот на телефоне ни в одном браузере нет, даже не просит сказать фразу, вообще не реагирует на кнопку.

        1 Reply Last reply Reply Quote 0
        • H
          Haus last edited by

          @instalator:

          @Haus:

          @aurodionov:

          на мобильном работает распознавание, но скрипту похоже не передается

          да , на компе в хроме тоже работает распознование if (voice == 'включить+свет'){ пропиши без + 'включить свет'
          Это ничего не изменит, так как уже добавлено:

           var voice = obj.newState.val.toLowerCase().toString().replace(/\ /g, "+");
          

          И с компа у мня работает этот скрипт, а вот на телефоне ни в одном браузере нет, даже не просит сказать фразу, вообще не реагирует на кнопку. `
          У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+" 🙂

          Даже пикает как окей гугл.

          1 Reply Last reply Reply Quote 0
          • I
            instalator last edited by

            @Haus:

            У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+" 🙂 `
            Это потому что таскер отдает с + вместо пробела, добавь строчку как я написал выше

            1 Reply Last reply Reply Quote 0
            • H
              Haus last edited by

              @instalator:

              @Haus:

              У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+" 🙂 Это потому что таскер отдает с + вместо пробела, добавь строчку как я написал выше
              Строчку добавлю, спасибо. У тебя заработал в хроме?

              P.S добавил строчку работает с "+".

              1 Reply Last reply Reply Quote 0
              • I
                instalator last edited by

                @Haus:

                @instalator:

                @Haus:

                У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+" 🙂 Это потому что таскер отдает с + вместо пробела, добавь строчку как я написал выше
                Строчку добавлю, спасибо. У тебя заработал в хроме? `
                Я же говорю что на телефоне вообще не реагирует на кнопку, на компе работает. С телефона я пользуюсь таскером, и в браузере на телефоне мне эта функция не нужна.

                1 Reply Last reply Reply Quote 0
                • V
                  Vlad_k last edited by

                  @Haus:

                  if (voice == 'включить+свет'){ пропиши без + 'включить свет' `
                  как по мне так лучше не сравнивать на полное совпадение по фразе, а искать вхождения подстроки в строке тогда можно построить более гибкую логику распознавания команд, под брокер пока не делал а в охабе у меня так:

                  if (command.contains("вет") && command.contains("спал") && command.contains("вкл")) {

                  sendCommand(Light_FF_Bed_Ceiling, "ON")

                  say(command)

                  }

                  1 Reply Last reply Reply Quote 0
                  • I
                    instalator last edited by

                    @Vlad_k:

                    @Haus:

                    if (voice == 'включить+свет'){ пропиши без + 'включить свет' `
                    как по мне так лучше не сравнивать на полное совпадение по фразе, а искать вхождения подстроки в строке тогда можно построить более гибкую логику распознавания команд, под брокер пока не делал а в охабе у меня так:

                    if (command.contains("вет") && command.contains("спал") && command.contains("вкл")) {

                    sendCommand(Light_FF_Bed_Ceiling, "ON")

                    say(command)

                    } `
                    Я думал над этим, и хочу полностью переписать свой скрипт, думаю как сделать обучаемую систему, чтобы при новых командах можно было назначить действие… Хотя это уже нужен не скрипт а драйвер, чтобы было что то на подобии таблицы команд("синонимов") и действий.

                    А вообще в идеале прикрутить нейронку 🙂

                    1 Reply Last reply Reply Quote 0
                    • V
                      Vlad_k last edited by

                      @instalator:

                      А вообще в идеале прикрутить нейронку 🙂 `
                      да не слишком жирно 😄

                      я вижу такую реализацию, массив многомерный:

                      команды голосом–

                      место- устройство-свойства-параметр-действие

                      зал++++свет+++ яркость+++50%

                      зал++++свет++++++++++++++++вкл

                      зал++++свет++++++++++++++++выкл

                      зал++++телек++громкость++30%

                      функция проходит по таблице и возвращает вхождения по столбцам строкам в виде чисел, а на числа ставим уже обработчик...

                      1 Reply Last reply Reply Quote 0
                      • I
                        instalator last edited by

                        Скрипт разросся, решил немного переписать и унифицировать.

                        Часть моего скрипта второй итерации:

                        ! ````
                        /////////////Голосовое управление/////////////////////////////
                        on({id: 'javascript.0.Voice.Command', change: 'any'}, function (obj) {
                        var voice = obj.newState.val.toLowerCase();
                        VoiceCommands (voice);
                        });
                        ! function VoiceCommands (voice){

                        var SceneKodi     = getState('javascript.0.Scenes.Kodi').val;
                        var SceneTV       = getState('javascript.0.Scenes.TV').val;
                        var tempKitchen   = getState('mqtt.0.myhome.Kitchen.Temp_room').val;
                        var tempBedroom   = getState('mqtt.0.myhome.Bedroom.Temp_room').val;
                        var tempBathroom  = getState('mqtt.0.myhome.Bathroom.Temp_room').val;
                        var tempin        = getState('mqtt.0.myhome.Bedroom.Temp_in').val;
                        var Volume        = parseInt(getState('onkyo.0.master-volume').val, 10);
                        var ttsVolume     = parseInt(getState('sayit.0.tts.volume').val, 10);
                        
                        var voiceArr =  voice.split('+');
                        log('Вся переменная - ' + voice);
                        log('Массив - '+ voiceArr);
                        

                        ! function found (cmd){
                        cmd = String(cmd);
                        if (~voice.indexOf(cmd)){
                        return true;
                        } else {
                        return false;
                        }
                        }

                        var FoundNum = function(voice){
                        var num =parseInt(voice.replace(/\D+/, ''), 10);
                        if (num !== isNaN){
                        return num;
                        } else {
                        return false;
                        }
                        };
                        /***************Регулировка громкости/////////////
                        if ((found('тише') || found('тиши') || found('убавь') || found('кеша') || found('сделайте+же') || found('ты+же')) && !found('говор') && !found('оповещ') && !found('помещ')){
                        if (FoundNum(voice) && found('на')){
                        setState('onkyo.0.master-volume', Volume - FoundNum(voice));
                        }
                        else if (FoundNum(voice) && !found('на')){
                        setState('onkyo.0.master-volume', FoundNum(voice));
                        }
                        else if (!FoundNum(voice)){
                        setState('onkyo.0.master-volume', Volume - 3);
                        }
                        }

                        if ((found('громче') || found('прибавь') || found('громк')) && !found('говор') && !found('оповещ') && !found('помещ')){
                          if (FoundNum(voice) && found('на')){
                            setState('onkyo.0.master-volume', Volume + FoundNum(voice));
                          }
                          else if (FoundNum(voice) && !found('на')){
                            setState('onkyo.0.master-volume', FoundNum(voice));
                          } 
                          else if (!FoundNum(voice)){
                            setState('onkyo.0.master-volume', Volume + 3);
                          }
                        }
                        

                        /Управление громкостью Sayit**/
                        if (found('говор') || (found('оповещ') || found('помещ'))){ //помещения оповещени
                        if (FoundNum(voice)){
                        setState('sayit.0.tts.volume', FoundNum(voice));
                        ttsVolume = getState('sayit.0.tts.volume').val;
                        setState('sayit.0.tts.text', 'Громкость оповещения установлена на ' + ttsVolume+'.');
                        }
                        else {
                        if (found('гром')){
                        setState('sayit.0.tts.volume', ttsVolume+10);
                        ttsVolume = getState('sayit.0.tts.volume').val;
                        setState('sayit.0.tts.text', 'Громкость оповещения установлена на ' + ttsVolume+'.');
                        }
                        if (found('тише')){
                        setState('sayit.0.tts.volume', ttsVolume-10);
                        ttsVolume = getState('sayit.0.tts.volume').val;
                        setState('sayit.0.tts.text', 'Громкость оповещения установлена на ' + ttsVolume+'.');
                        }
                        }
                        }
                        /Аквасторож************************/
                        if (found('воду') || found('вода') || found('году') || found('лада')){
                        if (found('закр') || found('выкл') || found('пере')){
                        setState('mqtt.0.myhome.NRF.AquaStoroj.ButtonClose', '1');
                        setState('sayit.0.tts.text', 'Вода перекрыта');
                        }
                        if (found('откр')){
                        setState('mqtt.0.myhome.NRF.AquaStoroj.ButtonOpen', '1');
                        setState('sayit.0.tts.text', 'Вода открыта');
                        }
                        }
                        /Приточка*************/
                        if (found('приточ') || found('проточ') || found('вентил')){
                        var BedRoomMin = 70;
                        var BedRoomMax = 131;
                        var GuestRoomMin = 94;
                        var GuestRoomMax = 163;
                        if (found('спал')){
                        if (FoundNum(voice) && FoundNum(voice) >= 0 && FoundNum(voice) <= 100){
                        setState('mqtt.0.myhome.Bedroom.Servo', ((BedRoomMax - BedRoomMin) / 100) * FoundNum(voice) + BedRoomMin); //70+(*0.61)
                        }
                        if (found('откр')){
                        setState('mqtt.0.myhome.Bedroom.Servo', BedRoomMax);
                        }
                        if (found('закр')){
                        setState('mqtt.0.myhome.Bedroom.Servo', BedRoomMin);
                        }
                        }
                        if (found('зал')){
                        if (FoundNum(voice) && FoundNum(voice) >= 0 && FoundNum(voice) <= 100){
                        setState('mqtt.0.myhome.Guestroom.Servo', ((GuestRoomMax - GuestRoomMin) / 100) * FoundNum(voice) + GuestRoomMin);
                        }
                        if (found('откр')){
                        setState('mqtt.0.myhome.Guestroom.Servo', GuestRoomMax);
                        }
                        if (found('закр')){
                        setState('mqtt.0.myhome.Guestroom.Servo', GuestRoomMin);
                        }
                        }
                        }
                        /*****************Освещение///////////////
                        function Invert (id){
                        if (!found('вкл') && !found('выкл')){
                        IdVal = getState(id).val;
                        if (IdVal === 1 || IdVal === '1'){
                        setState(id, '0');
                        } else {
                        setState(id, '1');
                        }
                        } else {
                        if (found('вкл')){
                        setState(id, '1');
                        }
                        if (found('выкл')){
                        setState(id, '0');
                        }
                        }
                        }

                        if (found('свет') || found('глазк')){
                          if (found('спал')){
                            if (found('глаз')){
                              Invert ('mqtt.0.myhome.Lighting.BedRoom_Additional');
                            } else {
                              Invert ('mqtt.0.myhome.Lighting.BedRoom_Main');
                            }
                          }
                          if (found('зал')){
                            if (found('весь')){
                              Invert ('mqtt.0.myhome.Lighting.GuestRoom_Additional');
                              Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main');
                              Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main2');
                            }
                            if (found('глаз')){
                              Invert ('mqtt.0.myhome.Lighting.GuestRoom_Additional');
                            }
                            else {
                              Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main2');
                              Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main');
                              Invert ('mqtt.0.myhome.Lighting.GuestRoom_Additional');
                            }
                          }
                          if (found('кухн')){
                            if (found('глаз')){
                              Invert ('mqtt.0.myhome.Lighting.Kitchen_Additional');
                            } else {
                              Invert ('mqtt.0.myhome.Lighting.Kitchen_Main');
                            }
                          }
                          if (found('ванн')){
                            if (found('зерк')){
                              Invert ('mqtt.0.myhome.Lighting.BathRoom_Additional');
                            } else {
                              Invert ('mqtt.0.myhome.Lighting.BathRoom_Main');
                            }
                          }
                          if (found('кор') || found('при')){
                              Invert ('mqtt.0.myhome.Lighting.Hall_Main');
                          }
                        }
                        

                        /******************************************************************/
                        if ( found('домоф') || found('двер') ){
                        var DomofonRing = getState('mqtt.0.myhome.Mother.DomofonRing').val;
                        if ((DomofonRing === '1' || DomofonRing === 1)){
                        setState('mqtt.0.myhome.Mother.DomofonOpen', '1');
                        } else {
                        setState('sayit.0.tts.text', 'Режим автооткрытия домофОна активирован! ');
                        setState('javascript.0.Scenes.DomofonAutoOpen', '1');
                        }
                        if (found('откл') || found('выкл')){
                        setState('sayit.0.tts.text', 'Режим автооткрытия домофОна отключен!');
                        setState('javascript.0.Scenes.DomofonAutoOpen', '0');
                        }
                        }
                        }

                        
                        Добавлено:
                        
                        Скрипт получился удобный, можно давать несколько команд УД в одном предложении.
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        387
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        4
                        20
                        5270
                        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