Damit sollte der Workaround für 15.0.7 nicht mehr nötig sein.
Schön dass es sich entwickelt!
Grüße
Schön dass es sich entwickelt!
Grüße
Code:
#!/usr/bin/perl use warnings; use strict; use Device::SerialPort; use feature "switch"; use EIBConnection; use RRDs; use Fcntl qw(:DEFAULT :flock); #0701000F0700FF = 15.7.0 #070100010801FF = 1.8.1 #070100010800FF = 1.8.1 # Lock setzen damit Skript nur einmal startet open *{0} or die "What!? $0:$!"; flock *{0}, LOCK_EX|LOCK_NB or die "$0 is already running somewhere!\n"; my $eib_url = "ip:rk_nas"; #for local eibd "local:/tmp/eib" for eibd in LAN: "ip:192.168.2.220:6720" my $device = "/dev/ttyUSB0"; my $repeat = 20; # Wiederholung alle x Sekunden my $rrdpath = "/var/www/rrd"; my $debug = 0; my @obis; push @obis,{obis=>"1.8.2", fact=>10000, ga =>"5/5/5", dpt => 14, rrd_name => "Zaehlerstand", rrd => "c" }; #rrd: c=counter ; g=gauge push @obis,{obis=>"15.7.0", fact=>10, ga =>"5/5/6", dpt => 14 , rrd_name => "Zaehler_Leistung", rrd => "g" }; my @countermodes = (5,15,60,1440); #Aufloesungen fuer COUNTER RRDs in Minuten (1440 = Tagesverbrauch) my $port = Device::SerialPort->new($device) || die $!; $port->databits(8) || die "failed setting databits"; $port->baudrate(9600) || die "failed setting baudrate"; $port->parity("none") || die "failed setting parity"; $port->stopbits(1); $port->handshake("none"); $port->dtr_active(0); $port->purge_all(); $port->read_char_time(0); # don't wait for each character $port->read_const_time(4000); # 1 second per unfulfilled "read" call $port->write_settings || die "cannot write settings"; # Loop zum Datenempfang my $error=0; while ($error != 1) { my ($x,$data) = 0 ; my $sml = 0; my $start = 0; my $value = 0; my $dec_value = 0; my $count = 0; my $saw = 0; if ($debug == 1) {print "Step 1 - Daten holen \n";} while ($start < 2) # wait for second 1B1B1B1B01010101 { ($count,$saw)=$port->read(512); # will read 512 chars if ($count == 512) # wurden 512 chars gelesen ? { $x = uc(unpack('H*',$saw)); # nach hex wandeln $data .= $x; if ($data =~ /1B1B1B1B01010101/) {$start ++}; } # if } # while if ($debug==1) {print "Step 2 - Reg Exp 1 Datensatz zusammensetzen \n";} $data =~ m/1B1B1B1B01010101(.*?)B1B1B1/; $sml = $1; print "Zaehler Haushalt: \n"; if ($debug==1) {print "Step 3 - Datensatz auswerten \n";} foreach my $obiscnt (@obis) { # Umwandeln OBIS in HEx [COLOR="Red"]my $hc =""; foreach my $c (split(/\./,$obiscnt->{obis})) { $hc .= sprintf("%02X", $c); } my $obissearch = $hc;[/COLOR] # FF fuer Suche an Hex-Wert anhaegne $obissearch .="FF"; if ($debug==1) { print $obissearch." Obis\n";} $sml =~ m/$obiscnt->{obis}(.*?)0177/; my $sml_val = $1; if ($debug==1) { print $1." contains hex \n";} #extract value $sml_val =~ s/^.*52FF//; $sml_val = substr($sml_val,2); if ($debug == 1) { print $sml_val." hex \n";} $value = $sml_val; $dec_value = sprintf("%d", hex($value)); $dec_value /= $obiscnt->{fact}; print $dec_value."<<<<---- Wert\n"; # RRD-Graphen erstellen - bei Bedarf wieder aktiv setzen #if ($obis->{rrd} eq "c") # { # &rrd_counter ($obis->{rrd_name},$dec_value) # } #if ($obis->{rrd} eq "g") # { # &rrd_gauge ($obis->{rrd_name},$dec_value) # } &knx_write ($obiscnt->{ga},$dec_value,$obiscnt->{dpt}); if ($debug == 1) {print "GA:".$obiscnt->{ga}." Wert:".$dec_value." DPT:".$obiscnt->{dpt}."\n";} } # foreach sleep $repeat; } # while $port->close() || warn "Serial port did not close proper!\n"; undef $port; ### SUBS ### sub rrd_counter {} # wie gehabt sub rrd_gauge {} # wie gehabt sub knx_write {} # wie gehabt
Kommentar