Ankündigung

Einklappen
Keine Ankündigung bisher.

Zählerabfrage als Wiregate Plugin

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • nipponichi
    antwortet
    Lange her, aber ich hatte mal den Effekt, dass aus irgendwelchen Gründen mehrere Instanzen parallel liefen und daher nur noch Schrott gelesen haben.

    Einen Kommentar schreiben:


  • NightRacer
    antwortet
    Moin,

    Ich habe nach langem Probieren das Skript sml_meter.pl zwar auch grundsätzlich am laufen, d.h. Gruppenadressen werden beschrieben, RRD Daten befüllt.
    Jedoch geht mir nach ein paar Stunden die CPU Last des RasPi durch die Decke und er ist dadurch quasi nicht mehr ansprechbar und Kackt irgendwann ab,
    so das nur noch ein reboot hilft....für ein paar Stunden...


    Daher meine Frage:

    Hat hier jemand mit einem ISKRA MT681 oder einem vergleichbaren SML Zähler ein script am laufen das zuverlässig funktioniert?


    meine konfig: Zähler ISKRA MT681 sml-meter.pl Skript per cron aufruf (minütlich) auf RasPi 2B mit cometVisu und linknx



    beste Grüße

    Michael

    Einen Kommentar schreiben:


  • heckmannju
    antwortet
    Hi,
    habe das Script iec62056.pl ohne probleme zum laufen gebracht. Im Zusammenspiel mit einem Elster AS 1440 und dem USB Kopf von Udo von Volkszähler.org hinbekommen.
    VG
    Jürgen
    Zuletzt geändert von heckmannju; 24.02.2016, 23:19.

    Einen Kommentar schreiben:


  • MrDuFF
    antwortet
    Hallo Mirko,

    die Werte wurden nicht auf die GA geschrieben.
    Allerdings habe ichs jetzt hinbekommen keine Ahnung wie aber es läuft :-)

    Danke totzdem.

    Code:
    #!/usr/bin/perl -w
    # Zaehlerabfrage fuer Zaehler nach Protokoll IEC 62056-21 / OBIS
    # Ein Anfrage-Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit
    # und gerader Paritaet zu senden. Das ist der Initialmodus von Geraeten,
    # die das Protokoll IEC 62056-21 implementieren.
    # Ein Wechsel der Geschwindigkeit ist umgesetzt.
    # Basis des Scripts von volkszaehler.org / Autor: Andreas Schulze & Bugfix: Eric Schanze
    # DPT9 sub: makki / www.knx-user-forum.de
    # Baudwechsel: panzaeron / www.knx-user-forum.de
    # Erweiterung um RRD,KNX-Anbindung und gezielte Wertsuche auf Wiregate:
    # JuMi2006 / www.knx-user-forum.de (DPT14 beta fixed: Frank0207)
    # Version: 0.1.7
    # Datum: 14.02.2013
    
    use warnings;
    use strict;
    use RRDs;
    use feature "switch";
    use EIBConnection;
    
    ### KONFIGURATION ###
    my $eib_url = "local:/tmp/eib";     #for local eibd "local:/tmp/eib" for eibd in LAN: "ip:192.168.2.220:6720"
    my $device = "/dev/ttyUSB0";        #Port ttyUSB0
    my $rrdpath = "/var/www/rrd";      #Pfad fuer RRDs
    my $counterid = "yS_eHZ";               #Grundname fuer RRDs
    my $baudrate = "300";              #Baudrate fuer Zaehlerauslesung
    my @channels;                       #Obis-Zahl => Gruppenadresse
    push @channels, {name => "1.8.0", ga =>"12/6/0", dpt => 14 };    #Zählerstand gesamt
    push @channels, {name => "2.8.0", ga =>"12/6/1", dpt => 14 };    #Zählerstand gesamt
    
    my @countermodes = (5,15,60,1440);    #Aufloesungen fuer COUNTER RRDs in Minuten (1440 = Tagesverbrauch)
    my $debug = 1;
    ### ENDE KONFIGURATION ###
    
    #Je nach Geschwindigkeit andere Befehle an Zaehler senden
    
    my %speedrate = (
    "300"=>"'\x06\x30\x30\x30\x0d'",
    "600"=>"'\x06\x30\x31\x30\x0d\x0a'",
    "1200"=>"'\x06\x30\x32\x30\x0d\x0a'",
    "2400"=>"'\x06\x30\x33\x30\x0d\x0a'",
    "4800"=>"'\x06\x30\x34\x30\x0d\x0a'",
    "9600"=>"'\x06\x30\x35\x30\x0d\x0a'"
    );
    my %speedrate_auto = (
    "0"=>"'\x06\x30\x30\x30\x0d\x0a'",
    "1"=>"'\x06\x30\x31\x30\x0d\x0a'",
    "2"=>"'\x06\x30\x32\x30\x0d\x0a'",
    "3"=>"'\x06\x30\x33\x30\x0d\x0a'",
    "4"=>"'\x06\x30\x34\x30\x0d\x0a'",
    "5"=>"'\x06\x30\x35\x30\x0d\x0a'"
    );
    my %baud = (
    "0"=>"300",
    "1"=>"600",
    "2"=>"1200",
    "3"=>"2400",
    "4"=>"4800",
    "5"=>"9600"
    );
    
    ### DATEN EMPFANGEN ###
    
    ### Anfrage Senden ###
    my $id = qx(echo '\x2f\x3f\x21\x0d' | socat -T 2 - $device,raw,echo=0,b300,parenb=1,parodd=0,cs7,cstopb=0);
    
    #my $speedcode =  substr($id,4,1);
    my $speedcode;
    my $ack = $speedrate{$baudrate};
    
    ### Zaehlerkennung auswerten - Geschwindigkeit ermitteln ###
    if ($baudrate eq "auto")
    {
        $ack = $speedrate_auto{$speedcode};
        $baudrate = $baud{$speedcode};
    }
    else
    {
        $ack = $speedrate{$baudrate};
    }
    
    if ($debug==1){print ($id,"\n")};
    if ($debug==1){print ($baudrate,"\n")};
    
    select(undef, undef, undef, 1);
    ### Abfrage starten ###
    my @buffer = qx(echo $ack | socat -t 2 - $device,raw,echo=0,b300,parenb=1,parodd=0,cs7,cstopb=0; socat -T 2 - $device,raw,echo=0,b$baudrate,parenb=1,parodd=0,cs7,cstopb=0);
    if ($debug==1){print (@buffer,"\n")};
    ### AUSWERTUNG ###
    foreach (@buffer)
    {
        foreach my $obis (@channels)
        {
            my $obiskey = $obis->{name}."*00(";
            if ($_ =~ /\Q$obiskey\E/)
            {
                $_  =~ m/[^(]+\(([^]+)\*([^)]+)/;
                my $value = $1;
                my $ga = $obis->{ga};
                if ($debug==1){print ($obis->{name},"\n")};
                if ($debug==1){print ($value,"\n")};
                if ($debug==1){print ($ga,"\n")};
                
               # rrd_counter ($obis->{name},$value)
                
                &knx_write ($ga,$value,$obis->{dpt});
            }
        }
    }
    
    ### SUBS ###
    
    sub rrd_counter
    {
        if ($debug==1){print ("COUNTER","\n")};
        foreach (@countermodes)
        {
            my $obisname = $_[0];
            my $value = $_[1];
        $obisname =~ tr/./-/;
            my $rrdname = $counterid."_".$obisname."_".$_."\.rrd";
            if ($debug==1){print ($rrdname,"\n")};
            my $rrdfile = $rrdpath."\/".$rrdname;
            unless (-e $rrdfile)
            {
                RRDs::create ($rrdfile,"DS:value:COUNTER:".(($_*60)+600).":0:10000000000","RRA:AVERAGE:0.5:1:365","RRA:AVERAGE:0.5:7:300","-s ".($_*60));
            }
            my $countervalue = int($value*$_*60);
            if ($debug==1) {print ($_,"\n")};
        if ($debug==1) {print ($countervalue,"\n")};
        RRDs::update("$rrdfile", "N:$countervalue");
        }
    }
    
    sub rrd_gauge
    {
        if ($debug==1){print ("GAUGE","\n")};
        my $obisname = $_[0];
        my $value = $_[1];
        $obisname =~ tr/./-/;
        my $rrdname = $counterid."_".$obisname."\.rrd";
        if ($debug==1){print ($rrdname,"\n")};
        my $rrdfile = $rrdpath."\/".$rrdname;
        unless (-e $rrdfile)
        {
            RRDs::create ($rrdfile,"DS:value:GAUGE:900:0:10000000000","RRA:AVERAGE:0.5:1:2160","RRA:AVERAGE:0.5:5:2016","RRA:AVERAGE:0.5:15:2880","RRA:AVERAGE:0.5:60:8760");
        }
        RRDs::update("$rrdfile", "N:$value");
    }
    
    sub knx_write {
        my ($dst,$value,$dpt,$response,$dbgmsg) = @_;
        my $bytes;
        my $apci = ($response) ? 0x40 : 0x80; # 0x40=response, 0x80=write
        #     DPT 1 (1 bit) = EIS 1/7 (move=DPT 1.8, step=DPT 1.7)
        #     DPT 2 (1 bit controlled) = EIS 8
        #     DPT 3 (3 bit controlled) = EIS 2
        #     DPT 4 (Character) = EIS 13
        #     DPT 5 (8 bit unsigned value) = EIS 6 (DPT 5.1) oder EIS 14.001 (DPT 5.10)
        #     DPT 6 (8 bit signed value) = EIS 14.000
        #     DPT 7 (2 byte unsigned value) = EIS 10.000
        #     DPT 8 (2 byte signed value) = EIS 10.001
        #     DPT 9 (2 byte float value) = EIS 5
        #     DPT 10 (Time) = EIS 3
        #     DPT 11 (Date) = EIS 4
        #     DPT 12 (4 byte unsigned value) = EIS 11.000
        #     DPT 13 (4 byte signed value) = EIS 11.001
        #     DPT 14 (4 byte float value) = EIS 9
        #     DPT 15 (Entrance access) = EIS 12
        #     DPT 16 (Character string) = EIS 15
        # $dpt = $eibgaconf{$dst}{'DPTSubId'} unless $dpt; # read dpt from eibgaconf if existing
        given ($dpt) {
            when (/^12/)             { $bytes = pack ("CCL>", 0, $apci, $value); }  #EIS11.000/DPT12 (4 byte unsigned)
            when (/^13/)             { $bytes = pack ("CCl>", 0, $apci, $value); }
            when (/^14/)             { $bytes = pack ("CCf>", 0, $apci, $value); }
            when (/^16/)             { $bytes = pack ("CCa14", 0, $apci, $value); }
            when (/^17/)             { $bytes = pack ("CCC", 0, $apci, $value & 0x3F); }
            when (/^20/)             { $bytes = pack ("CCC", 0, $apci, $value); }
            when (/^\d\d/)           { return; } # other DPT XX 15 are unhandled
            when (/^[1,2,3]/)        { $bytes = pack ("CC", 0, $apci | ($value & 0x3f)); } #send 6bit small
            when (/^4/)              { $bytes = pack ("CCc", 0, $apci, ord($value)); }
            when ([5,5.001])         { $bytes = pack ("CCC", 0, $apci, encode_dpt5($value)); } #EIS 6/DPT5.001 1byte
            when ([5.004,5.005,5.010]) { $bytes = pack ("CCC", 0, $apci, $value); }
            when (/^5/)              { $bytes = pack ("CCC", 0, $apci, $value); }
            when (/^6/)              { $bytes = pack ("CCc", 0, $apci, $value); }
            when (/^7/)              { $bytes = pack ("CCS>", 0, $apci, $value); }
            when (/^8/)              { $bytes = pack ("CCs>", 0, $apci, $value); }
            when (/^9/)              { $bytes = pack ("CCCC", 0, $apci, encode_dpt9($value)); } #EIS5/DPT9 2byte float
            default                  { LOGGER('WARN',"None or unsupported DPT: $dpt sent to $dst value $value"); return; }
        }
        my $leibcon = EIBConnection->EIBSocketURL($eib_url) or return("Error opening con: $!");
        if ($leibcon->EIBOpenT_Group(str2addr($dst),1) == -1) { return("Error opening group: $!"); }
        my $res=$leibcon->EIBSendAPDU($bytes);
        $leibcon->EIBClose();
        return $res;
        
        # str2addr: Convert an EIB address string in the form "1/2/3" or "1.2.3" to an integer
        sub str2addr {
            my $str = $_[0];
            if ($str =~ /(\d+)\/(\d+)\/(\d+)/) { # logical address
                return ($1 << 11) | ($2 << 8) | $3;
            } elsif ($str =~ /(\d+)\.(\d+)\.(\d+)/) { # physical address
                return ($1 << 12) | ($2 << 8) | $3;
            } else {
                #bad
                return;
            }
        }
        
    }
    
    sub encode_dpt9
    {
        # 2byte signed float
        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;
    }

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Was ist das Problem? Einfach eine zweite Zeile "push @channels..." mit 2.8.0 anlegen.

    Einen Kommentar schreiben:


  • MrDuFF
    antwortet

    Hallo Zusammen ich bekomme das Script einfach nicht vollständig zum laufen.

    Hardware: Wiregate + Auslesekopf von Ude ( Volkszähler ) wird einwandfrei erkannt an /dev/ttyUSB0
    Zähler: Pafal 20EC3gr ( müsste der gleiche sein wie Martinb07 gerade zum laufen gebracht hat )

    Wenn ich die init.pl von Mirko ausführe bekomme ich folgende Ausgabe.
    Wie man sieht ist mein Unterschied zu Martinb07 das ich 2 Zählerstände bekomme bzw. aufgrund der
    PV Anlage auch brauche. 1.8.0 und 2.8.0

    init.pl.JPG

    Wenn ich jetzt das angepasste Script von Martinb07 aus post 499 ausführe
    bekomme ich folgende Ausgabe.
    Das Script müsste angepasst werden auf den 2ten Zählerstand 2.8.0 und
    die Reg.Exprs.. müsste vermutlich auch angepasst werden.
    Nach einigen Stunden try an error hab ichs leider nicht hinbekommen
    das beide Zählersände jeweils auf eine GA geschrieben wird.

    Vielen Dank für eure Hilfe.

    Grüsse Benni


    Code:
    root@wiregate1292:/tmp# perl meter1.pl
    Useless use of bitwise and (&) in void context at meter1.pl line 104.
    /PAF5EC3gr00006
    
    300
    0.0.0(71423880)
    0.0.1(PAF)
    F.F(00)
    0.2.0(1.27)
    1.8.0*00(007544.16)
    2.8.0*00(017160.35)
    C.2.1(000000000000)(                                                )
    0.2.2(:::::G11)!
    |
    1.8.0
    7544.16
    12/6/0
    COUNTER
    yS_eHZ_1-8-0_5.rrd
    5
    2263248
    yS_eHZ_1-8-0_15.rrd
    15
    6789744
    yS_eHZ_1-8-0_60.rrd
    60
    27158976
    yS_eHZ_1-8-0_1440.rrd
    1440
    651815424

    Und hier der Script zu der Ausgabe:

    Code:
    #!/usr/bin/perl -w
    # Zaehlerabfrage fuer Zaehler nach Protokoll IEC 62056-21 / OBIS
    # Ein Anfrage-Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit
    # und gerader Paritaet zu senden. Das ist der Initialmodus von Geraeten,
    # die das Protokoll IEC 62056-21 implementieren.
    # Ein Wechsel der Geschwindigkeit ist umgesetzt.
    # Basis des Scripts von volkszaehler.org / Autor: Andreas Schulze & Bugfix: Eric Schanze
    # DPT9 sub: makki / www.knx-user-forum.de
    # Baudwechsel: panzaeron / www.knx-user-forum.de
    # Erweiterung um RRD,KNX-Anbindung und gezielte Wertsuche auf Wiregate:
    # JuMi2006 / www.knx-user-forum.de (DPT14 beta fixed: Frank0207)
    # Version: 0.1.7
    # Datum: 14.02.2013
    
    use warnings;
    use strict;
    use RRDs;
    use feature "switch";
    use EIBConnection;
    
    ### KONFIGURATION ###
    my $eib_url = "local:/tmp/eib";     #for local eibd "local:/tmp/eib" for eibd in LAN: "ip:192.168.2.220:6720"
    my $device = "/dev/ttyUSB0";        #Port ttyUSB0
    my $rrdpath = "/var/www/rrd";      #Pfad fuer RRDs
    my $counterid = "yS_eHZ";               #Grundname fuer RRDs
    my $baudrate = "300";              #Baudrate fuer Zaehlerauslesung
    my @channels;                       #Obis-Zahl => Gruppenadresse
    push @channels, {name => "1.8.0", ga =>"12/6/0", dpt => 14 };    #Zählerstand gesamt
    
    my @countermodes = (5,15,60,1440);    #Aufloesungen fuer COUNTER RRDs in Minuten (1440 = Tagesverbrauch)
    my $debug = 1;
    ### ENDE KONFIGURATION ###
    
    #Je nach Geschwindigkeit andere Befehle an Zaehler senden
    
    my %speedrate = (
    "300"=>"'\x06\x30\x30\x30\x0d'",
    "600"=>"'\x06\x30\x31\x30\x0d\x0a'",
    "1200"=>"'\x06\x30\x32\x30\x0d\x0a'",
    "2400"=>"'\x06\x30\x33\x30\x0d\x0a'",
    "4800"=>"'\x06\x30\x34\x30\x0d\x0a'",
    "9600"=>"'\x06\x30\x35\x30\x0d\x0a'"
    );
    my %speedrate_auto = (
    "0"=>"'\x06\x30\x30\x30\x0d\x0a'",
    "1"=>"'\x06\x30\x31\x30\x0d\x0a'",
    "2"=>"'\x06\x30\x32\x30\x0d\x0a'",
    "3"=>"'\x06\x30\x33\x30\x0d\x0a'",
    "4"=>"'\x06\x30\x34\x30\x0d\x0a'",
    "5"=>"'\x06\x30\x35\x30\x0d\x0a'"
    );
    my %baud = (
    "0"=>"300",
    "1"=>"600",
    "2"=>"1200",
    "3"=>"2400",
    "4"=>"4800",
    "5"=>"9600"
    );
    
    ### DATEN EMPFANGEN ###
    
    ### Anfrage Senden ###
    my $id = qx(echo '\x2f\x3f\x21\x0d' | socat -T 2 - $device,raw,echo=0,b300,parenb=1,parodd=0,cs7,cstopb=0);
    
    #my $speedcode =  substr($id,4,1);
    my $speedcode;
    my $ack = $speedrate{$baudrate};
    
    ### Zaehlerkennung auswerten - Geschwindigkeit ermitteln ###
    if ($baudrate eq "auto")
    {
        $ack = $speedrate_auto{$speedcode};
        $baudrate = $baud{$speedcode};
    }
    else
    {
        $ack = $speedrate{$baudrate};
    }
    
    if ($debug==1){print ($id,"\n")};
    if ($debug==1){print ($baudrate,"\n")};
    
    select(undef, undef, undef, 1);
    ### Abfrage starten ###
    my @buffer = qx(echo $ack | socat -t 2 - $device,raw,echo=0,b300,parenb=1,parodd=0,cs7,cstopb=0; socat -T 2 - $device,raw,echo=0,b$baudrate,parenb=1,parodd=0,cs7,cstopb=0);
    if ($debug==1){print (@buffer,"\n")};
    ### AUSWERTUNG ###
    foreach (@buffer)
    {
        foreach my $obis (@channels)
        {
            my $obiskey = $obis->{name}."*00(";
            if ($_ =~ /\Q$obiskey\E/)
            {
                $_ =~ m/[^(]+\(([^)]+)/;
                my $value = sprintf("%.2f",$1);
                #   $value += 0;
                my $ga = $obis->{ga};
                if ($debug==1){print ($obis->{name},"\n")};
                if ($debug==1){print ($value,"\n")};
                if ($debug==1){print ($ga,"\n")};
                
                rrd_counter ($obis->{name},$value)
                
                &knx_write ($ga,$value,$obis->{dpt});
            }
        }
    }
    
    ### SUBS ###
    
    sub rrd_counter
    {
        if ($debug==1){print ("COUNTER","\n")};
        foreach (@countermodes)
        {
            my $obisname = $_[0];
            my $value = $_[1];
        $obisname =~ tr/./-/;
            my $rrdname = $counterid."_".$obisname."_".$_."\.rrd";
            if ($debug==1){print ($rrdname,"\n")};
            my $rrdfile = $rrdpath."\/".$rrdname;
            unless (-e $rrdfile)
            {
                RRDs::create ($rrdfile,"DS:value:COUNTER:".(($_*60)+600).":0:10000000000","RRA:AVERAGE:0.5:1:365","RRA:AVERAGE:0.5:7:300","-s ".($_*60));
            }
            my $countervalue = int($value*$_*60);
            if ($debug==1) {print ($_,"\n")};
        if ($debug==1) {print ($countervalue,"\n")};
        RRDs::update("$rrdfile", "N:$countervalue");
        }
    }
    
    sub rrd_gauge
    {
        if ($debug==1){print ("GAUGE","\n")};
        my $obisname = $_[0];
        my $value = $_[1];
        $obisname =~ tr/./-/;
        my $rrdname = $counterid."_".$obisname."\.rrd";
        if ($debug==1){print ($rrdname,"\n")};
        my $rrdfile = $rrdpath."\/".$rrdname;
        unless (-e $rrdfile)
        {
            RRDs::create ($rrdfile,"DS:value:GAUGE:900:0:10000000000","RRA:AVERAGE:0.5:1:2160","RRA:AVERAGE:0.5:5:2016","RRA:AVERAGE:0.5:15:2880","RRA:AVERAGE:0.5:60:8760");
        }
        RRDs::update("$rrdfile", "N:$value");
    }
    
    sub knx_write {
        my ($dst,$value,$dpt,$response,$dbgmsg) = @_;
        my $bytes;
        my $apci = ($response) ? 0x40 : 0x80; # 0x40=response, 0x80=write
        #     DPT 1 (1 bit) = EIS 1/7 (move=DPT 1.8, step=DPT 1.7)
        #     DPT 2 (1 bit controlled) = EIS 8
        #     DPT 3 (3 bit controlled) = EIS 2
        #     DPT 4 (Character) = EIS 13
        #     DPT 5 (8 bit unsigned value) = EIS 6 (DPT 5.1) oder EIS 14.001 (DPT 5.10)
        #     DPT 6 (8 bit signed value) = EIS 14.000
        #     DPT 7 (2 byte unsigned value) = EIS 10.000
        #     DPT 8 (2 byte signed value) = EIS 10.001
        #     DPT 9 (2 byte float value) = EIS 5
        #     DPT 10 (Time) = EIS 3
        #     DPT 11 (Date) = EIS 4
        #     DPT 12 (4 byte unsigned value) = EIS 11.000
        #     DPT 13 (4 byte signed value) = EIS 11.001
        #     DPT 14 (4 byte float value) = EIS 9
        #     DPT 15 (Entrance access) = EIS 12
        #     DPT 16 (Character string) = EIS 15
        # $dpt = $eibgaconf{$dst}{'DPTSubId'} unless $dpt; # read dpt from eibgaconf if existing
        given ($dpt) {
            when (/^12/)             { $bytes = pack ("CCL>", 0, $apci, $value); }  #EIS11.000/DPT12 (4 byte unsigned)
            when (/^13/)             { $bytes = pack ("CCl>", 0, $apci, $value); }
            when (/^14/)             { $bytes = pack ("CCf>", 0, $apci, $value); }
            when (/^16/)             { $bytes = pack ("CCa14", 0, $apci, $value); }
            when (/^17/)             { $bytes = pack ("CCC", 0, $apci, $value & 0x3F); }
            when (/^20/)             { $bytes = pack ("CCC", 0, $apci, $value); }
            when (/^\d\d/)           { return; } # other DPT XX 15 are unhandled
            when (/^[1,2,3]/)        { $bytes = pack ("CC", 0, $apci | ($value & 0x3f)); } #send 6bit small
            when (/^4/)              { $bytes = pack ("CCc", 0, $apci, ord($value)); }
            when ([5,5.001])         { $bytes = pack ("CCC", 0, $apci, encode_dpt5($value)); } #EIS 6/DPT5.001 1byte
            when ([5.004,5.005,5.010]) { $bytes = pack ("CCC", 0, $apci, $value); }
            when (/^5/)              { $bytes = pack ("CCC", 0, $apci, $value); }
            when (/^6/)              { $bytes = pack ("CCc", 0, $apci, $value); }
            when (/^7/)              { $bytes = pack ("CCS>", 0, $apci, $value); }
            when (/^8/)              { $bytes = pack ("CCs>", 0, $apci, $value); }
            when (/^9/)              { $bytes = pack ("CCCC", 0, $apci, encode_dpt9($value)); } #EIS5/DPT9 2byte float
            default                  { LOGGER('WARN',"None or unsupported DPT: $dpt sent to $dst value $value"); return; }
        }
        my $leibcon = EIBConnection->EIBSocketURL($eib_url) or return("Error opening con: $!");
        if ($leibcon->EIBOpenT_Group(str2addr($dst),1) == -1) { return("Error opening group: $!"); }
        my $res=$leibcon->EIBSendAPDU($bytes);
        $leibcon->EIBClose();
        return $res;
        
        # str2addr: Convert an EIB address string in the form "1/2/3" or "1.2.3" to an integer
        sub str2addr {
            my $str = $_[0];
            if ($str =~ /(\d+)\/(\d+)\/(\d+)/) { # logical address
                return ($1 << 11) | ($2 << 8) | $3;
            } elsif ($str =~ /(\d+)\.(\d+)\.(\d+)/) { # physical address
                return ($1 << 12) | ($2 << 8) | $3;
            } else {
                #bad
                return;
            }
        }
        
    }
    
    sub encode_dpt9
    {
        # 2byte signed float
        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;
    }







    Angehängte Dateien

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Zitat von martinb07 Beitrag anzeigen
    Auch das 60er rrd gibt nur die Differenzen aus:
    Das ist ja auch richtig so! Was willst Du mit einer Linie die ständig nur ansteigt und den Wert (Zählerstand) erhöht?
    Sieh es Dir einfach mal an wenn Du das rrd als Gauge definierst -> das wird ziemlich sinnfrei.

    Hinter dem was Du vor hast steckt eine sqlite-Datenbank die sich mit sh.py sehr gut abfragen lässt. Mit rrd`s wird das blutiger. Kosten, Vortagesverbräuche usw. kommen alle aus Logiken und werden Anhand des Zählerstandes berechnet, das fällt nicht einfach so raus. Um sowas in der CometVisu darzustellen benötigst Du ein separates Plugin was aus dem Zählerstand die WErte berechnet und auf den Bus sendet bzw. geht das glaub ich auch aus plugin_info -> goto CometVisu-Forum.

    Gruß Mirko

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Sowas schwebt mir auch vor:



    Auch das 60er rrd gibt nur die Differenzen aus:
    Angehängte Dateien

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Das RRD liefert Differenzen und keine Stände.

    Sieh Dir mal das _60er an. Damit sollte der Verbrauch pro Stunde geliefert werden.
    Andersrum gefragt, was willst Du erreichen ?

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Ja ist das ist das 5 Minuten RRD, genauso wie der Auszug der einzelnen Werte.

    Anbei mein derzeitiges Script.
    Debugausgaben in Zeile 129f zeigen noch die richtig berechneten Werte. Im RRD tauchen aber ganz andere auf.
    Angehängte Dateien

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Welches rrd siehst Du Dir an, es sollten 3 oder 4 (@countermodes) erzeugt werden! Ansonsten mal Deine Variante vom Plugin posten.

    Das scheint das 5-Minuten rrd zu sein.

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Mit Try and Error habe ich es jetzt geschafft, dass der aktuelle Zäherstand auf die GA gesendet wird. Im eib.log kommt der Wert richtig an.
    Im rrd steht aber ein ganz Anderer. Da kommen Werte von 0,0095 bis 0,01319 an.

    Edit:
    Aus dem "rrdtool fetch ...."
    Code:
    1421962800: 9,5333769851e-03
    1421963100: 4,6662301489e-04
    1421963400: 0,0000000000e+00
    1421963700: 9,5294818345e-03
    1421964000: 4,7051816548e-04
    1421964300: 6,3528384854e-03
    1421964600: 3,1382818128e-04
    Angehängte Dateien

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    cron erreichst Du im webmin wenn Du als root angemeldet bist.
    Sieh Dir dort die Ausgabe mal an, im Zweifel das WireGate einfach mal neu starten, nicht dass dort noch irgendwelche Prozessleichen lungern, für mich sieht die Fehlermeldung aber nicht nach einem Zusammenhang zum Script aus.

    Einen Kommentar schreiben:


  • Dirk42
    antwortet
    Wie wär's denn, die Funktion über den Logikprozessor anzustoßen? Der hat nette Funktionen zur Zeitsteuerung. Klar, das bringt ein bisschen Overhead, aber so dramatisch sollte das nicht sein...

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Jetzt habe ich aber noch eine Frage bzw. ein Problem. Anscheinend funktioniert mein Cronjob nicht.
    Diesen gebe ich doch einfach unter
    Code:
    crontab -e
    ein

    Bei mir lautet er
    Code:
    */5 * * * * perl /etc/wiregate/plugin/iec62056-meter.pl
    Somit sollte alle fünf Minuten das Script ausgeführt werden. In der eib.log tauchen nur die Einträge durch das manuelle ausführen auf.

    Edit:
    Du schreibst hier, dass man über das Webmin den Cron anstoßen kann und die Ausgabe dazu erhält. Ich finde dazu leider nichts.
    In welchem Logfile stehen denn die Meldungen von Cron?

    Im syslog steht:
    Code:
    .... 'socat1' process is not running
    .... 'socat1' trying to restart
    .... 'socat1'start: /sbin/start-stop-daemon
    .... 'socat1' failed to start
    Und das in Dauerschleife.

    Einen Kommentar schreiben:

Lädt...
X