Hallo miteinander,
anbei mein erstes Wiregate Plugin um meine Gas- und Wasserzähler auszulesen.
Die Zähler sind wie folgt angeschlossen:
Gas|Wasser Zähler <-> SCE interface <-> MBus Slave <-> MBUS10 Pegelwandler <-> usb2serial Kabel am Wiregate
anbei mein erstes Wiregate Plugin um meine Gas- und Wasserzähler auszulesen.
Die Zähler sind wie folgt angeschlossen:
Gas|Wasser Zähler <-> SCE interface <-> MBus Slave <-> MBUS10 Pegelwandler <-> usb2serial Kabel am Wiregate
Code:
# Perl script um Zählerwerte via MBUS10(Pegelwandler) auszulesen # welcher über die serielle Schnittstelle am Wiregate angeschlossen ist use Device::SerialPort; ################## ### DEFINITION ### ################## my $zaehler_ga="14/6/1"; # Zaehler GA im EIS 9 Format my @zaehler_id=(0x10,0x7B,0x01,0x7C,0x16); # Zaehler ID des MBus Geraet my $port = Device::SerialPort->new("/dev/usbserial-1-3.4"); my $anzahl_zeichen=33; # Anzahl Zeichen welche vom MBus Geraet gelesen werden my $send_data = pack("C*", @zaehler_id); # Set up the serial port # 2400, 81E on the USB2Serial driver $port->read_char_time(0); # don't wait for each character $port->read_const_time(1000); # 1 second per unfulfilled "read" call $port->baudrate(2400); $port->databits(8); $port->stopbits(1); $port->parity("even"); my $timeout=1; ####################### ### ENDE DEFINITION ### ####################### # Eigenen Aufruf-Zyklus auf X Sekunden setzen $plugin_info{$plugname.'_cycle'} = 300; # Hauptverarbeitung my $count_out = $port->write("$send_data\n") || die "Kann Daten nicht schreiben ...\n"; my $chars=0; my $buffer=""; while ($timeout > 0) { my ($count,$saw)=$port->read($anzahl_zeichen); if ($count > 0) { $chars+=$count; $buffer.=$saw; } else { $timeout--; } } # If we get data, then print it my $data=""; if ($chars eq $anzahl_zeichen) { $data=unpack("H*", $buffer); my $zaehlerstand=int(substr($data,60,2) . substr($data,58,2) . substr($data,56,2) . substr($data,54 ,2)); if ($plugin_info{$plugname.'_result_saved'} < $zaehlerstand) { $plugin_info{$plugname.'_result_saved'} = $zaehlerstand; knx_write($zaehler_ga,$zaehlerstand,14); # Zaehlerstand auf den Bus schreiben return $zaehlerstand; } else { return 0; } } else { return "no data received!\n"; }
Kommentar