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

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

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

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

      var startsis = getState("javascript.1.Otpravka_pokazanij");
      var request = require('request');
      
      if (startsis){
          sendRequest(function (body) { 
          }); 
      }
      
      

      В sendRequest - setState ('javascript.1.Otpravka_pokazanij','false');

      По идее код должен отрабатывать один раз, но он выполняется с определенной переодичностью. Как сделать чтобы код отрабатывал один раз только когда ставим переменную в true?

      1 Reply Last reply Reply Quote 0
      • 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

                                            1.0k
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

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