Navigation

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

    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

    Однократное выполение js скрипта

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

      @instalator:

      По идее код должен отрабатывать один раз, но он выполняется с определенной переодичностью. `
      Именно этот код, кстати, не должен отрабатываться с переодичностью.

      Переодичность случайно не 30 сек?

      Скорей всего он падает на строчке sendRequest, т.к. не знает такой функции. И перезапускается.

      Правильно будет так:

      var request = require('request'); // подтягиваем доп модуль. Описание здесь:https://github.com/request/request
      
      // Подписываемся на изменения (если нет изменения, то не сработает. Например 2 раза подряд true)
      on("javascript.1.Otpravka_pokazanij", function (obj)({
          // Если новое значение true. Описание объекта здесь https://github.com/ioBroker/ioBroker.javascript#on---subscribe-on-changes-or-updates-of-some-state
          if (obj.newState.val) {           
                 request('http://ip', function (error, response, body) { 
                         // если нет ошибки
                         if (!error && response.statusCode == 200) {
                               // показать результат
                               log(body);
                         } else {
                               // показать ошибку
                               log(error, "error");
                          }
                 }); 
          }
      });
      
      
      1 Reply Last reply Reply Quote 0
      • I
        instalator last edited by

        sendRequest(function (body) {

        }); это функция.

        При таком коде если в функции sendRequest я получаю другую страницу и возвращаю body, то body из sendRequest будет доступно только внутри этой записи sendRequest(function (body) {

        }); или оно будет доступно уже везде?

        Объянил как мог)

        on("javascript.1.Otpravka_pokazanij", function (obj){
                if (obj.newState.val) {           
                   request('https://www.sistemagorod.ru/lk/', function (error, response, body) { 
                           // если нет ошибки
                           if (!error && response.statusCode == 200) {
                                 // показать результат
                                sendRequest(function (body) { 
                                }); 
                           } else {
                                 // показать ошибку
                                 log(error, "error");
                            }
                   }); 
            }
        });
        
        1 Reply Last reply Reply Quote 0
        • I
          instalator last edited by

          Я не могу понять как выводится лог… javscript выставил в дебаг. в логе поставил javascript и то пусто все, то часть выдаст после обновления все пропадает. как вообще обкатать js скрипт можно? может есть какие программы где можно было бы выполнить пошаговый дебаг, в самом брокере я немогу понять как можно проверить скрипты

          1 Reply Last reply Reply Quote 0
          • E
            electric69 last edited by

            @instalator:

            Я не могу понять как выводится лог… javscript выставил в дебаг. в логе поставил javascript и то пусто все, то часть выдаст после обновления все пропадает. как вообще обкатать js скрипт можно? может есть какие программы где можно было бы выполнить пошаговый дебаг, в самом брокере я немогу понять как можно проверить скрипты `
            попробуй через консоль выполнить

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

              @electric69:

              @instalator:

              Я не могу понять как выводится лог… javscript выставил в дебаг. в логе поставил javascript и то пусто все, то часть выдаст после обновления все пропадает. как вообще обкатать js скрипт можно? может есть какие программы где можно было бы выполнить пошаговый дебаг, в самом брокере я немогу понять как можно проверить скрипты попробуй через консоль выполнить
              Какую консоль?

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

                как внутри функции, которая спарсила с сайта данные, сделать цикл ожидающий изменения переменной из брокера?

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

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

                  В яваскрипте нет циклов ожидания. Тебе надо ждать при помощи "on".

                  @all: Кто нибудь разбирается ещё в JS. Можете объяснить?

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

                    @Bluefox:

                    В яваскрипте нет циклов ожидания. Тебе надо ждать при помощи "on".

                    @all: Кто нибудь разбирается ещё в JS. Можете объяснить? `
                    пробовал on. функция спарсила данные допустим час назад потом по on. данные уже в дургую функцию не отдаются.
                    2983_img_7685.jpg

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

                      var request = require('request');
                      var parseResult;
                      var parseTime;
                      
                      request('http://www.google.com', function (error, response, body) {
                        // внутри функции, которая спарсила с сайта данные
                        if (!error && response.statusCode == 200) {
                          parseResult = myParseFunction();
                          parseTime = (new Date()).getTime();
                        }
                      });
                      
                      // "цикл" ожидающий изменения переменной из брокера
                      on('waitForVariable', function (obj) {
                          // Если прошло меньше секунды
                          if (parseTime && (new Date()).getTime() - parseTime < 1000) {
                               // выполнилась другая функция в которой спарсенные данные уже обработались
                               drugajaFunction(parseResult);
                          }
                      });
                      

                      Либо я не понял, что ты хочешь. 😉

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

                        @Bluefox:

                        var request = require('request');
                        var parseResult;
                        var parseTime;
                        
                        request('http://www.google.com', function (error, response, body) {
                          // внутри функции, которая спарсила с сайта данные
                          if (!error && response.statusCode == 200) {
                            parseResult = myParseFunction();
                            parseTime = (new Date()).getTime();
                          }
                        });
                        
                        // "цикл" ожидающий изменения переменной из брокера
                        on('waitForVariable', function (obj) {
                            // Если прошло меньше секунды
                            if (parseTime && (new Date()).getTime() - parseTime < 1000) {
                                 // выполнилась другая функция в которой спарсенные данные уже обработались
                                 drugajaFunction(parseResult);
                            }
                        });
                        

                        Либо я не понял, что ты хочешь. 😉 `

                        Решил сделать так.

                        Каждый месяц парсим данные и пишем в базу, отправляем на телефон данные которые спарсили (+ссылка ОТПРАВИТЬ), жмем в сообщении отправить и данные уже из базы отправляются в систему город.

                        Примерчиков нужно больше по js. А так необычно на js что либо писать после С.

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

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

                          Почему не срабатывает следующий код?

                          on({time: "* *13 */23 * *"}, function () {

                          log('не работает');

                          });

                          Должно срабатывать в 13 00 каждое 23 число месяца

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

                            @instalator:

                            Почему не срабатывает следующий код?

                            on({time: "* *13 */23 * *"}, function () {

                            log('не работает');

                            });

                            Должно срабатывать в 13 00 каждое 23 число месяца `
                            Я сам постоянно забываю cron формат. Пользуюсь

                            http://cron.nmonitoring.com/cron-generator.html

                            или

                            http://www.corntab.com/pages/crontab-gui

                            "0 13 23 * *"

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

                              Как вообще описать тупую логику на js?

                              Можно ли отписаться от изменений переменных?

                              on('javascript.0.Signalizaciya', function (obj) {
                                  if (obj.newState.val === 1 || obj.newState.val === "1"){
                                      on('mqtt.0.myhome.Bedroom.Motion', function (obj) {
                                           if (obj.newState.val === 1 || obj.newState.val === "1"){
                                               sendTo("pushover", {
                                                  message:  'ВНИМАНИЕ!!! Замечено движение в спальне',
                                                  title:    'Сигнализация',
                                                  url: '',
                                                  url_title: '', 
                                              });
                                           }
                                      });
                                      on('mqtt.0.myhome.Guestroom.Motion', function (obj) {
                                           if (obj.newState.val === 1 || obj.newState.val === "1"){
                                               sendTo("pushover", {
                                                  message:  'ВНИМАНИЕ!!! Замечено движение в зале',
                                                  title:    'Сигнализация',
                                                  url: '',
                                                  url_title: '', 
                                              });
                                           }
                                      });  
                                  }
                              });
                              
                              1 Reply Last reply Reply Quote 0
                              • Bluefox
                                Bluefox last edited by

                                @instalator:

                                Как вообще описать тупую логику на js?

                                Можно ли отписаться от изменений переменных? `
                                Нет, нельзя. Но можно проигнорировать изменения.

                                var signalizaciyaON = false;
                                
                                createState('Signalizaciya', false, function () {
                                	signalizaciyaON = getState('Signalizaciya').val;
                                });
                                // Подписываемся на изменения
                                on('Signalizaciya', function (obj) {
                                    signalizaciyaON = obj.newState.val;
                                });
                                
                                on('mqtt.0.myhome.Bedroom.Motion', function (obj) {
                                	 if (signalizaciyaON && (obj.newState.val === 1 || obj.newState.val === "1")){
                                		 sendTo("pushover", {
                                			message:  'ВНИМАНИЕ!!! Замечено движение в спальне',
                                			title:    'Сигнализация',
                                			url: '',
                                			url_title: '', 
                                		});
                                	 }
                                });
                                on('mqtt.0.myhome.Guestroom.Motion', function (obj) {
                                	 if (signalizaciyaON && (obj.newState.val === 1 || obj.newState.val === "1")){
                                		 sendTo("pushover", {
                                			message:  'ВНИМАНИЕ!!! Замечено движение в зале',
                                			title:    'Сигнализация',
                                			url: '',
                                			url_title: '', 
                                		});
                                	 }
                                });  
                                
                                1 Reply Last reply Reply Quote 0
                                • I
                                  instalator last edited by

                                  На счет флагов….

                                  on('mqtt.0.myhome.Mother.DomofonRing', function (obj) {
                                     if (obj.newState.val === '1' || obj.newState.val === 1){
                                         var TVon = getState('mqtt.0.myhome.RS232.LGTV_PWR').val;
                                         var TVsource = getState('mqtt.0.myhome.RS232.LGTV_Source').val;
                                         var flag_domofon = getState('javascript.0.flag_domofon').val;
                                             if (flag_domofon === '0'){
                                                  sendTo("pushover", {
                                                      message:  'Звонок домофона',
                                                      title:    'Домофон',
                                                      url: 'http://192.168.1.190:8087/set/mqtt.0.myhome.Mother.DomofonOpen?value=1&prettyPrint',
                                                      url_title: 'ОТКРЫТЬ ДВЕРЬ!', 
                                                  });
                                              setState('javascript.0.flag_domofon', '1'); 
                                                  if (TVon === '1' || TVon === 1){
                                                     setState('mqtt.0.myhome.RS232.LGTV_Source', 'av2');
                                                     setTimeout(function() { setState('mqtt.0.myhome.RS232.LGTV_Source', TVsource.toLowerCase()); }, 7000);
                                                 }
                                             }
                                      }
                                     else { }
                                     setTimeout(function() { setState('javascript.0.flag_domofon', '0'); }, 10000);
                                  });
                                  

                                  var flag_domofon = getState('javascript.0.flag_domofon').val;

                                  Создаем переменную в базе в качестве флага, много где приходится применять и переменные со временем разрастаются, может сделать возможность создавать невидимые в общем списке переменные флагов? или написать какую нибудь функцию для таких ситуаций (хотя скорее нужны глобальные переменные).

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

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

                                    Этот код делает тоже самое, что твой, только не создает глобальных переменных.

                                    var flag_domofon = false;
                                    
                                    on('mqtt.0.myhome.Mother.DomofonRing', function (obj) {
                                    	if (obj.newState.val === '1' || obj.newState.val === 1) {
                                    
                                    		var TVon     = getState('mqtt.0.myhome.RS232.LGTV_PWR').val;
                                    		var TVsource = getState('mqtt.0.myhome.RS232.LGTV_Source').val;
                                    
                                    		if (!flag_domofon){
                                    			sendTo("pushover", {
                                    				message:  'Звонок домофона',
                                    				title:    'Домофон',
                                    				url: 'http://192.168.1.190:8087/set/mqtt.0.myhome.Mother.DomofonOpen?value=1&prettyPrint',
                                    				url_title: 'ОТКРЫТЬ ДВЕРЬ!', 
                                    			});
                                    
                                    			flag_domofon = true;
                                    
                                    			if (TVon === '1' || TVon === 1) {
                                    				setState('mqtt.0.myhome.RS232.LGTV_Source', 'av2');
                                    				setTimeout(function() { 
                                    					setState('mqtt.0.myhome.RS232.LGTV_Source', TVsource.toLowerCase()); 
                                    				}, 7000);
                                    			}
                                    			setTimeout(function() { 
                                    				flag_domofon = false; 
                                    			}, 10000);
                                    		}
                                    	}
                                    });
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • I
                                      instalator last edited by

                                      @Bluefox:

                                      Этот код делает тоже самое, что твой, только не создает глобальных переменных.

                                      var flag_domofon = false;
                                      
                                      on('mqtt.0.myhome.Mother.DomofonRing', function (obj) {
                                      	if (obj.newState.val === '1' || obj.newState.val === 1) {
                                      	
                                      		var TVon     = getState('mqtt.0.myhome.RS232.LGTV_PWR').val;
                                      		var TVsource = getState('mqtt.0.myhome.RS232.LGTV_Source').val;
                                      	
                                      		if (!flag_domofon){
                                      			sendTo("pushover", {
                                      				message:  'Звонок домофона',
                                      				title:    'Домофон',
                                      				url: 'http://192.168.1.190:8087/set/mqtt.0.myhome.Mother.DomofonOpen?value=1&prettyPrint',
                                      				url_title: 'ОТКРЫТЬ ДВЕРЬ!', 
                                      			});
                                      			
                                      			flag_domofon = true;
                                      			
                                      			if (TVon === '1' || TVon === 1) {
                                      				setState('mqtt.0.myhome.RS232.LGTV_Source', 'av2');
                                      				setTimeout(function() { 
                                      					setState('mqtt.0.myhome.RS232.LGTV_Source', TVsource.toLowerCase()); 
                                      				}, 7000);
                                      			}
                                      			setTimeout(function() { 
                                      				flag_domofon = false; 
                                      			}, 10000);
                                      		}
                                      	}
                                      });
                                      ```` `  
                                      

                                      а скрипты разве не перезапускаются постоянно через определенное время?

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

                                        Нет.. Даже не пойму, как ты вышел на такие домыслы.

                                        Кстати onkyo работает? Там же была ещё какая-то проблемка.

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

                                          @Bluefox:

                                          Нет.. Даже не пойму, как ты вышел на такие домыслы.

                                          Кстати onkyo работает? Там же была ещё какая-то проблемка. `
                                          Да я уже и сам не пойму 🙂

                                          Да вроде работает все, хотя уже не помню толи в драйвере подправлено толи руками подправил в файле. На гите точно правильно все должно быть)

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

                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          532
                                          Online

                                          31.8k
                                          Users

                                          80.0k
                                          Topics

                                          1.3m
                                          Posts

                                          3
                                          20
                                          4144
                                          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