Ankündigung

Einklappen
Keine Ankündigung bisher.

Installation der Software von volkszaehler.org möglich?

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

    #76
    Ich starte das gleiche Perl-Script mit crontab wie in der Konsole. Das Script findest Du ein paar Threads weiter vorne. Mein zweiter Zähler funktioniert ja auch in crontab mit Baudratenumschaltung.

    Wenn der in crontab auch laufen würde würde ich ja auch die Baudrate noch automatisch einstellen lassen, aber so muss es erstmal manuell eingestellt werden.
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #77
      Zitat von henfri Beitrag anzeigen
      wenn ich mir volkszaehler.org angesehen hätte, ohne den Thread hier zu sehen, würde ich sagen: Brauch ich nicht: Ich hab KNX/Wiregate.

      Aber da ihr das auf dem WG installiert, liege ich wohl falsch und verstehe das dort angebotene nicht richtig.
      Mag mich wer aufklären? Welchen Mehrwert bietet das, ggü dem WG alleine?
      *push*
      Kann dazu jemand was sagen?

      Kommentar


        #78
        Also bislang hat keiner Volkszähler auf dem WG am laufen.
        Ansonsten teile ich Deine Auffassung, zumindest jetzt wo das Script steht.
        Mehr als die paar RRDs und alle Werte aufm Bus braucht's für mich nicht.
        Das frostend von Vz ist aber zugegebener Maßen schön anzuschauen.

        Gruß
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #79
          Also, stimme JuMi zu, das Frontend ist für mich das Entscheidene gewesen, allerdings zeigen meine Versuch, dass die Middleware mit dem Frontend nicht so super für d0-Zähler geeignet ist (oder ich hab es nicht richtig verstanden).

          Ich hab z.B. JuMis Perl-Skript etwas erweitert um direkt die Werte des Zählers an die Middleware zu übergeben (als Ersatz für vzlogger). Das klappt aber nur mit den momentan Werten, absolute Werte (also die Zählerstände) nicht.
          Man könnte vermutlich im Skript immer eine Differenz bilden vom Vorherigen zum Nächsten (letzten Wert aus der Middleware auslesen, Differenz berechnen) und diesen Übertragen, aber damit habe ich mich noch nicht beschäftigt.

          Kommentar


            #80
            Neue Version im SVN: HIER

            Neues:
            - Cronjob streikt nicht mehr
            - Baudrate kann auf "auto" gestellt werden und wird automatisch auf das maximal verfügbare des Zählers gesetzt

            Gruß Mirko
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #81
              Hallo zusammen,

              ich habe das aktuelle Perl Skript von hier bei mir mal laufen lassen.
              Das ist das Ergebnis:
              Code:
              root@wiregate249:~# /usr/local/bin/iec62056-meter.pl
              substr outside of string at /usr/local/bin/iec62056-meter.pl line 70.
              root@wiregate249:~# /usr/local/bin/iec62056-meter.pl
              2012/10/12 16:16:08 socat[5084] E tcgetattr(3, 0xbf9f1dac): Inappropriate ioctl                            for device
              substr outside of string at /usr/local/bin/iec62056-meter.pl line 70.
              Use of uninitialized value $speedcode in hash element at /usr/local/bin/iec62056                           -meter.pl line 76.
              Use of uninitialized value $speedcode in hash element at /usr/local/bin/iec62056                           -meter.pl line 77.
              Use of uninitialized value $ack in concatenation (.) or string at /usr/local/bin                           /iec62056-meter.pl line 89.
              Use of uninitialized value $baudrate in concatenation (.) or string at /usr/loca                           l/bin/iec62056-meter.pl line 89.
              2012/10/12 16:16:09 socat[5093] E tcgetattr(3, 0xbf88f4cc): Inappropriate ioctl                            for device
              2012/10/12 16:16:09 socat[5094] E parseopts(): unknown option "b"
              Kann mir jemand helfen?

              Danke
              Sascha

              Kommentar


                #82
                Versuchen wir es

                1. Welcher Zähler?
                2. USB-Kopf richtig ausgewählt?

                Am besten, wenn vorhanden mit Windows und dem Programm hier (klick) erstmal gucken ob der Kopf richtig ausgerichtet ist. Manche sind da sehr empfindlich.

                Wenn Kopf richtig ausgerichtet und in der config ausgewählt dann mal die Revision 861 (HIER) mit 300 Baud ausprobieren. Die läuft mit am sichersten.

                Dann auch mal das zweite script in dem Beitrag durchlaufen lassen -> https://knx-user-forum.de/225383-post148.html
                Die Schnittstelle noch anpassen, sonst nix. Das Ergebnis gern mal hier posten.

                Gruß Mirko



                Gruß Mirko
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #83
                  Hallo Mirko,

                  der Zähler ist ein itron ACE3000 Typ 260 mit diesem Kopf.

                  Wenn ich das ganze mit einem Testprogramm auslese, kommt ohne Probleme das hier:
                  Code:
                  ==> /?!<0D><0A>
                  <== /ACE0\3k260V01.18
                  ==> <06>000<0D><0A>
                  <==  -- STX -- 
                  <== F.F(00)
                  <== C.1(1126100052268445)
                  <== C.5.0(00)
                  <== 1.8.0(008603.2*kWh)
                  <== !
                  <==  -- ETX -- 
                  <==  -- BCC --
                  Der USB Seriell Wandler wird am WG erkannt:
                  Bus 001 Device 077: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
                  Code:
                  [2919428.836756] usb 1-3.2: new full speed USB device using ohci_hcd and address 77
                  [2919428.954745] usb 1-3.2: New USB device found, idVendor=067b, idProduct=2303
                  [2919428.962939] usb 1-3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
                  [2919428.978700] usb 1-3.2: Product: USB-Serial Controller
                  [2919428.986600] usb 1-3.2: Manufacturer: Prolific Technology Inc.
                  [2919428.994796] usb 1-3.2: configuration #1 chosen from 1 choice
                  [2919429.004703] pl2303 1-3.2:1.0: pl2303 converter detected
                  [2919429.033026] usb 1-3.2: pl2303 converter now attached to ttyUSB0
                  Wenn ich nun das Skript mit Revision 861 mit folgenden Parametern laufen lasse, passiert nix:
                  my $device = "/dev/ttyUSB0"; #Port (/dev/ttyUSB...)
                  my $baudrate = "300"; #Baudrate fuer Zaehlerauslesung
                  root@wiregate249:/usr/local/bin# iec62056-meter.pl
                  root@wiregate249:/usr/local/bin# iec62056-meter.pl
                  root@wiregate249:/usr/local/bin# iec62056-meter.pl
                  root@wiregate249:/usr/local/bin# iec62056-meter.pl
                  root@wiregate249:/usr/local/bin# iec62056-meter.pl
                  root@wiregate249:/usr/local/bin#
                  root@wiregate249:/usr/local/bin#
                  Hilfe?!?
                  Hast du eine Idee, was ich tun kann?

                  Danke
                  Sascha

                  Kommentar


                    #84
                    Teste mal das hier:

                    init.pl
                    Code:
                    #!/usr/bin/perl
                    use warnings;
                    use strict;
                    use Device::SerialPort;
                    
                    ### KONFIGURATION ###
                    my $device = "/dev/ttyUSB0";	#Port
                    my $endsign = "!";				#Letztes Zeichen im Protokoll vom Zaehler
                    ### ENDE KONFIGURATION ###
                    
                    ### Seriellen Port initialisieren
                    
                    ####START 300baud
                    my $port = new Device::SerialPort($device) || die "can't open $device: $!";
                    $port->baudrate(300)      || die 'fail setting baudrate';
                    $port->databits(7)        || die 'fail setting databits';
                    $port->stopbits(1)        || die 'fail setting stopbits';
                    $port->parity("even")     || die 'fail setting parity';
                    $port->dtr_active(1);
                    $port->rts_active(1);
                    $port->read_char_time(500);     # 0.5 seconds for each character
                    $port->read_const_time(1000);   # 1 second per unfulfilled "read" call
                    $port->write_settings     || die 'fail write settings';
                    
                    
                    ### Anforderungstelegramm senden
                    my $data="2f3f210d0a";				#Anfrage als HEX "/?!<CR><LF>"
                    my $request = pack('H*',$data);
                    						
                    my $num_out = $port->write($request);
                    print $request;
                    die "write failed\n" unless ($num_out);
                    die "write inclomplete\n" unless ($num_out == length($request));
                    print "$num_out Bytes written\n";
                    
                    ### Warte auf Zaehlerkennung
                    
                    select(undef, undef, undef, 1.5); # 1.5 Sekunden warten
                    
                    ### Telegramm mit ACK und neuer Geschwindigkeit senden
                    my $data2="063030300d0a";				#ACK und neue Geschwindigkeit in HEX "<ACK>040<CR><LF>"
                    my $baudwechsel = pack('H*',$data2);	# 000 = 300baud, 040 = 4800baud
                    
                    my $num_out2 = $port->write($baudwechsel);
                    print $baudwechsel;
                    die "write failed\n" unless ($num_out2);
                    die "write inclomplete\n" unless ($num_out2 == length($baudwechsel));
                    print "$num_out2 Bytes written\n";
                    
                    ### AUSLESEN
                    
                    my $STALL_DEFAULT=5; # how many seconds to wait for new input
                    my $timeout=$STALL_DEFAULT; 
                    my $chars=0;
                    my $buffer="";
                    
                    while ($timeout>0) {
                            my ($count,$saw)=$port->read(25); 	# Liest 25 Zeichen je Durchlauf aus
                            if ($count > 0) {
                                    $chars+=$count;
                                    $buffer.=$saw;
                    		#print ($buffer,"\n");		# Ausgabe der eingelesenen Daten
                    
                    
                    ### FILTER FOR END
                    if ($buffer =~ /\Q$endsign\E/)			# \Q \E entwertet alle Sonderzeichen dazwischen
                    {	
                    $port->close || die "can't close $device: $!";	# Port schlieen
                    last;						# Schleife verlassen
                    }
                    ### ENDE FILTER FOR END
                            
                    }
                            else {
                                    $timeout--;
                            }
                    }
                    
                    if ($timeout<=0) {
                    $port->close || die "can't close $device: $!";        
                    print "Waited $STALL_DEFAULT seconds and never saw what I wanted\n";
                    		}
                    print $buffer;		#Nur zur Kontrolle
                    Ansonsten mal beim Ausführen/Starten des Scriptes auf dem WireGate mit der Handykamera auf den Auslesekopf schauen ob die 2 Signale überhaupt gesendet werden.

                    Gruß Mirko
                    Umgezogen? Ja! ... Fertig? Nein!
                    Baustelle 2.0 !

                    Kommentar


                      #85
                      Zitat von haegar80 Beitrag anzeigen
                      ..mit diesem Kopf.
                      Ist es nicht schon kompliziert genug und wäre es daher evtl. ziehlfühernder wenigstens denselben Lesekopf von Volkszähler.org zu verwenden (der mir einen sehr ordentlichen Eindruck macht, testen kann ich ihn konkret aber nicht..)


                      Makki
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #86
                        Zitat von JuMi2006 Beitrag anzeigen
                        Teste mal das hier:
                        init.pl
                        Hab das Skript mal laufen lassen. Das hier ist das Ergebnis:
                        Code:
                        root@wiregate249:/usr/local/bin# init.pl
                        /?!
                        5 Bytes written
                        000
                        6 Bytes written
                        /ACE0\3k260V01.18
                        F.F(00)
                        C.1(1126100052268445)
                        C.5.0(00)
                        1.8.0(008615.2*kWh)
                        !
                        Zitat von JuMi2006 Beitrag anzeigen
                        Ansonsten mal beim Ausführen/Starten des Scriptes auf dem WireGate mit der Handykamera auf den Auslesekopf schauen ob die 2 Signale überhaupt gesendet werden.
                        Meine Handykamera zeigt ein leichtes Blinken, wie beim Test mit dem Windows Programm.

                        Vielen Dank schon mal vorab für die Unterstützung!
                        Sascha

                        Kommentar


                          #87
                          Wahrscheinlich ein Timing-Problem mit dem socat.
                          Bevor jetzt lange rumgedoktort wird (bei der Datenflut des Zählers eh egal ) mach das einfach mit Device::SerialPort

                          Hier ist der Code aus Post #148 ein wenig aufgeräumt ... aber noch nicht getestet.
                          Das senden an die GA kannst Du dann hier: https://knx-user-forum.de/233261-post43.html kopieren, sofern das erstmal läuft.


                          Code:
                          #!/usr/bin/perl
                          
                          # 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 möglich, in diesem Script aber noch nicht umgesetzt.
                          
                          # !!! Wiederholung nur alle 3 Minuten da der Zaehler nach Ende des Scriptes weiter sendet !!!
                          
                          # Basis des Scripts von volkszaehler.org / Autor: Andreas Schulze & Bugfix: Eric Schanze
                          # DPT9 sub: makki / www.knx-user-forum.de
                          # In dieser Version keine Anbindung an den KNX-Bus
                          # Erweiterung um RRD,KNX-Anbindung und gezielte Wertsuche auf Wiregate: 
                          # JuMi2006 / www.knx-user-forum.de
                          # Version: 0.1.3
                          # Datum: 23.04.2012
                          
                          use warnings;
                          use strict;
                          use Device::SerialPort;
                          use RRDs;
                          
                          ### KONFIGURATION ###
                          my $device = "/dev/ttyUSB-1-4.1";	#Port
                          my $rrdpath = "/var/www/rrd";		#Pfad für RRDs
                          my $counterid = "Zaehler_HZ";		#Grundname für RRDs
                          my %obis=(	"16.7"=>6,		#Obis-Zahl => Anzahl der Stellen z.B.: 6 = 123.45
                          		"32.7"=>3,
                          		"52.7"=>3,
                          		"31.7"=>6,
                          		"51.7"=>6,
                          		"71.7"=>6,
                          		"72.7"=>3,
                          		"1.8.1"=>10);		#!!!COUNTER!!!
                          
                          my %countermode=("1.8.1"=>24);		#Obiscode für Zaehlerstaende
                          					#RRD gibt Verbrauch pro Tag aus (beta)
                          
                          
                          
                          ### ENDE KONFIGURATION ###
                          my $endsign = "!";			#Letztes Zeichen im Protokoll vom Zaehler
                          
                          ### Seriellen Port initialisieren
                          
                          ####START 300baud
                          my $port = new Device::SerialPort($device) || die "can't open $device: $!";
                          $port->baudrate(300)      || die 'fail setting baudrate';
                          $port->databits(7)        || die 'fail setting databits';
                          $port->stopbits(1)        || die 'fail setting stopbits';
                          $port->parity("even")     || die 'fail setting parity';
                          $port->dtr_active(1);
                          $port->rts_active(1);
                          $port->read_char_time(500);     # 0.5 seconds for each character
                          $port->read_const_time(1000);   # 1 second per unfulfilled "read" call
                          $port->write_settings     || die 'fail write settings';
                          
                          
                          ### Anforderungstelegramm senden
                          my $data="2f3f210d0a";				#Anfrage als HEX "/?!<CR><LF>"
                          my $request = pack('H*',$data);
                          						
                          my $num_out = $port->write($request);
                          print $request;
                          die "write failed\n" unless ($num_out);
                          die "write inclomplete\n" unless ($num_out == length($request));
                          print "$num_out Bytes written\n";
                          
                          ### Warte auf Zaehlerkennung
                          
                          select(undef, undef, undef, 1.5); # 1.5 Sekunden warten
                          
                          ### Telegramm mit ACK und neuer Geschwindigkeit senden
                          my $data2="063030300d0a";				#ACK und neue Geschwindigkeit in HEX "<ACK>040<CR><LF>"
                          my $baudwechsel = pack('H*',$data2);	# 000 = 300baud, 040 = 4800baud
                          
                          my $num_out2 = $port->write($baudwechsel);
                          print $baudwechsel;
                          die "write failed\n" unless ($num_out2);
                          die "write inclomplete\n" unless ($num_out2 == length($baudwechsel));
                          print "$num_out2 Bytes written\n";
                          
                          ### AUSLESEN
                          
                          my $STALL_DEFAULT=5; # how many seconds to wait for new input
                          my $timeout=$STALL_DEFAULT; 
                          my $chars=0;
                          my $buffer="";
                          
                          while ($timeout>0) {
                                  my ($count,$saw)=$port->read(25); 	# Liest 25 Zeichen je Durchlauf aus
                                  if ($count > 0) {
                                          $chars+=$count;
                                          $buffer.=$saw;
                          		#print ($buffer,"\n");		# Ausgabe der eingelesenen Daten
                          
                          
                          ### FILTER FOR END
                          if ($buffer =~ /\Q$endsign\E/)			# \Q \E entwertet alle Sonderzeichen dazwischen
                          {	
                          $port->close || die "can't close $device: $!";	# Port schlieen
                          last;						# Schleife verlassen
                          }
                          ### ENDE FILTER FOR END
                                  
                          }
                                  else {
                                          $timeout--;
                                  }
                          }
                          
                          if ($timeout<=0) {
                          $port->close || die "can't close $device: $!";        
                          print "Waited $STALL_DEFAULT seconds and never saw what I wanted\n";
                          		}
                          print $buffer;		#Nur zur Kontrolle
                          
                          ### FILTER FOR DATA
                          while (my($key, $value) = each %obis)
                          {
                          my $obiskey = $key."\(";
                          if ($buffer =~ /\Q$obiskey\E/)			# \Q \E entwertet alle Sonderzeichen dazwischen
                          {	
                          my $pos=index($buffer,$obiskey);		# Anfangsposition des OBIS-Key finden
                          #print ("Obiskey: $obiskey","\n");		# Kontrolldruck
                          #print ("Position: $pos","\n");			# Kontrolldruck
                          #print (length($obiskey),"\n");			# Kontrolldruck
                          my $obisvalue=substr($buffer,($pos+length($key)+1),$obis{$key}); 	# Wert extrahieren
                          print ($key,": ",$obisvalue,"\n");					# Kontrolldruck
                          
                          ### RRD-Erstellen
                          my $obisname = "$key";
                          $obisname =~ tr/./-/;
                          my $rrdname = $counterid."_".$obisname."\.rrd";
                          print ($rrdname,"\n");
                          my $rrdfile = $rrdpath."\/".$rrdname;
                          
                          
                          ### RRD check COUNTER/GAUGE
                          if (exists $countermode{$key})
                          {
                          print ("COUNTER","\n");
                          ### COUNTER schreiben
                          unless (-e $rrdfile) 
                          {
                          RRDs::create ($rrdfile,"DS:value:COUNTER:86500:0:10000000000","RRA:AVERAGE:0.5:1:365","RRA:AVERAGE:0.5:7:300","-s 86400");
                          }
                          ### RRD-Füllen
                          RRDs::update("$rrdfile", "N:$obisvalue*=86400");
                          }
                          else
                          {
                          print ("GAUGE","\n");
                          ###GAUGE schreiben
                          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");
                          }
                          ### RRD-Füllen
                          RRDs::update("$rrdfile", "N:$obisvalue");
                          }
                          }
                          }
                          ### ENDE FILTER FOR DATA
                          
                          
                          
                          ### Log der Zaehlerausgabe
                          #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
                          #my $timestamp = printf "%4d-%02d-%02d %02d:%02d:%02d\n",$year+1900,$mon+1,$mday,$hour,$min,$sec;
                          
                          #open(LOG,'>>',$file) || die "Fehler $!";
                          #print LOG ("\n",$year+1900,"-",$mon+1,"-",$mday," ",$hour,":",$min,":",$sec," \; ",$value);
                          #close LOG;
                          Umgezogen? Ja! ... Fertig? Nein!
                          Baustelle 2.0 !

                          Kommentar


                            #88
                            Ich habe das Problem gefunden. Der itron ACE3000 Typ 260 liefert nur den Zählerstand auf 1.8.0 (statt 1.8.1). Die anderen Werte scheint der Zähler nicht auszugeben. Ich habe nun auch Version 0.1.5 am Laufen.

                            @JuMi2006 Danke nochmal für die Hilfe!!!

                            Zitat von makki Beitrag anzeigen
                            Ist es nicht schon kompliziert genug und wäre es daher evtl. ziehlfühernder wenigstens denselben Lesekopf von Volkszähler.org zu verwenden
                            Tja, nicht alle trauen sich zu, so ein Ding selbst zu löten. Deswegen habe ich es für besser gehalten, einen fertigen Kopf zu kaufen, statt selbst rumzufummeln. Bisher dachte ich, dass ihr die gleiche Meinung vertretet...
                            Irgendwie entsteht der Eindruck, dass ich euch mehr und mehr selbst widersprecht...

                            Jetzt wissen wir alle, dass dieser fertige Kopf auch funktioniert. Das macht die Hürde für andere etwas niedriger.

                            Viele Grüße
                            Sascha

                            Kommentar


                              #89
                              Zitat von haegar80 Beitrag anzeigen
                              Ich habe das Problem gefunden. Der itron ACE3000 Typ 260 liefert nur den Zählerstand auf 1.8.0 (statt 1.8.1).
                              Erstmal schön dass es läuft, das hatt ich jetzt nicht extra erwähnt dass das Script nur das senden kann was es auch auslesen kann

                              Dennoch hat das nichts mit dem OBIS-Wert zu tun. Da konnte die Schnittstelle nicht richtig angesprochen werden.
                              Code:
                              2012/10/12 16:16:08 socat[5084] E tcgetattr(3, 0xbf9f1dac): Inappropriate ioctl
                              Naja hauptsache es läuft ...

                              Gruß
                              Umgezogen? Ja! ... Fertig? Nein!
                              Baustelle 2.0 !

                              Kommentar


                                #90
                                Zitat von JuMi2006 Beitrag anzeigen
                                Dennoch hat das nichts mit dem OBIS-Wert zu tun. Da konnte die Schnittstelle nicht richtig angesprochen werden.
                                Code:
                                2012/10/12 16:16:08 socat[5084] E tcgetattr(3, 0xbf9f1dac): Inappropriate ioctl
                                Zu dem Zeitpunkt war my $device = "/dev/ttyUSB0" nicht gesetzt. Das wird wohl die Ursache gewesen sein. Danach hat das Skript einfach nichts mehr angezeigt. Deswegen meine blöden Fragen

                                Jetzt geht es mit dem Zählerstand. Nochmal Danke für deine Geduld.
                                Sascha

                                Kommentar

                                Lädt...
                                X