Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. Скрипт для Narodmon.ru

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Скрипт для Narodmon.ru

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

      Скрипт для забора данных датчика с narodmon.ru.

      Запрос данных каждые 5 мин.

      api_key подставляем свой, получаемый в разделе Мои Приложения после регистрации в проекте.

      ID датчика смотрим тут.
      380_4.jpg

       schedule("*/5 * * * *", function () {      //запускаем наш скрипт каждые 5 мин
      createState('Narodmon.sensor.temp', '');    //Создаем переменную в iobroker  
      var request = require('request');
      var crypto = require('crypto');                                   
      var random = Math.random().toString();       // создаем переменную случайного числа и преобразуем ее в строку 
      var hash = crypto.createHash('md5').update(random).digest('hex'); //генерируем md5 в переменную hash
      
      request({                                             //Отправляем запрос на narodmon
          url: 'http://narodmon.ru/api',           //URL api народного мониторинга
          method: 'POST',                               // Метод POST
          json: {                                            // запрос в формате json
              "cmd":"sensorsValues",               
              "sensors":"12345",                     //ID датчика. (вместо 12345 подставить нужный нам ID датчика)
              "uuid":hash,                         //наш сгенерированный MD5
              "api_key":"123456789ABCDF",           // Вводим вместо 123456789ABCDF наш api_key ключ API для разработчика, получаемый в разделе Мои Приложения после регистрации в проекте. 
              "lang":"ru"                          
          }
      }, function(error, response, body){       //обрабатываем результат
          if(error) {
              log(error);                       //выводим в лог в случаи ошибки ответа от сервера
              } else {
              log(JSON.stringify(body));        //выводим в лог ответа в виде строки. 
              var sensor = body.sensors[0].value;       //вытаскиваем наше значение из ответа от сервера
              setState("javascript.0.Narodmon.sensor.temp"/*Narodmon.sensor.temp*/, sensor);       Записываем значение в переменную iobroker
          }
      });
      });
      
      1 Reply Last reply Reply Quote 0
      • Z
        znammut last edited by

        Здравствуйте, я ваш скрипт немного поправил, чтобы несколько датчиков опрашивать

        `schedule("*/5 * * * *", function () {
        var IDs = '12345,6789'; //ID датчика. (вместо 12345 и 6789 подставить нужные нам ID датчиков, последующий датчик указать через запятую)
        var apiKey = "123456789ABCDF"; // Вводим вместо 123456789ABCDF наш api_key ключ API для разработчика, получаемый в разделе Мои Приложения после регистрации в проекте.
        var request = require('request');
        var crypto = require('crypto');
        var hash = crypto.createHash('md5').update(apiKey).digest('hex');
        
        request({
            url: 'http://narodmon.ru/api',
            method: 'POST',
            json: {
                "cmd":"sensorsValues",               
                "sensors":IDs,
                "uuid":hash,
                "api_key":apiKey,
                "lang":"ru"
            }
        }, function(error, response, body){
            if(error) {
                log(error);
                } else {
                log(JSON.stringify(body));
                for (var i = 0; i < body.sensors.length; i++) {
                  var valueSensor = Math.round(body.sensors[i].value); //тут еще округление результата идет
        	      var idSensor = body.sensors[i].id;
                  createState("Narodmon.sensor." + idSensor, '');
                  setState("javascript.0.Narodmon.sensor." + idSensor, valueSensor);
                }
            }
        });
        });` 
        
        Не совсем понятно как при создании сразу тип указать, чтобы уже сразу правильно было
        
        С уважением[/i][/i]
        
        1 Reply Last reply Reply Quote 0
        • Bluefox
          Bluefox last edited by

          Я бы поменял так:

          `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',
                  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]
          
          1 Reply Last reply Reply Quote 0
          • D
            dimon last edited by

            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]
            
            1 Reply Last reply Reply Quote 0
            • B
              Brujerizmo last edited by

              Чутка перепилил скрипт. Указываете несколько датчиков и скрипт считает среднее значение температуры. На мой взгляд так получится точнее)

              `var request = require('request');
              var crypto  = require('crypto');
              
              var IDs     = ['12345','6789']; // ID датчиков. (вместо 12345 и 6789 подставить нужные нам ID датчиков, как массив)
              var apiKey  = '23456789ABCD';  // Вводим вместо 123456789ABCDF наш api_key ключ API для разработчика, получаемый в разделе Мои Приложения после регистрации в проекте.
              var hash    = crypto.createHash('md5').update(apiKey).digest('hex');
              
                  createState('narodmon.sensor.mid', {
                      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));
                          var summval = 0;
                          for (var i = 0; i < body.sensors.length; i++) {
                              var valueSensor = Math.round(body.sensors[i].value * 10) / 10; // round to 0.1 step
                              summval = summval + valueSensor; 
                          }
                          var midval = summval / body.sensors.length;
                          setState('javascript.0.narodmon.sensor.mid', Math.round(midval * 10) / 10, true);
                      }
                  });
              });` [/i]
              
              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              1.1k
              Online

              31.7k
              Users

              79.7k
              Topics

              1.3m
              Posts

              5
              5
              5167
              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