Hallo
Ich werde es noch ein paar Tage Testen, dann kann ich es ja veröffentlichen.
Gruß NetFritz
Ich werde es noch ein paar Tage Testen, dann kann ich es ja veröffentlichen.
Gruß NetFritz
#!/usr/bin/perl # # Holt die Daten vom SML-Zaehler Easymeter Q3C # es wird die obere optische Schnittstelle ausgelesen # dort liefert der Zaehler alle 2sec. einen Datensatz # wird von CRON jede Minute aufgerufen # http://wiki.volkszaehler.org/software/sml # 03.2012 by NetFritz # use Device::SerialPort; use RRDs; # my $port = Device::SerialPort->new("/dev/usbserial-2-4") || die $!; $port->databits(8); $port->baudrate(9600); $port->parity("none"); $port->stopbits(1); $port->handshake("none"); $port->write_settings; $port->dtr_active(1); $port->purge_all(); $port->read_char_time(0); # don't wait for each character $port->read_const_time(1000); # 1 second per unfulfilled "read" call # # OBIS-Kennzahl und Anzahl der Zeichen von Anfang OBIS bis Messwert, Messwertwertlaenge immer 8 Zeichen %obis_len = ( '01010801FF' => 42, # Aktueller Zählerstand T1 + Bezug '02020805FF' => 42, # Aktueller Zählerstand T5 - Abgabe '00010700FF' => 24 # Momentane Summe der Leistung +- ); my $pos = 0; my $hexval; my @hexdec; while ($i < 3) { # wenn 540 chars gelesen werden wird mit last abgebrochen, wenn nicht wird Schleife 2 mal widerholt my ($count,$saw)=$port->read(540); # will read 540 chars if ($count == 540) { # wurden 540 chars gelesen ? my $x=uc(unpack('H*',$saw)); # nach hex wandeln # print "$count <> $x\n "; # gibt die empfangenen Daten in Hex aus # foreach $key(keys%obis_len){ $pos=index($x,$key); # pos von OBIS holen $value = substr($x,$pos+$obis_len{$key},8); # Messwert $value{$key} = hexstr_to_signed32int($value)/100; # von hex nach 32bit integer } last; # while verlassen } else { $i++; redo; # bei Fehler while nochmal } } # @hexdec = encode_dpt9($value{'00010700FF'}); $hexval = sprintf("%x", $hexdec[0]) . " " . sprintf("%x", $hexdec[1]); system("groupwrite ip:127.0.0.1 5/0/12 $hexval"); # @hexdec = encode_dpt9($value{'01010801FF'}); $hexval = sprintf("%x", $hexdec[0]) . " " . sprintf("%x", $hexdec[1]); system("groupwrite ip:127.0.0.1 5/0/13 $hexval"); # @hexdec = encode_dpt9($value{'02020805FF'}); $hexval = sprintf("%x", $hexdec[0]) . " " . sprintf("%x", $hexdec[1]); system("groupwrite ip:127.0.0.1 5/0/14 $hexval"); # RRDs::update("/var/www/rrd/Zaehler_Leistung.rrd", "N: $value{'00010700FF'}"); # # # --- Sub Konvertiert hex string to 32 bit signed integer ---------- sub hexstr_to_signed32int { my ($hexstr) = @_; die "Invalid hex string: $hexstr" if $hexstr !~ /^[0-9A-Fa-f]{1,8}$/; my $num = hex($hexstr); return $num >> 31 ? $num - 2 ** 32 : $num; } # --- Sub 2byte signed float -------------------------------------- sub encode_dpt9 { my $state = shift; my $data; my $sign = ($state <0 ? 0x8000 : 0); my $exp = 0; my $mant = 0; $mant = int($state * 100.0); while (abs($mant) > 2047) { $mant /= 2; $exp++; } $data = $sign | ($exp << 11) | ($mant & 0x07ff); return $data >> 8, $data & 0xff; } # Ende
# print "$count <> $x\n ";
#!/usr/bin/perl # # (m)ein Stromz0hler mit IR-Schnittstelle blubbert nach einem "Anforderung- # telegramm" Daten raus. Das Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit # und gerader Parit0t zu senden. Das ist der Initialmodus von Ger0ten, # die das Protokoll IEC 62056-21 implementieren. # # Autor: Andreas Schulze # Bugfix: Eric Schanze # Datum: 20120302 # my $PORT='/dev/ttyUSB-1-4'; my $anforderungstelegramm = "\n/?!\r\n"; use warnings; use strict; use utf8; use Device::SerialPort; my $tty = new Device::SerialPort($PORT) || die "can't open $PORT: $!"; $tty->baudrate(300) || die 'fail setting baudrate'; $tty->databits(7) || die 'fail setting databits'; $tty->stopbits(1) || die 'fail setting stopbits'; $tty->parity("even") || die 'fail setting parity'; $tty->write_settings || die 'fail write settings'; $tty->rts_active(1); $tty->dtr_active(1); $tty->read_char_time(500); # 0.5 seconds for each character $tty->read_const_time(3000); # 3 second per unfulfilled "read" call #$tty->debug(1); my $num_out = $tty->write($anforderungstelegramm); die "write failed\n" unless ($num_out); die "write inclomplete\n" unless ($num_out == length($anforderungstelegramm)); print "$num_out Bytes written\n"; my ($num_read, $s); while(1) { ($num_read, $s) = $tty->read(10); print $s; } $tty->close || die "can't close $PORT: $!";
root@wiregate403:~# perl /var/tmp/test2.pl 6 Bytes written /EMH4\@--ITZ-G0039E F.F(00000000) 0.0.0(02200263) 0.0.1(02922369) 0.0.2(00000000) 0.1.0(03) 0.1.2*03(0120301000000) 0.1.2*02(0120201000000) 0.1.2*01(0120123113234) 0.1.2*00(0000000000000) 0.1.2*99(0000000000000) 0.1.2*98(0000000000000) 0.1.2*97(0000000000000) 0.1.2*96(0000000000000) 0.1.2*95(0000000000000) 0.1.2*94(0000000000000) 0.1.2*93(0000000000000) 0.1.2*92(0000000000000) 0.1.2*91(0000000000000) 0.1.2*90(0000000000000) 0.1.2*89(0000000000000) 0.2.2(11131719) 0.9.1(1222325) 0.9.2(1120329) 1.8.0(0001715.0*kWh) 1.8.0*03(0001307.3*kWh) 1.8.0*02(0000507.0*kWh) 1.8.0*01(0000009.3*kWh) 1.8.0*00(0000000.0*kWh) 1.8.0*99(0000000.0*kWh) 1.8.0*98(0000000.0*kWh) 1.8.0*97(0000000.0*kWh) 1.8.0*96(0000000.0*kWh) 1.8.0*95(0000000.0*kWh) 1.8.0*94(0000000.0*kWh) 1.8.0*93(0000000.0*kWh) 1.8.0*92(0000000.0*kWh) 1.8.0*91(0000000.0*kWh) 1.8.0*90(0000000.0*kWh) 1.8.0*89(0000000.0*kWh) 1.8.1(0001707.8*kWh) 1.8.1*03(0001300.0*kWh) 1.8.1*02(0000499.7*kWh) 1.8.1*01(0000002.0*kWh) 1.8.1*00(0000000.0*kWh) 1.8.1*99(0000000.0*kWh) 1.8.1*98(0000000.0*kWh) 1.8.1*97(0000000.0*kWh) 1.8.1*96(0000000.0*kWh) 1.8.1*95(0000000.0*kWh) 1.8.1*94(0000000.0*kWh) 1.8.1*93(0000000.0*kWh) 1.8.1*92(0000000.0*kWh) 1.8.1*91(0000000.0*kWh) 1.8.1*90(0000000.0*kWh) 1.8.1*89(0000000.0*kWh) 1.8.2(0000003.2*kWh) 1.8.2*03(0000003.2*kWh) 1.8.2*02(0000003.2*kWh) 1.8.2*01(0000003.2*kWh) 1.8.2*00(0000000.0*kWh) 1.8.2*99(0000000.0*kWh) 1.8.2*98(0000000.0*kWh) 1.8.2*97(0000000.0*kWh) 1.8.2*96(0000000.0*kWh) 1.8.2*95(0000000.0*kWh) 1.8.2*94(0000000.0*kWh) 1.8.2*93(0000000.0*kWh) 1.8.2*92(0000000.0*kWh) 1.8.2*91(0000000.0*kWh) 1.8.2*90(0000000.0*kWh) 1.8.2*89(0000000.0*kWh) 1.8.3(0000002.0*kWh) 1.8.3*03(0000002.0*kWh) 1.8.3*02(0000002.0*kWh) 1.8.3*01(0000002.0*kWh) 1.8.3*00(0000000.0*kWh) 1.8.3*99(0000000.0*kWh) 1.8.3*98(0000000.0*kWh) 1.8.3*97(0000000.0*kWh) 1.8.3*96(0000000.0*kWh) 1.8.3*95(0000000.0*kWh) 1.8.3*94(0000000.0*kWh) 1.8.3*93(0000000.0*kWh) 1.8.3*92(0000000.0*kWh) 1.8.3*91(0000000.0*kWh) 1.8.3*90(0000000.0*kWh) 1.8.3*89(0000000.0*kWh) 1.8.4(0000002.0*kWh) 1.8.4*03(0000002.0*kWh) 1.8.4*02(0000002.0*kWh) 1.8.4*01(0000002.0*kWh) 1.8.4*00(0000000.0*kWh) 1.8.4*99(0000000.0*kWh) 1.8.4*98(0000000.0*kWh) 1.8.4*97(0000000.0*kWh) 1.8.4*96(0000000.0*kWh) 1.8.4*95(0000000.0*kWh) 1.8.4*94(0000000.0*kWh) 1.8.4*93(0000000.0*kWh) 1.8.4*92(0000000.0*kWh) 1.8.4*91(0000000.0*kWh) 1.8.4*90(0000000.0*kWh) 1.8.4*89(0000000.0*kWh) 2.8.0(0000002.2*kWh) 2.8.0*03(0000002.2*kWh) 2.8.0*02(0000002.2*kWh) 2.8.0*01(0000002.2*kWh) 2.8.0*00(0000000.0*kWh) 2.8.0*99(0000000.0*kWh) 2.8.0*98(0000000.0*kWh) 2.8.0*97(0000000.0*kWh) 2.8.0*96(0000000.0*kWh) 2.8.0*95(0000000.0*kWh) 2.8.0*94(0000000.0*kWh) 2.8.0*93(0000000.0*kWh) 2.8.0*92(0000000.0*kWh) 2.8.0*91(0000000.0*kWh) 2.8.0*90(0000000.0*kWh) 2.8.0*89(0000000.0*kWh) !
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar