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

    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.
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      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
      ---
      Martin

      Kommentar


        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.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          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
          ---
          Martin

          Kommentar


            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 ?
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              Sowas schwebt mir auch vor:



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

              Kommentar


                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
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar



                  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
                  greetz Benni

                  Kommentar


                    Was ist das Problem? Einfach eine zweite Zeile "push @channels..." mit 2.8.0 anlegen.
                    Umgezogen? Ja! ... Fertig? Nein!
                    Baustelle 2.0 !

                    Kommentar


                      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;
                      }
                      greetz Benni

                      Kommentar


                        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.

                        Kommentar


                          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

                          Kommentar


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

                            Kommentar


                              Ja, irgend so was wird's schon sein.
                              Nur wie lässt sich das vermeiden.
                              Von nem anderen User hab ich noch ein kill_sml_meter script bekommen, welches anscheinend das sml_meter.pl erst killt und dann erneut startet
                              um zu vermeiden das es mehrfach läuft bzw. aufgerufen wird.
                              leider ohne Erfolg.

                              @nipponichi was für einen Zähler hast du denn? funktioniert die Abfrage bei dir?

                              Kommentar


                                Ich habe einen eHZ oder wie das Ding immer heißt. Ja, seit zwei jahren keine Probleme mehr, wobei ich allerdings auch selten draufgucke. Nach ein paar Wochen wird es halt langweilig.

                                Kommentar

                                Lädt...
                                X