Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Проблема со скриптом

NEWS

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

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

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

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

Geplant Angeheftet Gesperrt Verschoben ioBroker скрипты
11 Beiträge 3 Kommentatoren 3.0k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • I Offline
    I Offline
    instalator
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • D Offline
      D Offline
      dimon
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • D Offline
        D Offline
        dimon
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        0
        • BluefoxB Offline
          BluefoxB Offline
          Bluefox
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #6

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

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

            1 Antwort Letzte Antwort
            0
            • BluefoxB Offline
              BluefoxB Offline
              Bluefox
              schrieb am zuletzt editiert von
              #7

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

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

              1 Antwort Letzte Antwort
              0
              • D Offline
                D Offline
                dimon
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                0
                • BluefoxB Offline
                  BluefoxB Offline
                  Bluefox
                  schrieb am zuletzt editiert von
                  #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 Antwort Letzte Antwort
                  0
                  • D Offline
                    D Offline
                    dimon
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    0
                    • D Offline
                      D Offline
                      dimon
                      schrieb am zuletzt editiert von
                      #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 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      387

                      Online

                      32.4k

                      Benutzer

                      81.4k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe