Скрипт для счетчика Меркурий 200

Вопросы и информация о скриптах для ioBroker
Antworten
andrey99986
professional
Beiträge: 198
Registriert: 24.08.2016, 11:12

Скрипт для счетчика Меркурий 200

Beitrag von andrey99986 » 19.09.2017, 17:09

Кто нибудь считывает по CAN/RS485 данные с эл. счётчика Меркурий 230 ?
Скрипт для Меркурий-200 у меня есть, переписал с php, но вот поменял эл. счётчик на Меркурий 230, может кто поделится готовым js-скриптом?
Zuletzt geändert von andrey99986 am 27.09.2017, 12:10, insgesamt 1-mal geändert.

Benutzeravatar
instalator
guru
Beiträge: 1258
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Скрипт для счётчика

Beitrag von instalator » 19.09.2017, 19:38

andrey99986 hat geschrieben:Кто нибудь считывает по CAN/RS485 данные с эл. счётчика Меркурий 230 ?
Скрипт для Меркурий-200 у меня есть, переписал с php, но вот поменял эл. счётчик на Меркурий 230, может кто поделится готовым js-скриптом?
Надо бы драйвер для счетчиков Меркурий написать, но у меня их нет.
а 230 уже не читается как 200ый?
Высокий уровень Децибел вреден для здоровья!
Мой блог

andrey99986
professional
Beiträge: 198
Registriert: 24.08.2016, 11:12

Re: Скрипт для счётчика

Beitrag von andrey99986 » 20.09.2017, 07:04

instalator hat geschrieben:
andrey99986 hat geschrieben:Кто нибудь считывает по CAN/RS485 данные с эл. счётчика Меркурий 230 ?
Скрипт для Меркурий-200 у меня есть, переписал с php, но вот поменял эл. счётчик на Меркурий 230, может кто поделится готовым js-скриптом?
Надо бы драйвер для счетчиков Меркурий написать, но у меня их нет.
а 230 уже не читается как 200ый?
К сожалению 230 не считывается как 200. При этом у 230 гораздо больше функционала.
Я конечно могу снова сконвертировать вручную из php в рабочий вариант. Но код будет ужасный. Допилишь до драйвера если доступ к серверу дам?

Benutzeravatar
aurodionov
professional
Beiträge: 384
Registriert: 14.07.2014, 16:39
Wohnort: Россия, Тюмень
Kontaktdaten:

Re: RE: Re: Скрипт для счётчика

Beitrag von aurodionov » 20.09.2017, 08:36

andrey99986 hat geschrieben:Кто нибудь считывает по CAN/RS485 данные с эл. счётчика Меркурий 230 ?
Скрипт для Меркурий-200 у меня есть, переписал с php, но вот поменял эл. счётчик на Меркурий 230, может кто поделится готовым js-скриптом?
А можно срипт под 200й, у меня такой стоит дома, так пока ума и не дал

Отправлено с моего Nexus 5 через Tapatalk
Пишу с пульта....

andrey99986
professional
Beiträge: 198
Registriert: 24.08.2016, 11:12

Re: RE: Re: Скрипт для счётчика

Beitrag von andrey99986 » 20.09.2017, 09:40

aurodionov hat geschrieben:
andrey99986 hat geschrieben:Кто нибудь считывает по CAN/RS485 данные с эл. счётчика Меркурий 230 ?
Скрипт для Меркурий-200 у меня есть, переписал с php, но вот поменял эл. счётчик на Меркурий 230, может кто поделится готовым js-скриптом?
А можно срипт под 200й, у меня такой стоит дома, так пока ума и не дал

Отправлено с моего Nexus 5 через Tapatalk
Для начала надо сформировать команды запроса по инструкции:
https://github.com/mrkrasser/MercuryStats
Затем поправить на свои в cmd1 и в cmd2, изменить на свой порт (вместо '/dev/ttyUSB2').
Контрольную сумму не проверял, можно дописать если будут ошибки считывания.

Code: Alles auswählen

createState("s1",0);
createState('Uv');
createState('Ia');
createState('Ew');
createState('T1');
createState('T2');
var cmd1 = new Buffer ([0x00,0x07,0x74,0xBE,0x63,0x54,0xE7]);
var cmd2 = new Buffer ([0x00,0x07,0x74,0xBE,0x27,0x54,0xD4]);
var sendtype = 1;
var cmd = cmd1;
var cnt = 0;
function isEven(value) {
	if (value%2 === 0)
		return true;
	else
		return false;
}


