Previous Entry Share Next Entry
Получаем данные с оптопорта электросчётчика КАСКАД-1-МТ
snickser
После плановой замены счётчика в квартире появилось жгучее желание получать с него все данные и строить графики потребления электроэнергии. Мой счётчик оборудован оптопортом и световым индикатором импульсов. В результате задействовал оба )) Лампочку подцепил через фоторезистор к Ардуино и снимаю среднюю текущую нагрузку, но об этом потом напишу, там отдельный секс, а вот с оптопортом пришлось оочень сильно повозиться.




Как оказалось сейчас в продаже нет вообще никакого готового оборудования для подключения, производитель на почту не отвечает, к счастью был найден аналог под названием VR-005, но и с ним есть засада, подсоединяя в упор - не работает, то ли слепнет, то ли промахивается мимо, пришлось мастерить трубу держатель из картонки и вешать всё на изоленту, подобрав расстояние между фотопарами 2-3 см. Тот девайс рассчитан на магнитный держатель, но в моём счётчике такого не оказалось, так что селяви, как говорится.

Далее софт, производитель на сайте предлагает MeterTools с модулями но как всегда собака порылась в нюансах, а именно по умолчанию после запуска этот софт лезет обновляться (что категорически нельзя делать как выяснилось) и после обновления перестаёт работать совсем. Так что просто отказываемся и продолжаем использоваться его в базовой комплектации. Так же надо удалить из директории с библиотеками драйвер для "не нашего" счётчика, который нарочито пытается обнаружится в самом начале.
Обязательно введите адрес счётчика который он показывает на экране, без него не сработает.

Безымянный1.PNG

Безымянный1.PNG

Из этого софта можно включить всякие прикольные примочки вроде отображения дополнительной информации на экране и т.п. Ну вообще там всё элементарно, но нас интересует подключение к Linux для рисования RRD графиков... И мне для этого пришлось поработать кул-хацкером чуток ))) а именно распотрошить протокол обмена по серийному порту снифером и сильно поинтуичить с пониманием чего же там такое происходит.

В общем всё просто, посылаем в порт команду, получаем данные, парсим, выводим. А выводить он может уйму всего: шесть счётчиков, активные / реактивные, косинус шмосинус, вольтаж, ампернаж... )))
В общем есть из чего построить графики.





Там внизу приложил я вам скрипт на perl-е, чтоб долго не писать словами ненужные предложения, почитав его поймете сразу где что и как искать. Скрипт выводит все шесть ячеек хранения показателей по очереди, а последним мгновенные данные электросети. Ячейки найдены "на ощупь", потому не ручаюсь за достоверность информации. Надо искать документацию на протокол от производителя...

2817740 2817740 957480 597500 1262760
0 0 0 0 0
11950 11950 2520 4040 5390
558550 558550 182250 152160 224140
2817740 2817740 957480 597500 1262760
570500 570500 184770 156200 229530
293 221.41 49.99 -66 0.879 1.507


[Spoiler (click to open)]
#!/usr/bin/perl

$|=1;

use Device::SerialPort;
my $port = Device::SerialPort->new("/dev/ttyUSB0") || die;

$port->baudrate(9600);
$port->databits(8);
$port->parity("none");
$port->stopbits(1);
$port->read_char_time(0.5);
$port->read_const_time(0);
$port->write_settings;

# time code
$date = "7355200063EDFFFF1C000000007B55";

# data code
@input[0] = "7355210063EDFFFF050000000000B855"; # A+
@input[1] = "7355210063EDFFFF0500000000011155"; # A-
@input[2] = "7355210063EDFFFF0500000000024355"; # R+
@input[3] = "7355210063EDFFFF050000000003EA55"; # R-
@input[4] = "7355210063EDFFFF050000000004E755"; # Aabs
@input[5] = "7355210063EDFFFF0500000000054E55"; # Rabs

# now code
$now = "7355210063EDFFFF2B00000000001F55";


while(1){

foreach my $i (@input){

my $ascii = pack("H*", $i);
$port->write($ascii);
my ($cnt, $str) = $port->read(200);

my $hex = unpack("H*",$str);

$hex =~ s/7311/55/g;
$hex =~ s/7322/73/g;

#print "$cnt $hex\n";

my @aa = $hex =~ /.{2}/g;

$sp = hex("$aa[38]$aa[37]$aa[36]$aa[35]")*10;
$st = hex("$aa[42]$aa[41]$aa[40]$aa[39]")*10;
$t1 = hex("$aa[46]$aa[45]$aa[44]$aa[43]")*10;
$t2 = hex("$aa[50]$aa[49]$aa[48]$aa[47]")*10;
$t3 = hex("$aa[54]$aa[53]$aa[52]$aa[51]")*10;
print "$sp $st $t1 $t2 $t3\n";

}

####

my $ascii = pack("H*", $now);
$port->write($ascii);
my ($cnt, $str) = $port->read(200);

my $hex = unpack("H*",$str);

$hex =~ s/7311/55/g;
$hex =~ s/7322/73/g;

my @aa = $hex =~ /.{2}/g;

    $wt = hex("$aa[35]$aa[34]");
    $kvar = hex($aa[36]);
    $kvar*=-1 if hex($aa[37])>>7;
    $hz = hex("$aa[39]$aa[38]")/100;
    $cosf = hex("$aa[41]$aa[40]")/1000;
    $vl = hex("$aa[43]$aa[42]")/100;
    $amp = hex("$aa[49]$aa[48]")/1000;

print "$wt $vl $hz $kvar $cosf $amp\n\n";

sleep(1);

}



  • 1
Отличая система.

  • 1
?

Log in