NEWS
Вопросы по написанию скриптов
-
Появилась задача включать выключать драйвер из скрипта. Необходимость возникла по следующей причине - драйвер, работающий с оборудованием, в случае отключения оборудования продолжает пытаться до него достучаться и слать ошибки в логи. Оборудование не всегда должно быть включенным. Поэтому логично с выключением оборудования принудительно отключать и драйвер, занимающийся его опросом.
Управление драйвером пробовал делать через setState, к примеру в тесте управления включением-выключением history:
setState("system.adapter.history.0.alive", true); и setState("system.adapter.history.0.alive", false);
Оно так работает и я получаю желаемое. Но… отключение драйвера - все нормально, а вот включение всякий раз дает ошибку в логе (но в итоге все равно делает что надо):
history.0 2017-04-27 11:22:54.125 info starting. Version 1.6.2 in /opt/iobroker/node_modules/iobroker.history, node: v4.8.2
host.AdavHome 2017-04-27 11:22:53.290 info instance system.adapter.history.0 started with pid 11319
host.AdavHome 2017-04-27 11:22:23.277 info Restart adapter system.adapter.history.0 because enabled
host.AdavHome 2017-04-27 11:22:23.276 error instance system.adapter.history.0 terminated with code 7 (Adapter already running)
host.AdavHome 2017-04-27 11:22:22.402 info instance system.adapter.history.0 started with pid 11285
host.AdavHome 2017-04-27 11:22:22.402 info "system.adapter.history.0" enabled
host.AdavHome 2017-04-27 11:22:22.402 info object change system.adapter.history.0
Такое ощущение, что система думает что драйвер уже запущен и сначала его останавливает и только потом запускает. И всякий раз ошибка в лог. Ну и такое отрабатывает заметно медленнее, чем при включении руками.
Может есть какой-то способ сделать это иначе или я что-то не так делаю?
-
Появилась задача включать выключать драйвер из скрипта. Необходимость возникла по следующей причине - драйвер, работающий с оборудованием, в случае отключения оборудования продолжает пытаться до него достучаться и слать ошибки в логи. Оборудование не всегда должно быть включенным. Поэтому логично с выключением оборудования принудительно отключать и драйвер, занимающийся его опросом.
Управление драйвером пробовал делать через setState, к примеру в тесте управления включением-выключением history:
setState("system.adapter.history.0.alive", true); и setState("system.adapter.history.0.alive", false);
Оно так работает и я получаю желаемое. Но… отключение драйвера - все нормально, а вот включение всякий раз дает ошибку в логе (но в итоге все равно делает что надо):
history.0 2017-04-27 11:22:54.125 info starting. Version 1.6.2 in /opt/iobroker/node_modules/iobroker.history, node: v4.8.2
host.AdavHome 2017-04-27 11:22:53.290 info instance system.adapter.history.0 started with pid 11319
host.AdavHome 2017-04-27 11:22:23.277 info Restart adapter system.adapter.history.0 because enabled
host.AdavHome 2017-04-27 11:22:23.276 error instance system.adapter.history.0 terminated with code 7 (Adapter already running)
host.AdavHome 2017-04-27 11:22:22.402 info instance system.adapter.history.0 started with pid 11285
host.AdavHome 2017-04-27 11:22:22.402 info "system.adapter.history.0" enabled
host.AdavHome 2017-04-27 11:22:22.402 info object change system.adapter.history.0
Такое ощущение, что система думает что драйвер уже запущен и сначала его останавливает и только потом запускает. И всякий раз ошибка в лог. Ну и такое отрабатывает заметно медленнее, чем при включении руками.
Может есть какой-то способ сделать это иначе или я что-то не так делаю? `
alive - это ка бы индикатор для чтенияВ драйвере Javascript включи опцию Разрешить команду "setObject"
var obj = getObject("system.adapter.history.0"); obj.common.enabled = false; //or true setObject("system.adapter.history.0", obj);
-
Разобрался, все работает, спасибо!
-
Function "setObject" is not allowed. Use adapter settings to allow it.
В каком месте у адаптера это разрешается? `
В админке драйвера Javascript включи опцию Разрешить команду "setObject" -
Оказалось можно одной строкой при той же идее, проверил - нормально!
extendObject('system.adapter.history.0', {common: {enabled: false}});
ну и соответственно true
Еще раз спасибо!
-
Доброго дня. Поможите советом: как запустить скрипт по нажатию кнопки и то же самое по времени.
-
Доброго дня. Поможите советом: как запустить скрипт по нажатию кнопки и то же самое по времени. `
В vis, виджет кнопка, ID объекта javascript.0.scriptEnabled.scriptnamevar volumeId = "sayit.0.tts.volume"; // Устанавливаем в 6:59 громкость 90 schedule("59 6 * * *", function(){ setState(volumeId,90,function(){ log('Установлена громкость '+ getState(volumeId).val); }); });
или так
// Скрипт запускается каждые 10 сек. function temperatur() { сам скрипт } schedule('*/10 * * * * *', temperatur); temperatur();
-
Ага, спасиб. По времени интересует типа отправить в 7, 12 и 17 часов, а еще сообщить о событии через 30 минут после его начала.
Типа включился насос и если через 30 минут он не выключился - ТРЕВОГА…... А если выключился - то молчим в тряпочку.
-
Ага, спасиб. По времени интересует типа отправить в 7, 12 и 17 часов, а еще сообщить о событии через 30 минут после его начала.
Типа включился насос и если через 30 минут он не выключился - ТРЕВОГА…... А если выключился - то молчим в тряпочку. `
Ищи на форуме скрипт часов -
Угум-с и так уже начинаю немецкий изучать :lol: :lol: :lol:
-
Угум-с и так уже начинаю немецкий изучать :lol: :lol: :lol: `
На русском, в немецкой ветке примеров конечно пабольше -
О как! Использую скрипт от electric69 а вот этот топик как то пропустил… Ща попробуем.
-
вопрос. почему этот скрипт шлет сообщения каждую минуту, где я накосячил?
schedule("* 7,12,17 * * *", function () {
log("Сообщение о температуре дома");
//setState (idSayIt, volume+';'+hour+':'+min+';Температура на улице:'+temp2.val+' °');
sendTo("telegram.0", "Температура на улице: " +getState("mqtt.0.myhome.Temp.Street").val+' °'+", в Зале: " +getState("mqtt.0.myhome.Temp.Zal").val+' °'+", в Гараже: " +getState("mqtt.0.myhome.Temp.Garage").val+' °'+", на Кухне: " +getState("mqtt.0.myhome.Temp.Kitchen").val+' °'+", на Мансарде :" +getState("mqtt.0.myhome.Temp.Mansarda").val+' °');
});
По идее должен отправлять в 7, 12 и 17 часов. начинает слать в 7 и потом ежеминутно пока не выключишь. меня хватает на 5 мин.
-
лог:
javascript.0 2017-05-04 07:11:00.960 info script.js.Статус_Дома.Отчет_о_температуре: Сообщение о температуре дома
mqtt.0 2017-05-04 07:10:02.572 info send2Server sayit.0.tts.playing[sayit/0/tts/playing]
sayit.0 2017-05-04 07:10:01.867 info saying: 7:10 Пора выходить на работу!
javascript.0 2017-05-04 07:10:00.972 info script.js.Статус_Дома.Отчет_о_температуре: Сообщение о температуре дома
mqtt.0 2017-05-04 07:10:00.865 info send2Server sayit.0.tts.playing[sayit/0/tts/playing]
sayit.0 2017-05-04 07:10:00.849 info saying: C:\ioBroker\node_modules\iobroker.sayit/scifi.mp3
mqtt.0 2017-05-04 07:10:00.834 info send2Server sayit.0.tts.text[sayit/0/tts/text]
-
вопрос. почему этот скрипт шлет сообщения каждую минуту, где я накосячил?
schedule("* 7,12,17 * * *", function () {
log("Сообщение о температуре дома");
//setState (idSayIt, volume+';'+hour+':'+min+';Температура на улице:'+temp2.val+' °');
sendTo("telegram.0", "Температура на улице: " +getState("mqtt.0.myhome.Temp.Street").val+' °'+", в Зале: " +getState("mqtt.0.myhome.Temp.Zal").val+' °'+", в Гараже: " +getState("mqtt.0.myhome.Temp.Garage").val+' °'+", на Кухне: " +getState("mqtt.0.myhome.Temp.Kitchen").val+' °'+", на Мансарде :" +getState("mqtt.0.myhome.Temp.Mansarda").val+' °');
});
По идее должен отправлять в 7, 12 и 17 часов. начинает слать в 7 и потом ежеминутно пока не выключишь. меня хватает на 5 мин. `
Потому что код на форуме надо оборачивать в соответствующий тэг, подправьте. https://crontab.guru -
schedule("* 7,12,17 * * *", function () { log("Сообщение о температуре дома"); //setState (idSayIt, volume+';'+hour+':'+min+';Температура на улице:'+temp2.val+' °'); sendTo("telegram.0", "Температура на улице: " +getState("mqtt.0.myhome.Temp.Street").val+' °'+", в Зале: " +getState("mqtt.0.myhome.Temp.Zal").val+' °'+", в Гараже: " +getState("mqtt.0.myhome.Temp.Garage").val+' °'+", на Кухне: " +getState("mqtt.0.myhome.Temp.Kitchen").val+' °'+", на Мансарде :" +getState("mqtt.0.myhome.Temp.Mansarda").val+' °'); });
Учел исправил, за ссылку Зенкуем!! Понял где проблема.
-
Доброго времени! Ну я опять с вопросом. вот код:
schedule("0 7/5 * * *", function () { log("Сообщение о температуре дома"); //setState (idSayIt, volume+';'+hour+':'+min+';Температура на улице:'+temp2.val+' °'); sendTo("telegram.0", "Температура на улице: " +getState("mqtt.0.myhome.Temp.Street").val+' °'+", в Зале: " +getState("mqtt.0.myhome.Temp.Zal").val+' °'+", в Гараже: " +getState("mqtt.0.myhome.Temp.Garage").val+' °'+", на Кухне: " +getState("mqtt.0.myhome.Temp.Kitchen").val+' °'+", на Мансарде :" +getState("mqtt.0.myhome.Temp.Mansarda").val+' °'); });
С учетом последних ссылок должно работать в 7, 12, 17 часов… НО! в 7 уведомление получаю, а далее - ни чего. Где искать??
-
Доброго времени! Ну я опять с вопросом. вот код:
schedule("0 7/5 * * *", function () { log("Сообщение о температуре дома"); //setState (idSayIt, volume+';'+hour+':'+min+';Температура на улице:'+temp2.val+' °'); sendTo("telegram.0", "Температура на улице: " +getState("mqtt.0.myhome.Temp.Street").val+' °'+", в Зале: " +getState("mqtt.0.myhome.Temp.Zal").val+' °'+", в Гараже: " +getState("mqtt.0.myhome.Temp.Garage").val+' °'+", на Кухне: " +getState("mqtt.0.myhome.Temp.Kitchen").val+' °'+", на Мансарде :" +getState("mqtt.0.myhome.Temp.Mansarda").val+' °'); });
С учетом последних ссылок должно работать в 7, 12, 17 часов… НО! в 7 уведомление получаю, а далее - ни чего. Где искать?? `
schedule("0 7,12,17 * * *", function () {
-
Да, все работает. Но теперь следующая загвоздка. Пытаюсь добавить в сообщение дату код выглядит так:
schedule("*30 6 * * *", function () { var idSayIt = "sayit.0.tts.text"; //formatDate(new Date(), "WW, dd, mm, yyyy"); // => День недели "Вторник"; var date = new Date(); var day = date.getDay(); // 0-воскр. 6-суббота var hour = date.getHours(); var min = (date.getMinutes()<10?'0':'') + date.getMinutes(); // если минута меньше 10, то добавляем 0 var volume = 100; //setState (idSayIt, volume+';'+hour+':'+min); //setState (idSayIt, volume+';'+date); sendTo("telegram.0", "Сегодня" +date+ "Статус пожарной сигнализации: " +getState("home.fire_all.color").val); log('Пожарная сигнализация '+day +date); });
и все бы ни чего, если бы дата не выводилась в таком формате:
Пожарная сигнализация 3Wed May 10 2017 20:14:00 GMT+1000 (RTZ 9 (зима))
как привести к виду: Среда 10 Мая 2017 20:14
-
Да, все работает. Но теперь следующая загвоздка. Пытаюсь добавить в сообщение дату код выглядит так:
schedule("*30 6 * * *", function () { var idSayIt = "sayit.0.tts.text"; //formatDate(new Date(), "WW, dd, mm, yyyy"); // => День недели "Вторник"; var date = new Date(); var day = date.getDay(); // 0-воскр. 6-суббота var hour = date.getHours(); var min = (date.getMinutes()<10?'0':'') + date.getMinutes(); // если минута меньше 10, то добавляем 0 var volume = 100; //setState (idSayIt, volume+';'+hour+':'+min); //setState (idSayIt, volume+';'+date); sendTo("telegram.0", "Сегодня" +date+ "Статус пожарной сигнализации: " +getState("home.fire_all.color").val); log('Пожарная сигнализация '+day +date); });
и все бы ни чего, если бы дата не выводилась в таком формате:
Пожарная сигнализация 3Wed May 10 2017 20:14:00 GMT+1000 (RTZ 9 (зима))
как привести к виду: Среда 10 Мая 2017 20:14 `
console.log(formatDate(new Date(), "WW DD OO YYYY hh:mm"))
Единственная проблема это падеж.
console.log( formatDate(new Date(), "WW DD OO YYYY hh:mm") .replace('рь', 'ря') .replace('Март', 'Марта') .replace('ль', 'ля') .replace('Май', 'Мая') .replace('Июнь', 'Июня') .replace('Август', 'Августа') )