schedule("* * * * *", function () {
cnt = cnt + 1; 
    if (isEven(cnt) === true ) {
        sendtype=1;
        cmd=cmd1;
        buflen = 14;
    }
    else {
        sendtype = 2;
        cmd=cmd2;
        buflen = 23;
    }
var SerialPort = require('serialport');
var port = new SerialPort('/dev/ttyUSB2', {
parser: SerialPort.parsers.byteLength(buflen),
  baudrate: 9600,
  dataBits: 8,
  parity: 'none'
}, function (err) {
  if (err) {
    return console.log('Error: ', err.message);
  }
  port.write(cmd, function(err) {
    if (err) {
      return console.log('Error on write: ', err.message);
    }
    });
});

setStateDelayed('s1', false, 10, false, function () {
    port.on('data', function (data) {
       if (sendtype == 1) {
        //   
        if (Number(data.toString('hex',5,7)/10) < 300) {
          setState('Uv', Number(data.toString('hex',5,7)/10));
          var Ia=Number(data.toString('hex',7,9)/100);
          if (Ia>60)
            {
            setState("sayit.0.tts.text",'ru;75;Перегрузка электросети');
            
            }
	      setState('Ia', Number(data.toString('hex',7,9)/100));
	      setState('Ew', Number(data.toString('hex',9,12)/1));
        }
	    //
       }
       if (sendtype == 2 ) {
            if (Number(data.toString('hex', 5,  9) / 100) ) {
              setState('T1', Number(data.toString('hex', 5,  9) / 100));
              setState('T2', Number(data.toString('hex', 9,  13) / 100));    
              }
            }
      });
    });
setStateDelayed('s1', false, 1000, false, function () {
    port.pause();
    port.close();
  //  log('Port is closed');
  });
});


Benutzeravatar
aurodionov
professional
Beiträge: 384
Registriert: 14.07.2014, 16:39
Wohnort: Россия, Тюмень
Kontaktdaten:

Re: RE: Re: RE: Re: Скрипт для счётчика

Beitrag von aurodionov » 20.09.2017, 12:27

andrey99986 hat geschrieben:
aurodionov hat geschrieben:
andrey99986 hat geschrieben:Кто нибудь считывает по CAN/RS485 данные с эл. счётчика Меркурий 230 ?
Скрипт для Меркурий-200 у меня есть, переписал с php, но вот поменял эл. счётчик на Меркурий 230, может кто поделится готовым js-скриптом?
А можно срипт под 200й, у меня такой стоит дома, так пока ума и не дал

Отправлено с моего Nexus 5 через Tapatalk
Для начала надо сформировать команды запроса по инструкции:
https://github.com/mrkrasser/MercuryStats
Затем поправить на свои в cmd1 и в cmd2, изменить на свой порт (вместо '/dev/ttyUSB2').
Контрольную сумму не проверял, можно дописать если будут ошибки считывания.

Code: Alles auswählen

createState("s1",0);
createState('Uv');
createState('Ia');
createState('Ew');
createState('T1');
createState('T2');
var cmd1 = new Buffer ([0x00,0x07,0x74,0xBE,0x63,0x54,0xE7]);
var cmd2 = new Buffer ([0x00,0x07,0x74,0xBE,0x27,0x54,0xD4]);
var sendtype = 1;
var cmd = cmd1;
var cnt = 0;
function isEven(value) {
	if (value%2 === 0)
		return true;
	else
		return false;
}


schedule("* * * * *", function () {
cnt = cnt + 1; 
    if (isEven(cnt) === true ) {
        sendtype=1;
        cmd=cmd1;
        buflen = 14;
    }
    else {
        sendtype = 2;
        cmd=cmd2;
        buflen = 23;
    }
var SerialPort = require('serialport');
var port = new SerialPort('/dev/ttyUSB2', {
parser: SerialPort.parsers.byteLength(buflen),
  baudrate: 9600,
  dataBits: 8,
  parity: 'none'
}, function (err) {
  if (err) {
    return console.log('Error: ', err.message);
  }
  port.write(cmd, function(err) {
    if (err) {
      return console.log('Error on write: ', err.message);
    }
    });
});

setStateDelayed('s1', false, 10, false, function () {
    port.on('data', function (data) {
       if (sendtype == 1) {
        //   
        if (Number(data.toString('hex',5,7)/10) < 300) {
          setState('Uv', Number(data.toString('hex',5,7)/10));
          var Ia=Number(data.toString('hex',7,9)/100);
          if (Ia>60)
            {
            setState("sayit.0.tts.text",'ru;75;Перегрузка электросети');
            
            }
	      setState('Ia', Number(data.toString('hex',7,9)/100));
	      setState('Ew', Number(data.toString('hex',9,12)/1));
        }
	    //
       }
       if (sendtype == 2 ) {
            if (Number(data.toString('hex', 5,  9) / 100) ) {
              setState('T1', Number(data.toString('hex', 5,  9) / 100));
              setState('T2', Number(data.toString('hex', 9,  13) / 100));    
              }
            }
      });
    });
setStateDelayed('s1', false, 1000, false, function () {
    port.pause();
    port.close();
  //  log('Port is closed');
  });
});

