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