Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. dimon

    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

    D
    • Profile
    • Following 0
    • Followers 0
    • Topics 1
    • Posts 13
    • Best 0
    • Groups 0

    dimon

    @dimon

    0
    Reputation
    24
    Profile views
    13
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    dimon Follow

    Latest posts made by dimon

    • RE: Сбой Telegram

      Скорее сбой, у пол европы такая же хрень))

      posted in ioBroker основное
      D
      dimon
    • RE: Драйвер Telegram Adapter

      @Haba:

      Пример №2 Структура меню и действия

      ! ```
      `var button = [{name: 'меню',button: ['Комната 1','Комната 2','Закрыть','меню']},
      {name: 'Комната 1',button: ['Сценарии','Ручное управление','Назад','Закрыть','меню']},
      {name: 'Сценарии', button: ['Сцена 1','Сцена 2','Назад','Закрыть','Комната 1']},
      {name: 'Ручное управление', button: ['Действие 3','Действие 4','Назад','Закрыть','Комната 1']},
      {name: 'Комната 2', button: ['Действие 1','Действие 2','Назад','Закрыть','меню']}
      ];
      ! var menuUp = 'меню';
      var first_tap = false;
      ! on({id: "telegram.0.communicate.request", ack: false, change: 'any'}, function (obj) {
      command = obj.state.val.substring(obj.state.val.indexOf(']')+1);
      user = obj.state.val.substring(obj.state.val.indexOf('[')+1,obj.state.val.indexOf(']'));
      //************************************
      // меню
      //************************************
      var menu = {
      reply_markup: {
      inline_keyboard: [[],[]],
      }
      };

      log("message_id = " + getState("telegram.0.communicate.requestMessageId").val);
      log("menuUp = " + menuUp);
      if (command === 'меню') first_tap = true;
      if (command === 'Назад') command = menuUp;
      var but1 = getButtonArray(button, 'name', command).toString();
      
      if (but1.length > 0) {          // проверяем, что строка не пустая
          var but2 = but1.split(','); //преобразуем в массив
          menuUp = but2.pop();        //вырезаем последний элемент
          log ("but2 = " + JSON.stringify(but2));
          if (but2.length > 0) {      // проверяем что массив не пуст
              var index = 0;
              for (var i=0, len=but2.length; i <len; i++)/{/if/((i="">1)&&(index < 1)) index = ++index;
                  menu.reply_markup.inline_keyboard[index].push({ text: but2[i], callback_data: but2[i]});
              }
              log(JSON.stringify(menu.reply_markup.inline_keyboard));
              if (first_tap) {
                  sendTo('telegram.0', {user: user, text: 'Меню ' + command, reply_markup: menu.reply_markup});
                  first_tap = false;
              } else sendTo('telegram', { 
                      user: user, 
                      text: 'Меню ' + command, 
                      editMessageText: { 
                          options: { 
                              chat_id: getState("telegram.0.communicate.requestChatId").val, 
                              message_id: getState("telegram.0.communicate.requestMessageId").val, 
                              reply_markup: menu.reply_markup
                          }    
                      } 
                  });
          }
      } else log("but1 пуст");
      

      //************************************
      // Команды
      //************************************
      // ищем в тексте команды
      if (command ==="Действие 1") {
      //тут код что надо сделать
      CommandDone();
      }

      ! if (command ==="Закрыть") {
      sendTo('telegram', {
      user: user,
      text: 'Конец',
      editMessageText: {
      options: {
      chat_id: getState("telegram.0.communicate.requestChatId").val,
      message_id: getState("telegram.0.communicate.requestMessageId").val,
      }
      }
      });
      }
      });
      ! function CommandDone(){
      sendTo('telegram', {
      user: user,
      text: 'Выполняю...',
      editMessageText: {
      options: {
      chat_id: getState("telegram.0.communicate.requestChatId").val,
      message_id: getState("telegram.0.communicate.requestMessageId").val,
      }
      }
      });
      }
      ! function getButtonArray(obj, keyName, Name) {
      var result = [];
      for (var attr in obj) {
      if (obj[attr] && typeof obj[attr] === 'object') {
      result = result.concat(getButtonArray(obj[attr], keyName, Name));
      }
      if (attr === keyName && obj[attr] === Name) {
      result.push(obj.button);
      }
      }
      return result;
      }</len;> ! ЗЫ. Код до конца не оптимизирован, есть еще куда стремиться ;) ! Использую твое меню с небольшими доработками. Прошу помочь с редактированием сообщений. Такой код:~~[code]~~if (command ==="Действие 1") {
      sendTo('telegram', {
      user: user,
      text: 'Что-нибудь написано',
      editMessageText: {
      options: {
      chat_id: getState("telegram.0.communicate.requestChatId").val,
      message_id: getState("telegram.0.communicate.requestMessageId").val,
      }
      }
      });
      }[/code]! меняет сообщение на "Что-нибудь написано" и затирает клавиатуру. ! А хотелось бы, чтобы клавиатура оставалась на месте, а вывод был в сообщение над клавиатурой. Вот так: ! ![](http://pics.4minipc.ru/images/2018/03/28/2018-03-28_00-19-56.png)~~[img]~~[http://pics.4minipc.ru/images/2018/03/2 ... -19-56.png](http://pics.4minipc.ru/images/2018/03/28/2018-03-28_00-19-56.png)[/img] ! Буду благодарен за подсказку.[/i][/i] ```

      posted in ioBroker драйвера
      D
      dimon
    • RE: Проблема со скриптом

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

      ! ````
      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);
      });

      
      Теперь работает стабильно и без пропусков.
      
      На очереди сохранение значения при перезагрузке.
      posted in ioBroker скрипты
      D
      dimon
    • RE: Проблема со скриптом

      @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, но я никогда не замечал изменения значений. Судя по истории ноль появляется на несколько секунд. Выходит все мороки со скриптом напрасны, он и в начальной версии работал правильно.

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

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

      posted in ioBroker скрипты
      D
      dimon
    • RE: Проблема со скриптом

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

      posted in ioBroker скрипты
      D
      dimon
    • RE: Проблема со скриптом

      Сделал проверку на "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.

      posted in ioBroker скрипты
      D
      dimon
    • RE: Проблема со скриптом

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

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

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

      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.

      Как быть?

      posted in ioBroker скрипты
      D
      dimon
    • Проблема со скриптом

      Имеется приборчик 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 идут как положено.

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

      posted in ioBroker скрипты
      D
      dimon
    • RE: Скрипт для Narodmon.ru

      C кодом Bluefox не заработало. Сервер народного мониторинга отдает данные но с ошибкой

      javascript.0 2017-01-20 11:26:00.593 error script.js.common.narodmon: "{"error":"NO_USER_AGENT","errno":400}{"sensors":[{"id":2709,"value":0.4,"time":1484900366},{"id":19004,"value":0,"time":1484900404}]}"

      Вот что написано на сайте Народного мониторинга - Без HTTP-заголовка User-Agent: MyAppName (название Вашего приложения на латинице) веб-сервер может счесть запрос за "мусорный".

      Исправил вот так:

      `var request = require('request');
      var crypto  = require('crypto');
      
      var IDs     = ['12345', '6789']; // ID датчиков. (вместо 12345 и 6789 подставить нужные нам ID датчиков, как массив)
      var apiKey  = '123456789ABCDF';  // Вводим вместо 123456789ABCDF наш api_key ключ API для разработчика, получаемый в разделе Мои Приложения после регистрации в проекте.
      var hash    = crypto.createHash('md5').update(apiKey).digest('hex');
      
      for (var i = 0; i < IDs.length; i++) {
          createState('narodmon.sensor.' + IDs[i], {
              name:   'Sensor from narodmon',
              type:   'number',
              role:   'level.temperature',
              read:   true,
              unit:   'C°',
              write:  false
          });
      }
      
      // every 5 minutes
      schedule('*/5 * * * *', function () {
          request({
              url: 'http://narodmon.ru/api',
              method: 'POST',
              headers: ({'User-Agent': 'Name_Of_Your_App'}), // Заменить Name_Of_Your_App на название Вашего приложения на латинице
              json: {
                  cmd:     'sensorsValues',
                  sensors: IDs.join(','),
                  uuid:    hash,
                  api_key: apiKey,
                  lang:    'ru'
              }
          }, function(error, response, body) {
              if (error || !body || !body.sensors) {
                  console.error(error || JSON.stringify(body));
              } else {
                  console.log(JSON.stringify(body));
      
                  for (var i = 0; i < body.sensors.length; i++) {
                      var valueSensor = Math.round(body.sensors[i].value * 10) / 10; // round to 0.1 step
                      setState('javascript.0.narodmon.sensor.' + body.sensors[i].id, valueSensor, true);
                  }
              }
          });
      });`[/i][/i][/i]
      
      posted in ioBroker скрипты
      D
      dimon
    • RE: Разные ошибки

      После последних обновлений перестал работать админский интерфейс - белый экран. Причем vis работает.

      Что можно сделать?

      posted in ioBroker ошибки
      D
      dimon
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo