NEWS
ICal + Sayit
-
Кто нибудь уже дружил эти два драйвера? Есла да, поделитесь, пожалуйста, скриптом, думаю будет полезен и другим начинающим.
Конечный вариант.
`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] -
Накропал что-то, даже вроде работает. За наводку, и часть кода спасибо 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] -
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 то отрабатываем?
log('Событие '+ i_Cal_Value__.event + ' пропущено');__ Не понял? Как пропущено, точнее не понял как такое событие может получится? Если только в моем примере выше. `
-
Есть вот такая переменная ical.0.data.count, может от нее отталкиваться? То есть если ical.0.data.count > 0 то отрабатываем?
log('Событие '+ i_Cal_Value__.event + ' пропущено');__ _Не понял? Как пропущено, точнее не понял как такое событие может получится? Если только в моем примере выше. _Этот лог делал для отладки, его можно исключить, про то что будет повторятся каждый 10 минут, потом уже догадался. Сейчас попробую посмотреть в сторону количества событий на день.
Bluefox тот код что вы предложили, в соседней ветке, отрабатывает при каждом обновлении iCal, вот от него оттолкнулся. javaScript, честно, вижу вообще первый раз.__
-
Доработал по замечаниям. Вторая версия скрипта)) У кого есть замечания и идеи по оптимизации или улучшению, буду благодарен.
! ```
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] -
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; -
Что то я не пойму, что делает 0/10 в "0/10 8-22 * * *" ? Либо */10, либо 0-59/10.
Эту строчку взял со скрипта проговаривания времени, не стал изменять.Поправил в скрипте :-)
По громкости, в объектах значение присутствует, а вот в настройках где регулировать громкость не нашел. Или это берется уровень системной громкости?
Правильно понял, это будет работать?
if(hour == 22 ) volume = volume - 10; if((hour == 7) && (hour == 8)) volume = volume - 30; -
По громкости, в объектах значение присутствует, а вот в настройках где регулировать громкость не нашел. Или это берется уровень системной громкости?
Правильно понял, это будет работать?
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.
-
Тоже не понимаю извращения с громкостью.
Делай везде 100, а где нужно уменьшай до например 80
В моем же скрипте про время вот как:
var volume = 100;
if(hour == 23) volume = 80;
setState (idSayIt, volume+';Привет);
Зачем чего то там вычетать и складывать
-
Извращение потому что уже 2 скрипта которые что-то проговаривают, может появится и еще, со временем. Хотел соответственно чтоб громкость была у вех одна, и уже регулировать только ее одну.
vtec вот именно что в вашем скрипте конкретно прописано, т.е. после смены колонок мне бы надо было регулировать параметры громкости во всех скриптах, где указана конкретная цифра. А вычитал, потому что не знал как устанавливать значения, только учусь :-) и пытаюсь разобраться.
А благодаря наводки electric69 накропал скрипт, который будет менять громкость в зависимости от времени, потом можно будет расширить функционал, например на присутствие в доме.
Может это и полное извращение, но мне удобней чтоб все настройки были в минимальном количестве мест.
-
Я не увидел, где ты громкость выставляешь обратно в 100%.
Представь 1-ый скрипт установил громкость в 80%, а через 10 минут отработает скрипт по новой, то твоя громкость будет составлять уже не 80%, а 60%. Т.к. переменная сама в 100% не возвращается.
Может я конечно чего то не знаю :)
Если ты заменишь колонку, то ты должен будешь выставить громкость на колонке, потому что громкость здесь измеряется в процентах, а не в децибелах. А давай смодулируем ситуацию, что у тебя не одна зона а пять, что ты будешь делать с громкостью?
Мы все здесь учимся, я ни в коем случае не назжаю, а пытаюсь понять и сделать скрипт как можно оптимальней и функциональней. Если окажется что твой вариант более гибкий, то я готов свой скрипт переписать ;)
-
В данном скрипте вообще переменная просто берется из системы. В скрипте с временем, там строка определяющая основную громкость стоит первой, а потом уже по наступлению времени изменяет только на данное время, при следующем запуске скрипта будет начальная громкость. Опять же в этих обоих скриптах, уже в данный момент, параметры громкости только берутся из системной переменной. Убрал я это уменьшение :-) Оставил уменьшение в отдельном скрипте, которое может регулировать и зонально и по времени, и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди.
Про колонку, настроил и спрятал далеко. Но вот моделируем ситуацию что рядом с домом\квартирой устроили ремонт и уровень постороннего шума поднялся, надо будет лезть и добавлять громкость на колонке. А по окончанию работ - убирать.
Опять же, у меня нет системы сонос, может она по другому работает и можно более гибко сделать.
-
…. и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди. `
А как вы определяете присутствие? -
В данном скрипте вообще переменная просто берется из системы. `
Если вы про это: var volume = getState('sayit.0.tts.volume').val;То все выше изложенное как раз про это. Вы взяли значение из переменной volume, потом изменяете (например -20) и сохраняете обратно. Если скрипт повторно отработает, то он снова возьмет из переменной sayit.0.tts.volume значение. А оно там будет уже не 100%, а 80% и соответственно еще раз уменьшится громкость на -20, но уже от 80%.
Не знаю понятно ли объяснил :)
Убрал я это уменьшение :-) Оставил уменьшение в отдельном скрипте, которое может регулировать и зонально и по времени, и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди. `
А вот это хорошая идея, вынести управление громкостью в отдельный скрипт и пусть он по шедулеру устанавливает громкость…. хм надо обдумать.Про колонку, настроил и спрятал далеко. Но вот моделируем ситуацию что рядом с домом\квартирой устроили ремонт и уровень постороннего шума поднялся, надо будет лезть и добавлять громкость на колонке. А по окончанию работ - убирать.
Опять же, у меня нет системы сонос, может она по другому работает и можно более гибко сделать. `
У меня была такая ситуация, там где находилась колонка, я ее все равно слышал. А вот если уходишь например на кухню то там уже не слышно, но это уже другая история про мультирум :)
4489_erstes_skript_mit_blockly.pdf -
дабы не воспроизводил там где отсутствуют люди. `
У вас есть многозонность? Как вы регулируете громкость в разных комнатах? -
…. и вообще по присутствию в комнате, дабы не воспроизводил там где отсутствуют люди.
А как вы определяете присутствие?
Еще не делал, но, например, датчик движения.
@vtec:Если вы про это: var volume = getState('sayit.0.tts.volume').val;
То все выше изложенное как раз про это. Вы взяли значение из переменной volume, потом изменяете (например -20) и сохраняете обратно. Если скрипт повторно отработает, то он снова возьмет из переменной sayit.0.tts.volume значение. А оно там будет уже не 100%, а 80% и соответственно еще раз уменьшится громкость на -20, но уже от 80%. `
Так он только берет и уменьшает на данное воспроизведение, объект он новое значение не записывает, для этого надо отдельно setState делать, что уже и выполняется у меня в отдельном скрипте. Так даже удобней получилось.А вот это хорошая идея, вынести управление громкостью в отдельный скрипт и пусть он по шедулеру делает громкость…. хм надо обдумать. `
Могу выложить свою вариацию. Уже работает :-)У меня была такая ситуация, там где находилась колонка, я ее все равно слышал. А вот если уходишь например на кухню то там уже не слышно, но это уже другая история про мультирум :) `
Мультирум чуть другая ситуация, комната бывает большой. И колонку не всегда получается в центр комнаты разместить, чтоб равномерно по комнате было. По-этому, в некоторой ситуации, может быть и не слышно.У вас есть многозонность? Как вы регулируете громкость в разных комнатах? `
Это пока в задумке, но думаю Bluefox с коллегами не зря сделал категории(комнаты) думаю от них можно будет оттолкнутся. -
Так он только берет и уменьшает на данное воспроизведение, объект он новое значение не записывает, для этого надо отдельно setState делать, что уже и выполняется у меня в отдельном скрипте. Так даже удобней получилось. `
Хм… понял, попробую проверить на самом деле так или нет.
@spectrekr:Могу выложить свою вариацию. Уже работает :-) `
Давайте конечно же. Если громкостью будет удбней из отдельного скрипта управлять, то в скрипте про время уберу тоже.Это пока в задумке, но думаю Bluefox с коллегами не зря сделал категории(комнаты) думаю от них можно будет оттолкнутся. `
А вот этого пока нет :)
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden