Navigation

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

    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

    Проблема со скриптом

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

      @dimon:

      Сначала скрипт считает все нормально, значения плюсуются исправно, но в какой-то момент начинает складывать не понятные мне значения:

      Причем исходные данные от PZEM идут как положено.

      Есть идеи? `
      Я бы первым делом сделал так:

      ! ````
      var T1 = 3; //Стоимость тарифа Т1
      var difference = 0; //Разница между старым и новым значением
      createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
      createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
      createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
      ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
      log('obj.newState.val = '+ obj.newState.val);
      log('obj.oldState.val = '+ obj.oldState.val);
      if (obj.newState.val >= obj.oldState.val) {
      difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
      log('difference = '+ difference);
      var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
      var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
      log('mD = '+ mD);
      log('mDC = '+ mDC);
      setState('javascript.0.energy_count.Day', mD, true);
      setState('javascript.0.energy_count.DayCost', mDC, true);

       }
      

      });

      ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
      setState('javascript.0.energy_count.Day', 0, true);
      setState('javascript.0.energy_count.DayCost', 0, true);
      });

      1 Reply Last reply Reply Quote 0
      • D
        dimon last edited by

        Сделал по рекоммендации. Несколько часов нормальной работы и опять…

        Вот что нарыл в логе:

        Последнее нормальное значение:

        2017-03-31 11:30:13.025 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7837

        2017-03-31 11:30:13.026 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 7836

        2017-03-31 11:30:13.027 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 0.001

        2017-03-31 11:30:13.029 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 0.081

        2017-03-31 11:30:13.029 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 0.243

        Следующее, уже не правильное:

        2017-03-31 11:30:23.000 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7837

        2017-03-31 11:30:23.001 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

        2017-03-31 11:30:23.002 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 7.837

        2017-03-31 11:30:23.003 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 7.918

        2017-03-31 11:30:23.004 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 23.754

        Прошло еще немного времени:

        2017-03-31 11:38:38.110 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7841

        2017-03-31 11:38:38.111 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 7840

        2017-03-31 11:38:38.112 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 0.001

        2017-03-31 11:38:38.114 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 172.526

        2017-03-31 11:38:38.115 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 517.578

        Куда то временами пропадает obj.oldState.val.

        Как быть?

        1 Reply Last reply Reply Quote 0
        • D
          dimon last edited by

          Сделал проверку на "0".

          Скрипт не производит арифметику, если obj.oldState.val = 0. Теперь считает нормально. Но отсюда получаем новый глюк:

          15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937

          15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

          15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

          15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

          15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021

          он пропускает значения, т.к. obj.oldState.val для 7939 это 7938, а последний раз он отработал по 7937.

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

            @dimon:

            Сделал проверку на "0".

            Скрипт не производит арифметику, если obj.oldState.val = 0. Теперь считает нормально. Но отсюда получаем новый глюк:

            15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937

            15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

            15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

            15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

            15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021

            он пропускает значения, т.к. obj.oldState.val для 7939 это 7938, а последний раз он отработал по 7937. `
            OldVal не сохраняется при перезгрузке. IoBroker перезапустил - 0 получил.

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

              Это делается по другому. При старте скрипта запоминаешь значение в локальной переменной и её потом используешь.

              Хотя все равно не понятно. Почему 0. :?

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

                Наверное у тебя приходят нули по mqtt но ты их не печатает, т.к. смотришь, чтоб новое значение было больше.

                Поставь проверку на ноль и печатай лог

                1 Reply Last reply Reply Quote 0
                • D
                  dimon last edited by

                  @Bluefox:

                  Наверное у тебя приходят нули по mqtt но ты их не печатает, т.к. смотришь, чтоб новое значение было больше.

                  Поставь проверку на ноль и печатай лог `

                  Так лог ведь печатается:

                  ! 15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937 15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021 !

                  А вот и весь код. Что куда добавить?

                  ! ````
                  var T1 = 3; //Стоимость тарифа Т1
                  var difference = 0; //Разница между старым и новым значением
                  createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                  createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                  createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                  ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
                  log('obj.newState.val = '+ obj.newState.val);
                  log('obj.oldState.val = '+ obj.oldState.val);
                  if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                  difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                  log('difference = '+ difference);
                  var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                  var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                  log('mD = '+ mD);
                  log('mDC = '+ mDC);
                  setState('javascript.0.energy_count.Day', mD, true);
                  setState('javascript.0.energy_count.DayCost', mDC, true);

                   }
                  

                  });

                  ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
                  setState('javascript.0.energy_count.Day', 0, true);
                  setState('javascript.0.energy_count.DayCost', 0, true);
                  });

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

                    ! ````
                    var T1 = 3; //Стоимость тарифа Т1
                    var difference = 0; //Разница между старым и новым значением
                    createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                    createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                    createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                    ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "any"}, function (obj) {
                    log('obj.newState.val = '+ obj.newState.val);
                    log('obj.oldState.val = '+ obj.oldState.val);
                    if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                    difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                    log('difference = '+ difference);
                    var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                    var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                    log('mD = '+ mD);
                    log('mDC = '+ mDC);
                    setState('javascript.0.energy_count.Day', mD, true);
                    setState('javascript.0.energy_count.DayCost', mDC, true);

                     }
                    

                    });

                    ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
                    setState('javascript.0.energy_count.Day', 0, true);
                    setState('javascript.0.energy_count.DayCost', 0, true);
                    });

                    Обрати внимание на "change: "any""
                    1 Reply Last reply Reply Quote 0
                    • D
                      dimon last edited by

                      @Bluefox:

                      ! ````
                      var T1 = 3; //Стоимость тарифа Т1
                      var difference = 0; //Разница между старым и новым значением
                      createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                      createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                      createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                      ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "any"}, function (obj) {
                      log('obj.newState.val = '+ obj.newState.val);
                      log('obj.oldState.val = '+ obj.oldState.val);
                      if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                      difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                      log('difference = '+ difference);
                      var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                      var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                      log('mD = '+ mD);
                      log('mDC = '+ mDC);
                      setState('javascript.0.energy_count.Day', mD, true);
                      setState('javascript.0.energy_count.DayCost', mDC, true);

                       }
                      

                      });

                      ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
                      setState('javascript.0.energy_count.Day', 0, true);
                      setState('javascript.0.energy_count.DayCost', 0, true);
                      });

                      Обрати внимание на "change: "any"" `  
                      

                      Сделал проще - включил сохранение истории для mqtt.0.ESP00163EB3.pmwh.

                      Вот что она показала:

                      ! ![](</s><URL url=)<link_text text="http://pics.4minipc.ru/images/2017/03/3 ... -59-43.png">http://pics.4minipc.ru/images/2017/03/31/2017-03-31_22-59-43.png</link_text>" />
                      !
                      ![](</s><URL url=)<link_text text="http://pics.4minipc.ru/images/2017/03/3 ... -12-22.png">http://pics.4minipc.ru/images/2017/03/31/2017-03-31_23-12-22.png</link_text>" />~~~~ ~~~~Была у меня мысль, что косячить может mqtt, но я никогда не замечал изменения значений. Судя по истории ноль появляется на несколько секунд. Выходит все мороки со скриптом напрасны, он и в начальной версии работал правильно.

                      Буду дальше искать варианты выполнить "хотелку".

                      Спасибо!~~~~

                      1 Reply Last reply Reply Quote 0
                      • D
                        dimon last edited by

                        В общем проблему решил так:

                        ! ````
                        var T1 = 3; //Стоимость тарифа Т1
                        var difference = 0; //Разница между старым и новым значением
                        createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                        createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                        createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                        createState('energy_count.pmwh', 0, {name: 'pmwh без глюка', read: true, write: true, unit: 'kWh'});
                        ! on({id: "javascript.0.energy_count.pmwh", change: "any"}, function (obj) {
                        if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                        setState('javascript.0.energy_count.pmwh', obj.newState.val, true);
                        }
                        });
                        ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
                                log('obj.newState.val = '+ obj.newState.val);
                                log('obj.oldState.val = '+ obj.oldState.val);
                             if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                                difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                                log('difference = '+ difference);
                                var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                                var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                                log('mD = '+ mD);
                                log('mDC = '+ mDC);
                                setState('javascript.0.energy_count.Day', mD, true);
                                setState('javascript.0.energy_count.DayCost', mDC, true);

                        }
                        });

                        ! schedule("0 0 0 * * *", function () {       //Каждый день в 00:00:00 обнуляем дневные показания
                            setState('javascript.0.energy_count.Day', 0, true);
                            setState('javascript.0.energy_count.DayCost', 0, true);
                        });

                        
                        Теперь работает стабильно и без пропусков.
                        
                        На очереди сохранение значения при перезагрузке.
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        816
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        3
                        11
                        2730
                        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