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

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Скрипт для датчика CO2 MH-Z14 (MH-Z19)

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    511

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

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

Скрипт для датчика CO2 MH-Z14 (MH-Z19)

Geplant Angeheftet Gesperrt Verschoben ioBroker скрипты
16 Beiträge 2 Kommentatoren 3.3k 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.
  • A Offline
    A Offline
    artko
    schrieb am zuletzt editiert von
    #7

    @andrey99986:

    Какая OS?

    Сколько свободной памяти показывает iobroker? `

    Ubuntu 16.04LTS.

    Всего RAM - Используется: 325 Мб / Свободно: 176 Мб (9%) [Сервер: atom-nb - 9 процессов]

    %Cpu(s): 8,0 us, 2,0 sy, 0,0 ni, 87,0 id, 3,0 wa, 0,0 hi, 0,0 si, 0,0 st

    КиБ Mem : 2050484 total, 179628 free, 520800 used, 1350056 buff/cache

    КиБ Swap: 8269820 total, 8203072 free, 66748 used. 1233352 avail Mem

    1 Antwort Letzte Antwort
    0
    • A Offline
      A Offline
      andrey99986
      schrieb am zuletzt editiert von
      #8

      @artko:

      @andrey99986:

      Какая OS?

      Сколько свободной памяти показывает iobroker? `

      Ubuntu 16.04LTS.

      Всего RAM - Используется: 325 Мб / Свободно: 176 Мб (9%) [Сервер: atom-nb - 9 процессов]

      %Cpu(s): 8,0 us, 2,0 sy, 0,0 ni, 87,0 id, 3,0 wa, 0,0 hi, 0,0 si, 0,0 st

      КиБ Mem : 2050484 total, 179628 free, 520800 used, 1350056 buff/cache

      КиБ Swap: 8269820 total, 8203072 free, 66748 used. 1233352 avail Mem `

      У меня драйвер javascript при работе с ком-портами периодически самоперегружается, поэтому я скрипты работающие с ком-портами запускаю в дополнительной инстанции, чтобы сбой не повлиял на работу других скриптов. Причина где то в недрах библиотеки serialport nodejs. По идее надо дебажить и создавать issue на https://github.com/node-serialport/node … ort/issues

      1 Antwort Letzte Antwort
      0
      • A Offline
        A Offline
        andrey99986
        schrieb am zuletzt editiert von
        #9

        @artko:

        адаптер прямо в порту торчит. чип CP2102. датчик - проводочки сантиметров пять. Просадку не смотрел. Два разных адаптера (одинаковых, впрочем, по чипу и схеме).

        Скрипт на питоне - работает как из пушки. Ни одной ошибки. `

        Попробуй поменять в коде на````
        var buflen = 9;

        Ещё вероятно причина в драйвере serialport. Видно же что ответ ненормальный идёт. Сделайте дебаг вывод ответа питона и сравните с nodejs.
        
        С питоном также дублированы байты ответа?
        
        Когда работает с портом iobroker (nodejs) - другие скрипты на уровне OS (питон) с этим портом не работают?
        1 Antwort Letzte Antwort
        0
        • A Offline
          A Offline
          artko
          schrieb am zuletzt editiert von
          #10

          12:25:19.724 [info] javascript.0 script.js.common.Скрипт1: registered 0 subscriptions and 1 schedule

          12:26:00.729 [error] javascript.0 at co2_gd (script.js.common.Скрипт1:20:16)

          12:26:00.730 [error] javascript.0 at Object. (script.js.common.Скрипт1:93:5)

          20 var port = new SerialPort(device_port,{

          93 co2_gd(cmd_init,18, function(data) {

          с питоном ничего не дублируется, с терминалкой тоже все ок. никаких других скриптов кроме этого вообще нет. питон на время экспериментов остановил.

          похоже, что-то в недрах nodejs.serialport очень странно работает.

          1 Antwort Letzte Antwort
          0
          • A Offline
            A Offline
            andrey99986
            schrieb am zuletzt editiert von
            #11

            @artko:

            с питоном ничего не дублируется, с терминалкой тоже все ок. никаких других скриптов кроме этого вообще нет. питон на время экспериментов остановил.

            похоже, что-то в недрах nodejs.serialport очень странно работает. `

            Посмотреть кто занял порт:

             fuser /dev/ttyUSB1
            

            Иногда javascript driver надо перезапустить чтобы порт освободить.

            Это не помогло?

            var buflen = 9;
            
            1 Antwort Letzte Antwort
            0
            • A Offline
              A Offline
              artko
              schrieb am zuletzt editiert von
              #12

              @andrey99986:

              Посмотреть кто занял порт:

               fuser /dev/ttyUSB1
              

              Иногда javascript driver надо перезапустить чтобы порт освободить. `

              никто не занимает, ну и проверяю в процессах - уже вижу, если висит io.javascript c 100% загрузкой ядра - то ой. почему-то вешается именно при ожидании данных.

              сделал себе вот такой вариант скрипта для проверки по этапам:

              `createState('CO2_UART');
              
              var device_port = '/dev/ttyUSB0';
              var buflen = 64;
              var sleep_time = 200; // Sleep time between request and wait for response.
              var SerialPort = require('serialport');
              var ByteLength = SerialPort.parsers.ByteLength;
              var ppm;
              
              var cmd_init = new Buffer ([0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79]);
              var cmd_set_zero = new Buffer ([0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78]);
              //var cmd_abc_off = new Buffer ([0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86]);
              //var cmd_abc_on= new Buffer ([0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6]);
              
              function co2_gd(cmd,buflen,callback)
              {
              
                  var port = new SerialPort(device_port,{
                  baudRate: 9600,
                  dataBits: 8,
                  parity: 'none',
                  autoOpen: false
                  });
              
                  port.open(function (err) {
                      if (err) {
                          return console.log('Error opening port: ', err.message);
                      }
                      console.log('port opened');
                      console.log ('request='+JSON.stringify(cmd));
              
                      const parser = port.pipe(new ByteLength({length: buflen}));
                      port.pipe(parser);
              
                      port.write(cmd, function(err) {
                          if (err) {
                              return console.log('Error on write: ', err.message);
                          }
                          console.log('message written');
                          const parser = port.pipe(new ByteLength({length: buflen}));
                          port.pipe(parser);
              
                          console.log('wait response');
              
                          setTimeout(readport, 200);
                          function readport() {
                                                      console.log('readport enter');      
                                                      parser.on ('data', function (result) { 
                                                      console.log ('result='+JSON.stringify(result));
                                                      var i = 0;
                                                      while (i < 18)
                                                      {
                                if (result[i] == result[i+1])
                                {
                                    i += 2;
                                }
                                else
                                {
                                    if ((i + 2) < 18)
                                    {
                                        if (result[i] == result[i+2])
                                        {
                                            console.log ('fix data at position ' + i);
                                            result[i+2] = result[i+1];
                                            result[i+1] = result[i];
                                            i += 2;
                                        }
                                    }
                                }
                               console.log('fix cycle ' + i);
                              }
              
                                                      ppm = null;
                                                      var CRC_calc=0;
                                                      var CRC_get = result[16];
                                                      CRC_calc = (255 - (result[2] + result[4] + result[6] + result[8] + result[10] + result[12] + result[14]) % 256) + 1;
                                                      if (CRC_get != CRC_calc)
                                                      {
                                  console.log ('CRC ERROR');
                                  console.log('CRC_get='+(CRC_get));
                                  console.log('CRC_calc='+(CRC_calc));
                                  }
                                                      else
                                                      {
                                          ppm = result[4] * 256 + result[6];
                                          console.log('ppm='+ppm);
                                          if (ppm> 5000 )
                                          {
                                              console.log ('CRC OK');
                                              console.log('ppm='+ppm);
                                              console.log('CRC_get='+(CRC_get));
                                              console.log('CRC_calc='+(CRC_calc));   
                                              ppm = null;
                                          }
                                  }
                                                      if (callback && typeof(callback) === "function") {
                                                          callback(ppm);
                                                      } 
                                                      port.pause();
                                                      port.close();
                                                      return (ppm);
                                                  })
                          }
                          });
                  });
              
              }  //end function co2_gd
              
              //co2_gd(cmd_set_zero,18, function(data) {} ); //Set CO2 level as zero  (400 ppm)
              
              schedule("*/15 * * * * *", function () {
                  console.log('co2 request');
                  co2_gd(cmd_init,18, function(data) { 
                      //console.log('CO2 ppm='+data);
                      setState("CO2_UART",data);
                  });
              });` 
              
              ~~[quote]~~
              Это не помогло?
              `~~[code]~~var buflen = 9;[/code]` `  ` 
              
              неа, в таком виде как скрипт из первого сообщения - вообще не хочет работать. с ошибками.[/i][/i][/i]
              
              1 Antwort Letzte Antwort
              0
              • A Offline
                A Offline
                andrey99986
                schrieb am zuletzt editiert von
                #13

                @artko:

                Скрипт на питоне - работает как из пушки. Ни одной ошибки. `
                Что-то не видно проверки CRC на питоне. Понятно что без проверки ошибок нет :)

                1 Antwort Letzte Antwort
                0
                • A Offline
                  A Offline
                  artko
                  schrieb am zuletzt editiert von
                  #14

                  @andrey99986:

                  @artko:

                  Скрипт на питоне - работает как из пушки. Ни одной ошибки. Что-то не видно проверки CRC на питоне. Понятно что без проверки ошибок нет :)

                  то был первый вариант :) питон принимает строго нужное количество байт, crc совпадает :)

                  1 Antwort Letzte Antwort
                  0
                  • A Offline
                    A Offline
                    andrey99986
                    schrieb am zuletzt editiert von
                    #15

                    @artko:

                    то был первый вариант :) питон принимает строго нужное количество байт, crc совпадает :) `
                    CRC вычисляется в именно в строгом количестве байт, смотрите даташит на датчик. В вашем коде на питоне проверки CRC нет.

                    1 Antwort Letzte Antwort
                    0
                    • A Offline
                      A Offline
                      artko
                      schrieb am zuletzt editiert von
                      #16

                      @andrey99986:

                      @artko:

                      то был первый вариант :) питон принимает строго нужное количество байт, crc совпадает :) CRC вычисляется в именно в строгом количестве байт, смотрите даташит на датчик. В вашем коде на питоне проверки CRC нет.

                      я же написал, то был первый вариант….

                      import MySQLdb
                      import string
                      import time
                      import serial
                      
                      from datetime import datetime
                      
                      ser = serial.Serial('/dev/ttyUSB0',
                                            baudrate=9600,
                                            bytesize=serial.EIGHTBITS,
                                            parity=serial.PARITY_NONE,
                                            stopbits=serial.STOPBITS_ONE,
                                            timeout=1.0)
                      result=ser.write("\xff\x01\x86\x00\x00\x00\x00\x00\x79")
                      s=ser.read(9)
                      
                      str = ""
                      for ch in s:
                      	str += hex(ord(ch))+ " "
                      print str
                      crc_get = ord(s[8])
                      crc_calc = (255 - (ord(s[1]) + ord(s[2]) + ord(s[3]) + ord(s[4]) + ord(s[5]) + ord(s[6]) + ord(s[7]))) % 256 + 1
                      print "crc calc=" + hex(crc_calc) + " crc get=" + hex(crc_calc)
                      if s[0] == "\xff" and s[1] == "\x86" and crc_calc == crc_get:
                         co2 = ord(s[2])*256 + ord(s[3])  
                         print "crc ok"
                      else:
                         co2 = 0
                         print "crc error"
                      print "co2=", co2
                      
                      ts = time.time()
                      ts1 = int(ts * 1000)
                      print "ts=", ts1
                      
                      db = MySQLdb.connect(host="localhost", user="xxxxxxx", passwd="xxxxxxx", db="iobroker", charset="utf8")
                      cursor = db.cursor()
                      sql = """insert iobroker.ts_number(id, ts, val, ack, _from, q) values (12,%(ts)s,%(val)s,0,2,0) """ %{"ts":ts1, "val":co2}
                      print "sql=", sql
                      cursor.execute(sql)
                      db.commit()
                      db.close()
                      
                      

                      вывод исполнения

                      0xff 0x86 0x1 0xca 0x57 0x40 0x28 0x58 0x98

                      crc calc=0x98 crc get=0x98

                      crc ok

                      co2= 458

                      ts= 1514450008318

                      sql= insert iobroker.ts_number(id, ts, val, ack, _from, q) values (12,1514450008318,458,0,2,0)

                      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

                      470

                      Online

                      32.5k

                      Benutzer

                      81.8k

                      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