Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Проблема со скриптом

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    11
    2
    203

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    7.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.7k

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

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

Scheduled Pinned Locked Moved ioBroker скрипты
11 Posts 3 Posters 3.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    dimon
    wrote on last edited by
    #1

    Имеется приборчик PZEM-004t - китайский измеритель напряжения, тока, мощности и суммарного потребления. Подключен к iobroker через esp8266 с прошивкой wifi-iot по mqtt. Показания исправно приходят в iobroker. Появилось желание сделать расчет суточного потребления и его стоимости.

    Написал скрипт:

    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) {
         if (obj.newState.val >= obj.oldState.val) {
            difference = (obj.newState.val - obj.oldState.val)/1000;
            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;
            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);
    });
    
    

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

    ![](</s><URL url=)http://pics.4minipc.ru/images/2017/03/30/2.png" />![](</s><URL url=)http://pics.4minipc.ru/images/2017/03/30/1.png" />

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

    Есть идеи?~~~~

    1 Reply Last reply
    0
    • I Offline
      I Offline
      instalator
      wrote on last edited by
      #2

      @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);
      });

      Высокий уровень Децибел вреден для здоровья!

      http://blog.instalator.ru/

      1 Reply Last reply
      0
      • D Offline
        D Offline
        dimon
        wrote on last edited by
        #3

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

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

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

        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
        0
        • D Offline
          D Offline
          dimon
          wrote on last edited by
          #4

          Сделал проверку на "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
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            wrote on last edited by
            #5

            @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
            0
            • BluefoxB Offline
              BluefoxB Offline
              Bluefox
              wrote on last edited by
              #6

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

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

              1 Reply Last reply
              0
              • BluefoxB Offline
                BluefoxB Offline
                Bluefox
                wrote on last edited by
                #7

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

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

                1 Reply Last reply
                0
                • D Offline
                  D Offline
                  dimon
                  wrote on last edited by
                  #8

                  @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
                  0
                  • BluefoxB Offline
                    BluefoxB Offline
                    Bluefox
                    wrote on last edited by
                    #9

                    ! ````
                    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
                    0
                    • D Offline
                      D Offline
                      dimon
                      wrote on last edited by
                      #10

                      @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
                      0
                      • D Offline
                        D Offline
                        dimon
                        wrote on last edited by
                        #11

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

                        ! ````
                        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
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        120

                        Online

                        32.4k

                        Users

                        81.3k

                        Topics

                        1.3m

                        Posts
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        ioBroker Community 2014-2025
                        logo
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Recent
                        • Tags
                        • Unread 0
                        • Categories
                        • Unreplied
                        • Popular
                        • GitHub
                        • Docu
                        • Hilfe