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

    Hallo

    -hat sich das Warten gelohnt?
    Ich werde es rausfinden!
    EMH-Zähler und VolksKopf vorhanden!

    Grüße,
    Lio

    Kommentar


      gibt es ein Tool um die Endposition des Zählerstandes zu ermitteln?
      -Habe zwar den Stand, aber muss ich alle Zeichen von Hand Zählen?

      Kommentar


        Ersetze für einen Durchlauf
        Code:
        print LOG ("\n",$year+1900,"-",$mon+1,"-",$mday," ",$hour,":",$min,":",$sec," ; ",$value);
        durch

        Code:
        print LOG $s;
        Dann bekommst Du die ganze Ausgabe bis Zeichen Nummer ($position) in die Textdatei. Die musst Du vorher aber anlegen, so weit war ich noch nicht. Dann kannst Du im guten Editor die richtige Stelle ablesen.

        Oder einfach per Try&Error ausprobieren bis es passt ;-).
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          Ich sehe gerade dass die ganze Abfrage nochmal überarbeitet werden muss da sie nicht ganz sicher ist. Die Position stimmt ab und an nicht, da muss man wohl nochmal filtern. Mit den 300 Baud und den Zeilenumbrüchen macht das aber irgendwie keinen Spaß. Vielleicht doch erst alles auslesen, ein timeout einbauen und dann den entsprechenden String suchen?
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            danke,

            aber ich seh' gerade, dass ich wohl noch ein anderes Problem habe?
            Was ist da los?
            Angehängte Dateien

            Kommentar


              Welches Script benutzt Du?
              Das von NetFritz ist für Zähler auf SML-Basis. Was hast Du für einen Zähler?
              Mein EMH spricht kein SML, hat aber natürlich auch die OBIS-Kennzahlen.

              Konkret fehlt Dir vor den Variablen ein "my" -> my $key z.B. oder das "use strict" entfernen. Was das an anderer Stelle bewirkt weiß der Linux-DAU vor meinem Monitor aber nicht .

              Führe das Script nicht als Wiregate-Plugin aus, das wird entweder im Timeout enden oder andere Sachen einfach blockieren.

              Putty und Konsole sind angesagt - nach ein paar Tagen wird man richtig schnell damit.
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                Tja so langsam finde ich keine Ausreden mehr, meinen Zähler ans Netz zu bringen... So ein Mist...
                Derzeit zwischen Kistenauspacken und Garten anlegen.
                Baublog im Profil.

                Kommentar


                  Ich habe einen EMH EHZ-H Zähler-also SML.
                  Mit Konsole usw. hört's bei mir dann auf-wird dann damit auch nichts mit einem Schnellschuss.

                  GRüße,
                  Lio

                  Kommentar


                    Bitte nur Hinweise und als solche verstehen:

                    Zitat von JuMi2006 Beitrag anzeigen
                    Konkret fehlt Dir vor den Variablen ein "my" -> my $key z.B. oder das "use strict" entfernen.
                    letzteres bitte nicht, das ist nicht nur schlechter sondern IMHO tödlicher Coding-Style; Wer einen Stück Code schreibt, dem ist zuzumuten, sich vorher auszudenken, welche Variablen er gerne benutzen würde, wenn diese ohne "use strict" mehr oder minder zufällig zur Laufzeit definiert werden ist dem Chaos Tür&Tor geöffnet, kleinste Tippfehler usw. führen zu scheinbar komischem Verhalten, das ist crap..

                    Führe das Script nicht als Wiregate-Plugin aus, das wird entweder im Timeout enden oder andere Sachen einfach blockieren.
                    Richtig, das geht so hier und heute nicht (es gibt aber ein schwaches Licht am Horizont was den Timeout angeht )
                    Crontab tuts dafür.. Ich finds manchmal cool, das man auch 25.000 andere Sachen benutzen kann, die wir garnicht angedacht haben

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

                    Kommentar


                      So hier mal eine überarbeitete Version.

                      Neu:
                      - Die Stelle des Zählerstandes wird zuverlässiger gefunden
                      - RRD und Log-Datei werden, falls noch nicht vorhanden automatisch angelegt
                      - Es müssten jetzt alle Zähler nach IEC 62056-21 damit auslesbar sein
                      - Es werden 3 RRDs erzeugt mit dem Verbrauch in einer Auflösung von 24h, 1h, und 15 min

                      Was noch nicht funktioniert ist das timeout .
                      Für alle die es hier vielleicht lesen: der COUNTER Mode vom RRD verträgt nur Integer, kein Float - zumindest so mein Wissensstand.

                      Ansonsten Aufruf durch cron alle 5 Minuten, 300 Baud ist eben langsam
                      Damit kann es dann eigentlich auch ins SVN, es brauch nur noch nen schönen Namen.

                      Code:
                      #!/usr/bin/perl
                      
                      # Zählerabfrage für Zähler 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.
                      
                      # Das Script ist angepasst auf EMH ITZ. Weitere Zaehler wie z.B. Elster AS1440, Siemens TD-3511 müssen
                      # angepasst werden (Obis-Key).
                      
                      # !!! Wiederholung nur alle 3 Minuten da der Zähler 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
                      # Erweiterung um RRD,KNX-Anbindung und gezielte Wertsuche auf Wiregate: JuMi2006 / www.knx-user-forum.de
                      # Version: 0.1.2
                      # Datum: 15.04.2012
                      
                      use warnings;
                      use strict;
                      use Device::SerialPort;
                      use RRDs;
                      
                      ### KONFIGURATION ###
                      my $device="/dev/ttyUSB-1-4";					#Schnittstelle
                      my $request = "/?!\r\n";						#Anforderungstelegramm "/?!" \r\n entspricht CR-LF
                      my $ga = "0/0/4";								#Gruppenadresse DPT9
                      my $obiskey="1.8.0(";							#Schlüssel vor Anabe des Zählerstandes z.B. "1.8.0(0001234.5 kWh)"
                      
                      my $file = "/var/tmp/Zaehler.log";				#Logdatei wird automatisch angelegt!
                      my $rrd_V24h = "/var/www/rrd/Verbrauch_24h.rrd";		#Verbrauch pro 24h
                      my $rrd_V1h = "/var/www/rrd/Verbrauch_1h.rrd";			#Verbrauch pro 1h
                      my $rrd_V15min = "/var/www/rrd/Verbrauch_15min.rrd";		#Verbrauch pro 15min
                      
                      ### ENDE KONFIGURATION ###
                      
                      ### RRD-Erstellen
                      unless (-e $rrd_V24h) 
                      {
                      RRDs::create ($rrd_V24h,"DS:value:COUNTER:86500:0:10000000000","RRA:AVERAGE:0.5:1:365","RRA:AVERAGE:0.5:7:300","-s 86400");
                      }
                      unless (-e $rrd_V1h) 
                      {
                      RRDs::create ($rrd_V1h,"DS:value:COUNTER:3650:0:10000000000","RRA:AVERAGE:0.5:1:2400","RRA:AVERAGE:0.5:24:300","-s 3600");
                      }
                      unless (-e $rrd_V15min) 
                      {
                      RRDs::create ($rrd_V15min,"DS:value:COUNTER:300:0:10000000000","RRA:AVERAGE:0.5:1:2400","RRA:AVERAGE:0.5:12:300");
                      }
                      
                      
                      ### Seriellen Port initialisieren
                      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->write_settings     || die 'fail write settings';
                      $port->rts_active(1);
                      $port->dtr_active(1);
                      $port->read_char_time(500);     # 0.5 seconds for each character
                      $port->read_const_time(3000);   # 3 second per unfulfilled "read" call
                      
                      
                      ### Anforderungstelegramm senden
                      my $num_out = $port->write($request);
                      die "write failed\n" unless ($num_out);
                      die "write inclomplete\n" unless ($num_out == length($request));
                      print "$num_out 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(255); 	# Liest 255 Zeichen je Durchlauf aus
                              if ($count > 0) {
                                      $chars+=$count;
                                      $buffer.=$saw;
                      		print $buffer;			# Ausgabe der eingelesenen Daten
                       
                      ### FILTER
                      
                      if ($buffer =~ /\Q$obiskey\E/)			# \Q \E entwertet alle Sonderzeichen dazwischen
                      {
                      my $pos=index($buffer,$obiskey);			# Anfangsposition des OBIS-Key finden
                      #print ("Position: $pos","\n");			# Kontrolldruck der Anfangsposition
                      my $value=substr($buffer,$pos+6,9);		# Wert extrahieren (OBIS-Key=6 Zeichen lang,Wert=9 Zeichen lang)
                      print ($value," kWh","\n");				# Kontrolldruck Zählerstand
                      
                      my $val1 = int(substr $value,0,7);			### separiert die ersten 7 Zahlen im String z.B. "0001234"->1234
                      my $val2 = int(substr $value,8);			### spariert die letzte Zahl im String (bei 9 Stellen) z.B. ".5"->5
                      
                      print ("val1: ",$val1,"\n");			### Zur Kontrolle in der Konsole
                      print ("val2: ",$val2,"\n");			### Zur Kontrolle in der Konsole
                      
                      ### Wert in DPT9 umwandeln und in Konsole ausgeben
                      my @hexdec = encode_dpt9($value);				
                      my $hexval = sprintf("%x", $hexdec[0]) . " " . sprintf("%x", $hexdec[1]);
                      print ($hexval,"\n");
                      
                      ### Wert an Gruppenadresse und RRD senden
                      
                      system("groupwrite ip:localhost $ga $hexval");	#Zählerstand auf Bus
                      
                      my $valrrd_V24h = int($value*86400); 	# Verbrauch 24h
                      my $valrrd_V1h = int($value*3600); 		# Verbrauch 1h
                      my $valrrd_V15min = int($value*900); 	# Verbrauch 15 min
                      
                      RRDs::update("$rrd_V24h", "N:$valrrd_V24h"); 
                      RRDs::update("$rrd_V1h", "N:$valrrd_V1h");
                      RRDs::update("$rrd_V15min", "N:$valrrd_V15min");
                      
                      ### Log der Zählerausgabe
                      
                      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;	
                      
                      $port->close || die "can't close $device: $!";	# Port schließen
                      last;							# Schleife verlassen
                      
                      ### ENDE FILTER
                      }	
                              
                      }
                              else {
                                      $timeout--;
                              }
                      }
                      
                      if ($timeout<=0) {
                      					$port->close || die "can't close $device: $!";        
                      					print "Waited $STALL_DEFAULT seconds and never saw what I wanted\n";
                      		}
                      
                      
                      ### SUBS
                      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;
                      }
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar


                        Hallo
                        JuMi2006 schön das es bei Dir nun auch geht.
                        Ich habe auch noch so einen Zähler von der Firma Itron einen ACE3000 Typ 260.
                        Was hast Du den für einen Auslesekopf und wie bekommst Du die Daten ins Wiregate?
                        Um die Zählerstände auszulesen reicht sicherlich die Daten alle 5min zu erfassen.

                        Mein Zähler sendet aber auch die augenblickliche Leistung alle 2sec. mit.
                        Da wäre es schön das auch alle 2sec. die Daten zu erfassen.
                        Vielleicht setze ich nochmal meinen Arduino dafür ein, den kann man dann mit einem Plugin abfragen.
                        Gruß NetFritz
                        KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                        WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                        PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                        Kommentar


                          Hallo Netfritz,

                          bist Du Dir sicher, das der Zähler alle 2Sekunden alles sendet? Ich habe auch so einen, bisher aber nur die Anleitung gelesen, die anderes suggeriert. Die kW Impulse kommen automatisch, aber für die Daten will er einen Abfragecode gesendet bekommen
                          Derzeit zwischen Kistenauspacken und Garten anlegen.
                          Baublog im Profil.

                          Kommentar


                            Zitat von NetFritz Beitrag anzeigen
                            Hallo
                            JuMi2006 schön das es bei Dir nun auch geht.
                            Ich habe auch noch so einen Zähler von der Firma Itron einen ACE3000 Typ 260.
                            Lt. Tante Google hat er auch IEC 62056-21 !

                            Zitat von NetFritz Beitrag anzeigen
                            Was hast Du den für einen Auslesekopf und wie bekommst Du die Daten ins Wiregate?
                            Um die Zählerstände auszulesen reicht sicherlich die Daten alle 5min zu erfassen.
                            Schreib-Lesekopf -> volkszaehler.org - wiki - IR-Schreib-Lesekopf -> Udo

                            Dafür hab ich das Plugin gemacht. Kurz zur Erklärung, der Zähler sendet erst nachdem er eine Anfrage bekommen hat. Das Script sendet diese Abfrage und liest dann die Daten ein. Mein Zähler gibt nur den Stand aus daher wird das Plugin danach beendet. Die Werte werden dann in ein Log geschrieben, auf den Bus gesendet und in 3 unterschiedliche RRDs geschrieben. Dies passiert alle 5 Minuten -> cronjob

                            Zitat von NetFritz Beitrag anzeigen
                            Mein Zähler sendet aber auch die augenblickliche Leistung alle 2sec. mit.
                            Da wäre es schön das auch alle 2sec. die Daten zu erfassen.
                            Alle 2 Sekunden ist eher SML ... kann Deiner und meiner nicht.

                            Zitat von NetFritz Beitrag anzeigen
                            Vielleicht setze ich nochmal meinen Arduino dafür ein, den kann man dann mit einem Plugin abfragen.
                            Gruß NetFritz
                            Nicht nötig.

                            Das einzige was Du rausbekommen musst ist wie Dein Wert im Zähler gesendet wird. Dafür eignet sich am besten hterm (google). Dort kannst Du schonmal schön sehen wie der Zähler welche Daten sendet. Am besten erstmal den Lesekopf besorgen. Ich brauche auch noch einen zweiten da mir mein EVU nun doch einen elektronischen Zähler für Haushaltsstrom einbaut. Hoffentlich sendet der dann noch die aktuelle Leistung.

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

                            Kommentar


                              Hallo
                              Nochmal zur Erklärung, ich habe 2 Bezug und Abgabe Zähler für den ersten hatte ich das Script veröffentlicht.
                              Das ist der Zähler der alle 2sec. mit 9000Baud und 8Bit sendet.
                              Da dieser Zähler nicht nur den Zählerstand sondern auch die augenblickliche Leistung in Watt sendet, habe ich überlegt die Zähler mit dem Arduino alle 2sec. auzulesen , der soll dann die augenblickliche Leistung so verdichten das auch alle Spitzen in den RRDs erkennbar sind.
                              Das Wiregate holt sich dann jede Minute diese Daten und schreibt sie in eine RRD. Dem Wiregate möchte ich das nicht jede Minute zumuten.

                              Ich habe dann noch einen 2.Zähler von Eon Avacon, das ist ein "Itron ACE3000 Typ 260", der sendet nur auf Anforderung.

                              Gruß NetFritz
                              KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                              WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                              PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                              Kommentar


                                So weit verstanden, aber mit dem ACE3000 wirst Du keine größere Dichte als 5 Minuten hinbekommen. Dass Du das SML-Script schon hast weiß ich ja, nur verstehe ich dann Deine Frage nicht wenn alles klar ist .

                                Evtl. bekommt man die Daten schneller wenn man den Baudratenwechsel nach IEC 62056-21 hinbekommt, an meinem EMH ist mir das noch nicht gelungen. Die Daten kleckern nach dem Anforderungsprotokoll eben nur mit 300 Baud rein. Die gesamte Abfrage dauert bestimmt 2-3 Minuten bis man wieder von vorne anfangen kann.
                                Umgezogen? Ja! ... Fertig? Nein!
                                Baustelle 2.0 !

                                Kommentar

                                Lädt...
                                X