Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. ICal + Sayit

    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

    ICal + Sayit

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

      Кто нибудь уже дружил эти два драйвера? Есла да, поделитесь, пожалуйста, скриптом, думаю будет полезен и другим начинающим.

      Конечный вариант.

       `schedule("*/10 8-22 * * *", function () {
          //Получаем данные с iCal
          var i_Cal_Value = getState('ical.0.data.table').val;
          var i_Cal_Count = getState('ical.0.data.count').val;
          var date = new Date();
          var hour = date.getHours();
          //Время в которое будет проигрываться сообытие на весь день
          var hour_control = '9:00';
          var min = (date.getMinutes()<10?'0':'') + date.getMinutes();
          var time_now = hour + ':' + min;
          //Регулярное выражение, чтоб события из строки преобразовать в массив
          var reg = /\s* \s*/
      
          //проверям есть ли события на сегодня
          if ( i_Cal_Count > 0){
              for (var i = 0; i < i_Cal_Count; i++) {
                  var date_event = i_Cal_Value[i].date;
                  var time = date_event.split(reg);
                  //Воспроизведение события на целый день
                  if((date_event == 'Сегодня  ') && (time_now == hour_control)){
                      setState('sayit.0.tts.text', i_Cal_Value[i].event);
                  }
                  //Воспроизведение события по времени наступления
                  if(time[1] == time_now){
                      setState('sayit.0.tts.text', i_Cal_Value[i].event);
                  }
              }
          }
      });` [/i][/i][/i]
      
      1 Reply Last reply Reply Quote 0
      • S
        spectrekr last edited by

        Накропал что-то, даже вроде работает. За наводку, и часть кода спасибо Bluefox.

        `createState('tempOutside','');
        
        schedule("0/10 7-22 * * *", function () {
            var i_Cal_Value = getState('ical.0.data.table').val;
            var date = new Date();
            var hour = date.getHours();
            var min = (date.getMinutes()<10?'0':'') + date.getMinutes();
            var date_now = 'Сегодня '+ hour + ':' + min;
            var volume = getState('sayit.0.tts.volume').val;
        
            for (var i = 0; i < i_Cal_Value.length; i++) {
              var date_event = i_Cal_Value[i].date;
              if(date_event == date_now){
                 setState('sayit.0.tts.text',volume+';'+ i_Cal_Value[i].event);
                }
                else {
                  log('Событие '+ i_Cal_Value[i].event + ' пропущено');
                }
             }
        });` 
        Правда вот не знаю как будет работать, если событие продолжительное. Не проверял.[/i][/i][/i]
        
        1 Reply Last reply Reply Quote 0
        • Bluefox
          Bluefox last edited by

          События, которые длятся дольше 20 мин будут произносится каждые 10 минут пока они длятся.

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

            @spectrekr:

            if(date_event == date_now) `
            А зачем вообще такое сравнение?

            Вот я создал событие на весь день, смысл время указывать для дня рождения (соответственно время нету):

            [{"date":"Сегодня  ","event":"Тестовое день рождение","_class":"ical_Дни рождения ical_today","_date":"2015-07-27T18:00:00.000Z","_end":"2015-07-27T18:00:00.000Z","_IDID":"8jeciVb6yandex.ru","_allDay":false,"_rule":" rrule ","_calName":"Дни рождения"}]
            

            Есть вот такая переменная ical.0.data.count, может от нее отталкиваться? То есть если ical.0.data.count > 0 то отрабатываем?

            @spectrekr:

            log('Событие '+ i_Cal_Value__.event + ' пропущено');__ Не понял? Как пропущено, точнее не понял как такое событие может получится? Если только в моем примере выше. `

            1 Reply Last reply Reply Quote 0
            • S
              spectrekr last edited by

              @vtec:

              Есть вот такая переменная ical.0.data.count, может от нее отталкиваться? То есть если ical.0.data.count > 0 то отрабатываем?

              @spectrekr:

              log('Событие '+ i_Cal_Value__.event + ' пропущено');__ _Не понял? Как пропущено, точнее не понял как такое событие может получится? Если только в моем примере выше. _Этот лог делал для отладки, его можно исключить, про то что будет повторятся каждый 10 минут, потом уже догадался. Сейчас попробую посмотреть в сторону количества событий на день.

              Bluefox тот код что вы предложили, в соседней ветке, отрабатывает при каждом обновлении iCal, вот от него оттолкнулся. javaScript, честно, вижу вообще первый раз.__

              1 Reply Last reply Reply Quote 0
              • S
                spectrekr last edited by

                Доработал по замечаниям. Вторая версия скрипта)) У кого есть замечания и идеи по оптимизации или улучшению, буду благодарен.

                ! ```
                createState('tempOutside',''); ! schedule("*/10 8-22 * * *", function () { //Получаем данные с iCal var i_Cal_Value = getState('ical.0.data.table').val; var i_Cal_Count = getState('ical.0.data.count').val; var date = new Date(); var hour = date.getHours(); //Время в которое будет проигрываться сообытие на весь день var hour_control = '09:00'; var min = (date.getMinutes()<10?'0':'') + date.getMinutes(); var time_now = hour + ':' + min; //Получаем громкость синтезатора речи var volume = getState('sayit.0.tts.volume').val; var reg = /\s* \s*/ ! //проверям есть ли события на сегодня if ( i_Cal_Count > 0){ for (var i = 0; i < i_Cal_Count; i++) { var date_event = i_Cal_Value[i].date; var time = date_event.split(reg); //Воспроизведение события на целый день if((date_event == 'Сегодня ') && (time_now == hour_control)){ setState('sayit.0.tts.text',volume+';'+ i_Cal_Value[i].event); } //Воспроизведение события по времени наступления if(time[1] == time_now){ setState('sayit.0.tts.text',volume+';'+ i_Cal_Value[i].event); } } } });
                ! ~~[b]~~Bluefox[/b] подскажите пожалуйста в строке ~~[code]~~var volume = getState('sayit.0.tts.volume').val;[/code] мы громкость получаем в тесктовом виде, а можно ли уменьшить ее методом вычитания или надо преобразовывать в число, а потом обратно в текст?[/i][/i][/i]

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

                  То есть у вас в девять часов проговаривает, если есть событие?

                  На будущее, комментируйте код как можно больше, тогда легче соображать 🙂

                  1 Reply Last reply Reply Quote 0
                  • S
                    spectrekr last edited by

                    В 9 часов проговаривается событие на целый день, а остальные события по времени наступления.

                    Коментарии мое самое слабое место 😄

                    Отредоктировал последнее сообщение с коментариями.

                    1 Reply Last reply Reply Quote 0
                    • Bluefox
                      Bluefox last edited by

                      @spectrekr:

                      Bluefox подскажите пожалуйста в строкеvar volume = getState('sayit.0.tts.volume').val;мы громкость получаем в тесктовом виде, а можно ли уменьшить ее методом вычитания или надо преобразовывать в число, а потом обратно в текст? `
                      Что то я не пойму, что делает 0/10 в "0/10 8-22 * * *" ? Либо */10, либо 0-59/10.

                      В Javascript отнимать, умножать и делить можно и строку. Она будет автоматом сконвертирована в число, а вот прибавлять нельзя.

                      console.log("80" - 10) => 70
                      console.log("80" + 10) => "8010"
                      

                      Поэтому я всегда при получении значения преобразую его с parseInt(x, 10);

                      var volume = parseInt(getState('sayit.0.tts.volume').val, 10);
                      if (isNaN(volume)) volume = 100;
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • S
                        spectrekr last edited by

                        @Bluefox:

                        @spectrekr:

                        Что то я не пойму, что делает 0/10 в "0/10 8-22 * * *" ? Либо */10, либо 0-59/10.
                        Эту строчку взял со скрипта проговаривания времени, не стал изменять.

                        Поправил в скрипте 🙂

                        По громкости, в объектах значение присутствует, а вот в настройках где регулировать громкость не нашел. Или это берется уровень системной громкости?

                        Правильно понял, это будет работать?

                            if(hour == 22 ) volume = volume - 10;
                            if((hour == 7) && (hour == 8)) volume = volume - 30;
                        
                        
                        1 Reply Last reply Reply Quote 0
                        • E
                          electric69 last edited by

                          @spectrekr:

                          По громкости, в объектах значение присутствует, а вот в настройках где регулировать громкость не нашел. Или это берется уровень системной громкости?

                          Правильно понял, это будет работать?

                              if(hour == 22 ) volume = volume - 10;
                              if((hour == 7) && (hour == 8)) volume = volume - 30;
                          
                          ```` `  
                          

                          А зачем устанавливаете относительную громкость?

                          Не проще ли абсолютную?

                          Вот http://forum.iobroker.org/viewtopic.php?f=15&t=265 публиковал скрипт для CCU.IO, думаю оттуда можно взять работу с громкостью, принцип сам, функции чуть другие в ioBroker.

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

                            Тоже не понимаю извращения с громкостью.

                            Делай везде 100, а где нужно уменьшай до например 80

                            В моем же скрипте про время вот как:

                            var volume = 100;

                            if(hour == 23) volume = 80;

                            setState (idSayIt, volume+';Привет);

                            Зачем чего то там вычетать и складывать

                            1 Reply Last reply Reply Quote 0
                            • S
                              spectrekr last edited by

                              Извращение потому что уже 2 скрипта которые что-то проговаривают, может появится и еще, со временем. Хотел соответственно чтоб громкость была у вех одна, и уже регулировать только ее одну.

                              vtec вот именно что в вашем скрипте конкретно прописано, т.е. после смены колонок мне бы надо было регулировать параметры громкости во всех скриптах, где указана конкретная цифра. А вычитал, потому что не знал как устанавливать значения, только учусь 🙂 и пытаюсь разобраться.

                              А благодаря наводки electric69 накропал скрипт, который будет менять громкость в зависимости от времени, потом можно будет расширить функционал, например на присутствие в доме.

                              Может это и полное извращение, но мне удобней чтоб все настройки были в минимальном количестве мест.

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

                                Я не увидел, где ты громкость выставляешь обратно в 100%.

                                Представь 1-ый скрипт установил громкость в 80%, а через 10 минут отработает скрипт по новой, то твоя громкость будет составлять уже не 80%, а 60%. Т.к. переменная сама в 100% не возвращается.

                                Может я конечно чего то не знаю 🙂

                                Если ты заменишь колонку, то ты должен будешь выставить громкость на колонке, потому что громкость здесь измеряется в процентах, а не в децибелах. А давай смодулируем ситуацию, что у тебя не одна зона а пять, что ты будешь делать с громкостью?

                                Мы все здесь учимся, я ни в коем случае не назжаю, а пытаюсь понять и сделать скрипт как можно оптимальней и функциональней. Если окажется что твой вариант более гибкий, то я готов свой скрипт переписать 😉

                                1 Reply Last reply Reply Quote 0
                                • S
                                  spectrekr last edited by

                                  В данном скрипте вообще переменная просто берется из системы. В скрипте с временем, там строка определяющая основную громкость стоит первой, а потом уже по наступлению времени изменяет только на данное время, при следующем запуске скрипта будет начальная громкость. Опять же в этих обоих скриптах, уже в данный момент, параметры громкости только берутся из системной переменной. Убрал я это уменьшение 🙂 Оставил уменьшение в отдельном скрипте, которое может регулировать и зонально и по времени, и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди.

                                  Про колонку, настроил и спрятал далеко. Но вот моделируем ситуацию что рядом с домом\квартирой устроили ремонт и уровень постороннего шума поднялся, надо будет лезть и добавлять громкость на колонке. А по окончанию работ - убирать.

                                  Опять же, у меня нет системы сонос, может она по другому работает и можно более гибко сделать.

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

                                    @spectrekr:

                                    …. и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди. `
                                    А как вы определяете присутствие?

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

                                      @spectrekr:

                                      В данном скрипте вообще переменная просто берется из системы. `
                                      Если вы про это: var volume = getState('sayit.0.tts.volume').val;

                                      То все выше изложенное как раз про это. Вы взяли значение из переменной volume, потом изменяете (например -20) и сохраняете обратно. Если скрипт повторно отработает, то он снова возьмет из переменной sayit.0.tts.volume значение. А оно там будет уже не 100%, а 80% и соответственно еще раз уменьшится громкость на -20, но уже от 80%.

                                      Не знаю понятно ли объяснил 🙂

                                      @spectrekr:

                                      Убрал я это уменьшение 🙂 Оставил уменьшение в отдельном скрипте, которое может регулировать и зонально и по времени, и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди. `
                                      А вот это хорошая идея, вынести управление громкостью в отдельный скрипт и пусть он по шедулеру устанавливает громкость…. хм надо обдумать.

                                      @spectrekr:

                                      Про колонку, настроил и спрятал далеко. Но вот моделируем ситуацию что рядом с домом\квартирой устроили ремонт и уровень постороннего шума поднялся, надо будет лезть и добавлять громкость на колонке. А по окончанию работ - убирать.

                                      Опять же, у меня нет системы сонос, может она по другому работает и можно более гибко сделать. `
                                      У меня была такая ситуация, там где находилась колонка, я ее все равно слышал. А вот если уходишь например на кухню то там уже не слышно, но это уже другая история про мультирум 🙂
                                      4489_erstes_skript_mit_blockly.pdf

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

                                        @spectrekr:

                                        дабы не воспроизводил там где отсутствуют люди. `
                                        У вас есть многозонность? Как вы регулируете громкость в разных комнатах?

                                        1 Reply Last reply Reply Quote 0
                                        • S
                                          spectrekr last edited by

                                          @instalator:

                                          @spectrekr:

                                          …. и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди. А как вы определяете присутствие?
                                          Еще не делал, но, например, датчик движения.
                                          @vtec:

                                          Если вы про это: var volume = getState('sayit.0.tts.volume').val;

                                          То все выше изложенное как раз про это. Вы взяли значение из переменной volume, потом изменяете (например -20) и сохраняете обратно. Если скрипт повторно отработает, то он снова возьмет из переменной sayit.0.tts.volume значение. А оно там будет уже не 100%, а 80% и соответственно еще раз уменьшится громкость на -20, но уже от 80%. `
                                          Так он только берет и уменьшает на данное воспроизведение, объект он новое значение не записывает, для этого надо отдельно setState делать, что уже и выполняется у меня в отдельном скрипте. Так даже удобней получилось.

                                          @vtec:

                                          А вот это хорошая идея, вынести управление громкостью в отдельный скрипт и пусть он по шедулеру делает громкость…. хм надо обдумать. `
                                          Могу выложить свою вариацию. Уже работает 🙂

                                          @vtec:

                                          У меня была такая ситуация, там где находилась колонка, я ее все равно слышал. А вот если уходишь например на кухню то там уже не слышно, но это уже другая история про мультирум 🙂 `
                                          Мультирум чуть другая ситуация, комната бывает большой. И колонку не всегда получается в центр комнаты разместить, чтоб равномерно по комнате было. По-этому, в некоторой ситуации, может быть и не слышно.

                                          @vtec:

                                          У вас есть многозонность? Как вы регулируете громкость в разных комнатах? `
                                          Это пока в задумке, но думаю Bluefox с коллегами не зря сделал категории(комнаты) думаю от них можно будет оттолкнутся.

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

                                            @spectrekr:

                                            Так он только берет и уменьшает на данное воспроизведение, объект он новое значение не записывает, для этого надо отдельно setState делать, что уже и выполняется у меня в отдельном скрипте. Так даже удобней получилось. `
                                            Хм… понял, попробую проверить на самом деле так или нет.
                                            @spectrekr:

                                            Могу выложить свою вариацию. Уже работает 🙂 `
                                            Давайте конечно же. Если громкостью будет удбней из отдельного скрипта управлять, то в скрипте про время уберу тоже.

                                            @spectrekr:

                                            Это пока в задумке, но думаю Bluefox с коллегами не зря сделал категории(комнаты) думаю от них можно будет оттолкнутся. `
                                            А вот этого пока нет 🙂

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            775
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            25
                                            4929
                                            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