Спасибо, притащусь с работы посмотрю

Отправлено с моего Nexus 5 через Tapatalk
Пишу с пульта....

Benutzeravatar
aurodionov
professional
Beiträge: 384
Registriert: 14.07.2014, 16:39
Wohnort: Россия, Тюмень
Kontaktdaten:

Re: Скрипт для счетчика Меркурий 200

Beitrag von aurodionov » 30.01.2018, 16:41

Наконец дошли руки проверить , сыпится ошибка
  • javascript.0 2018-01-30 20:37:00.876 error at Object. (script.js.counter:34:28)
    javascript.0 2018-01-30 20:37:00.875 error Error in callback: TypeError: SerialPort.parsers.byteLength is not a function
может неправильно составил запрос , № счётчика 02844114 08 ,соответственно взял 844114.
получилось :
var cmd1 = new Buffer ([0x00,0x0C,0xE1,0x52,0x63,0x9F,0xCB]);
var cmd2 = new Buffer ([0x00,0x0C,0xE1,0x52,0x27,0x82,0x9B]);
В чём ошибка ?
Zuletzt geändert von aurodionov am 31.01.2018, 04:46, insgesamt 1-mal geändert.
Пишу с пульта....

Benutzeravatar
Bluefox
Site Admin
Beiträge: 7909
Registriert: 13.07.2014, 14:42
Kontaktdaten:

Re: Скрипт для счетчика Меркурий 200

Beitrag von Bluefox » 30.01.2018, 16:51

aurodionov hat geschrieben:Наконец дошли руки проверить , сыпится ошибка
  • javascript.0 2018-01-30 20:37:00.876 error at Object. (script.js.counter:34:28)
    javascript.0 2018-01-30 20:37:00.875 error Error in callback: TypeError: SerialPort.parsers.byteLength is not a function
может неправильно составил запрос , № счётчика 0284114 08 ,соответственно взял 84114.
получилось :
var cmd1 = new Buffer ([0x00,0x0C,0xE1,0x52,0x63,0x9F,0xCB]);
var cmd2 = new Buffer ([0x00,0x0C,0xE1,0x52,0x27,0x82,0x9B]);
В чём ошибка ?
Согласно https://www.npmjs.com/package/serialpor ... rs--object
byteLength => ByteLength

Benutzeravatar
aurodionov
professional
Beiträge: 384
Registriert: 14.07.2014, 16:39
Wohnort: Россия, Тюмень
Kontaktdaten:

Re: Скрипт для счетчика Меркурий 200

Beitrag von aurodionov » 31.01.2018, 06:48

Не работает, при parser: SerialPort.parsers.ByteLength(buflen),
пишет что не является функцией. Я так понимаю это связано с новым апи
SerialPort версии 5+.
Лог прилогаю
  • javascript.0 2018-01-31 19:08:00.106 error at Object. (script.js.counter:43:28)
    javascript.0 2018-01-31 19:08:00.106 error at Object.ByteLengthParser [as ByteLength] (/opt/iobroker/node_modules/iobroker.javascript/node_modules/serialport/lib/parsers/byte-length.js:6:14)
    javascript.0 2018-01-31 19:08:00.105 error Error in callback: TypeError: Class constructors cannot be invoked without 'new'
    javascript.0 2018-01-31 19:07:00.207 error at Object. (script.js.counter:43:28)
    javascript.0 2018-01-31 19:07:00.205 error at Object.ByteLengthParser [as ByteLength] (/opt/iobroker/node_modules/iobroker.javascript/node_modules/serialport/lib/parsers/byte-length.js:6:14)
    javascript.0 2018-01-31 19:07:00.203 error Error in callback: TypeError: Class constructors cannot be invoked without 'new'
    javascript.0 2018-01-31 19:06:58.109 info script.js.counter: registered 0 subscriptions and 3 schedules
    javascript.0 2018-01-31 19:06:57.908 info Start javascript script.js.counter
Пишу с пульта....

andrey99986
professional
Beiträge: 198
Registriert: 24.08.2016, 11:12

Re: Скрипт для счетчика Меркурий 200

Beitrag von andrey99986 » 14.02.2018, 08:20

aurodionov hat geschrieben:Не работает, при parser: SerialPort.parsers.ByteLength(buflen),
пишет что не является функцией. Я так понимаю это связано с новым апи
SerialPort версии 5+.
К сожалению я уже вывел из эксплуатации Меркурий 200. Сейчас у меня Меркурий 230, а в нём уже актуализированная версия SerialPort.
Попробуйте использовать синтаксис SerialPort из скрипта для Меркурия 230 в соседней теме и разработать новый для Меркурия 200.

Antworten