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

    Bei mir muss der Kopf auf 9 Uhr sitzen und ganz nach oben geschoben werden. Dann kommen zumindest beim Testprogramm Hexdaten an. Das Testprogramm scheint aber nur einmal am Anfang was zu senden. Laut Doku müsste es aber zwischendurch auch nochmal was machen... sehr seltsam. Aber ja, nun müsste es ans decoding gehen
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    Kommentar


      Nun gut, Leseköpfchen sind bestellt, die SW zum debuggen rudimentär im Repository (mal wieder 10+ Packerl/Backports - nicht vom "neuen" squeeze aufs "alte" lenny sondern GIT/Head->lenny übrigens )

      Ich schätze das wird werden, bzgl. der SW bin ich mir noch nicht ganz sicher, welchen Weg man da konkret geht aber deswegen will ich es mir ja auch ansehen; vzlogger sieht mir gut aus (trotz der 10 backports..), libsml eh, der Rest davon ist mir gefühlt ein bisschen zuviel PHP-bloatware (man braucht jetzt nicht wirklich einen mysql für Zählerstände IMHO..)

      -> Wenn sich noch andere Zählermodelle (eHZ/EDL21 mit SML) finden, gerne. Es geht erstmal darum zu sehen wo/ob das sauber geht bzw. welche Besonderheiten&Probleme es im Feld gibt.

      @Mirko: ich würde das ganze Thema gerne etwas allgemeinverständlicher & nutzbar machen; Möglichst ohne viel stricken
      Insofern sind die Fragen für die "progressiven": Welcher Lesekopf wurde verwendet? (Eigenbau ist ja 100% ok wenns geht, aber halt nichts fürs Feld..)
      Wo lagen die Besonderheiten beim auslesen oder ging es "einfach so" mit dem gegebenen PHP? (finde ich halt nicht perfekt, dem vzlogger würde ich da mehr zutrauen..)

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

      Kommentar


        Mein Ziel ist es schon das Plugin so zu machen dass man nur noch einträgt was man gerne hätte, das Problem was ich sehe ist z.B. auch die Genauigkeit der Daten die jeder unterschiedliche Zähler liefert - trotz gleichen Protokolls.
        Beispiel Verbrauch:
        - Landis+Gyr Auflösung 0,001 kWh
        - EMH Auflösung 0,1 kWh
        Da ist das parsing das Problem, die Schnittstellengeschwindigkeit ist eher sekundär, bzw. lässt sich auf 4800Baud umstellen. Dafür wäre es einfacher die Abfragedaten gleich als HEX zu senden, oder wie wird ACK mit Perl an serial gesendet?

        Bevor ich mich beim neuen Zähler ans parsen mache will ich den Baudwechsel hinbekommen, dann geht das andere auch schneller.

        Lesekopf ist von volkszähler.org, dazu schreib mir mal ne PN.
        Ansonsten halte ich den nötigen Code für relativ simpel - für mich zwar schwer aber ich nutze es auch als Einstieg in Perl. Wenn ich mir mit dem SerialPortMonitor ansehe was das oben verlinkte Tool sendet und empfängt dann ist da wirklich nix dran, ich kann dir da gern mal nen Protokoll senden.

        vzlogger ist mir zu aufgeblasen ... 12 mio. backports und eine Installationsanleitung bei der ich als nicht-linuxer schon weiche Augen vom scrollen bekomme.

        Mal ganz im ernst - jeder der mehr als 2 Wochen Perl programmiert (also das Gegenteil von mir) schmiert den Code glaub ich ganz schnell hin.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          Zitat von JuMi2006 Beitrag anzeigen
          ..das Problem was ich sehe ist z.B. auch die Genauigkeit der Daten die jeder unterschiedliche Zähler liefert - trotz gleichen Protokolls.
          Klar, genau deswegen würde ich aber auf libsml/vzlogger setzen, um die blutigen Details verschiedener Geräte (vgl. eibd/owfs) können sich spezialisierte Programme besser kümmern

          Da ist das parsing das Problem, die Schnittstellengeschwindigkeit ist eher sekundär, bzw. lässt sich auf 4800Baud umstellen. Dafür wäre es einfacher die Abfragedaten gleich als HEX zu senden, oder wie wird ACK mit Perl an serial gesendet?
          Genau da liegt der Grund, warum ich das lieber vzlogger&Co überlassen würde, das ist im Perl-Plugin schmerzhaft und/oder zu langsam..Brauchts ja aber auch garnicht.

          Lesekopf ist von volkszähler.org,
          Reicht ja als Info, geht sicherlich aber ist halt Bastelstunde - und ich hätte es am Ende des Tages gerne ohne Lötkolben, wobei der Lötkolben erlaubt - aber nicht zwingend notwendig sein sollte

          Ansonsten halte ich den nötigen Code für relativ simpel
          Ist es, ich habe aber keine Lust die 37 Sonderfälle die nächsten 15J alleine anzupassen
          Nicht immer - aber oft funktioniert OSS insofern das man nur das Problem sauber beschreiben muss und es dann behoben wird..

          vzlogger ist mir zu aufgeblasen ... 12 mio. backports und eine Installationsanleitung bei der ich als nicht-linuxer schon weiche Augen vom scrollen bekomme.
          Auch klar, der ist aber eigentlich sehr schlank; das "aussenrum" ist IMHO übergewichtig, aber das muss man ja nicht verwenden.. (Konkret: die "Middleware" ist mir deutlich zu heavy, es gibt da aber mehrere Optionen: als JSON vom vzlogger auslesen, diesem RRD beibringen, .. mal sehen..)

          Deswegen hab ich heute "ein paar Minuten" mit dem erstellen der notwendigen Dependencies verbracht damit das keine Freakshow mehr ist (ist noch nicht 100% aber das soll ja Sinn der Aktion sein, das sauber zu machen & rauszufinden)
          Die hälfte davon hatte ich eh schon wegen OLA/wiregated2, die anderen von den zurückliegenden SML-Experimenten; deswegen grinse ich auch nur noch, wenn jemand wegen "aktueller Distro/Updates" nölt (wo nichts davon drin ist), weil wir pflegen de-fakto halt da schon länger ein "Special" für GA/HA-Zwecke, seis nun eibd, owfs, ola, libsml oder vzlogger

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

          Kommentar


            Bei mir gings auch ohne Lötkolben.
            volkszaehler.org - wiki - IR-Schreib-Lesekopf
            Da steht noch ein Satz dabei, den habe gelesen und dann war der Kopf fertig hier. Natürlich ohne CE und Co. Vom Innenleben kann man das vermutlich aber alles vergleichen. Ist ja kein Voodoomagic.

            Ansonsten ist es eine Frage des Ziels. Entweder man macht ein Bastelplugin, wie es das für viele andere Anwendungen im WG auch gibt oder aber man will eher ein ein eHZ Interface bauen, auf das dann auch die WG Software zugreift. Sind vermutlich zwei unterschiedliche Ansätze. Das Protokoll, wenn man es denn so nennen kann, ist wirklich nicht so dolle. Es gibt da auch einen kleinsten gemeinsamen Nenner. Der würde für die allermeisten gehen. Einzelabfrage von Werten beispielsweise ist aber zählergranular.

            Ich bin dafür, erstmal das Bastelplugin hinzubekommen, was jeder an seinen Zähler anpassen kann (sie wie halt bei den anderen Plugins auch). Anschliessend oder parallel kann man natürlich mal vzlogger zum Fliegen bekommen. Wobei ich das derzeit erstmal auf einem Ubuntu mache, um etwas Arbeit zu sparen... Wenns dann ein schönes Ergebnis gibt, kann man das aufs WG aufsetzen.

            Just my 2ct.
            Derzeit zwischen Kistenauspacken und Garten anlegen.
            Baublog im Profil.

            Kommentar


              Hallo
              Mein "Easymeter Q3C" hat 2 Optische Schnittstellen.
              Vorne die runde mit der Sende und Lese LED, die Schnittstelle sendet nur auf Anforderung.
              Oben drauf eine rechteckige http://download.hager.com/Hager.de/f...Z_09DE0009.pdf
              Seite 10, zu diesen Kopf braucht man man bei meinen Zähler noch eine Halterung.
              Diese Schnittstelle sendet alle 2sec. die Daten. Diese Schnittstelle kann kann auch Daten empfangen zum umschalten der Tarifwerke.
              Ich habe die Schnittstelle oben benutzt.
              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


                Wir reden ja hier von 2 (eher 3) unterschiedlichen Protokollen:

                SML -> sendet ohne Anfrage mit meist 9600baud alle 2-5 Sekunden
                IEC 62056-21 -> sendet nach Anfrage mit 300baud

                Bei IEC 62056-21 gibt es noch unterschiedliche Varianten:
                - nach Anforderung wird einfach gesendet, auch wenn kein ACK oder Baudratenumschaltung kommt
                - nach Anforderung wird ACK und Baudratenumschaltung/Ausleseart erwartet i.R. bis 4800baud

                Beide Varianten laufen bei mir gerade, nur die Baudratenumschaltung hängt noch irgendwie, ich bekomme Device::Serial einfach nicht dazu die Geschwindigkeit zu ändern. Die Telegramme stimmen aber, wenn ich also die Bestätigung sende und 300 baud als "neue" Geschwindigkeit definiere dann kommen die Werte, bei 4800 baud kommt dann leider nichts mehr.

                Der Zähler wird richtig intitalisiert, nur mein Port ändert seine Geschwindigkeit nicht. Das merke ich daran dass ich unterschiedliche Geschwindigkeiten vorgeben kann mit denen der Zähler sendet, sobald diese aber nicht 300 baud sind erhalte ich beim auslesen mit 300 Baud natürlich kryptische Zeichen, das heißt also der Zähler macht schonmal das was er soll, nur mein Port noch nicht.

                Also nah dran ;-) wie wird bei Device::Serial eine neue Geschwindigkeit eingestellt ?

                $port->baudrate(4800);
                $port->write_settings || die 'fail write settings';
                nach der Initialisierung gibt mir nur Ausgaben wenn baudrate=300
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  @greentux: ich hätte da schon mal angestrebt, eine "runde" Plug&Play Lösung zu haben. Erstens weil es eigentlich fast jeder brauchen kann (ausser ich, meine ollen Zähler ticken nur..), zweitens weil das wohl schnell hübsch unübersichtlich wird, obwohl es (theoretisch..) Standartisiert wäre..
                  Zu einer runden Lösung gehört aber für mich auch ein "fertiger" Lesekopf mit Gehäuse usw. Ist kein Super-Schnäppchen, wir wissen alle das nur Bauteile für 3 EUR drin sind, aber..

                  Der vzlogger liegt (sehr rudimentär!) übrigens schon im Repository, falls jemand schonmal spielen mag.. Ich will mir das aber wiegesagt mit versch. Zählern eigentlich erstmal selbst ansehen, wie sich das ganze anfühlt, um dann zu beurteilen, welcher Weg da am besten ist..

                  @JuMi: Ich kanns nicht oft genug wiederholen: für sowas den socat dazwischen nehmen, fertig..
                  Device::Serialport ist IMHO was für masochisten

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

                  Kommentar


                    Zitat von makki Beitrag anzeigen
                    Device::Serialport ist IMHO was für masochisten
                    Makki
                    Aber da verstehe ich wenigstens was ich dem Teil sage . Für Socat fehlt mir im Moment echt die Muse - bis ich das verstanden habe sind wieder 3 Wochen rum.

                    Ansonsten ist mein WartungsVPN offen ;-) und das Lesescript liegt mit dem Namen 00.pl in /var/tmp
                    Über vzlogger wäre ich auch nicht böse wenn es dann nicht ewig dauert den Spaß wieder zu installieren, mal sehen ob ich mir das nochmal ansehe.
                    Umgezogen? Ja! ... Fertig? Nein!
                    Baustelle 2.0 !

                    Kommentar


                      Es gibt doch genügend Leseköpfe. Ferige, Halbfertige, Bausätze. Freie Wahl. Funktionieren tun die wohl alle ähnlich. Von daher sehe ich da das Problem nicht...
                      Derzeit zwischen Kistenauspacken und Garten anlegen.
                      Baublog im Profil.

                      Kommentar


                        Ich glaub das Problem sind nicht (nur) die Leseköpfe sondern das ganze halbwegs freakfrei ins Feld zu transportieren
                        Wo der Lesekopf herkommt ist mir ja eigentlich sekundär, nicht vielen liegt aber das löten von IR-Dioden, SML und Perl gleichzeitig wies mir scheint
                        Eine funktionierende Basis, an der man optimieren kann, das wär erstmal was..

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

                        Kommentar


                          Dann kauf halt einen fertigen Kopf. Das habe ich auch gemacht. Eben nur nicht für >>50€.
                          Ich würde für die Profivariante dann einen neuen Fred aufmachen und den hier für ein einfaches Plugin weiter verwenden...
                          Derzeit zwischen Kistenauspacken und Garten anlegen.
                          Baublog im Profil.

                          Kommentar


                            Mal wieder ein Update.

                            Ziemlich zusammengewürfelt aber funktioniert.

                            Auf das senden auf den Bus hab ich vorerst mal verzichtet, wird wieder eingebaut. Socat hab ich noch nicht implementiert, das warte ich auch erst mal ab wie weit vzlogger auf dem WireGate unterstützt werden soll.

                            Zur Konfiguration:

                            device = serieller/usb-port
                            conf4800 - ggf Pfad anpassen
                            endsign = muss eigentlich nicht geändert werden
                            rrdpath = Pfad zum RRD-Verzeichnis
                            counterid = Gibt den ersten Teil der RRD-Datei-Namen an

                            Die RRD werden nach dem Schema counterid_obiscode benannt, für OBIS 1.8.0 -> z.B. Zaehler_1-8-1.rrd .

                            obis = auszulesender Obis-Wert und Länge des Datensatzes
                            countermode = hier nochmal die Obiscodes eintragen die Zählerstände liefern, es werden Tagesverbräuche erstellt

                            Das erste Auslesen sollte in der Konsole mit dem zweiten Script hier erfolgen, da wird dann einmal der Zähler ausgelesen und angezeigt welche Codes er liefert und wieviele Stellen der einzelne Obiscode hat. Das Komma wird mitgezählt.
                            Das Script als *.pl ablegen und via crontab aufrufen lassen - Zyklus 5 Minuten.

                            Code 1 - Hauptprogramm:
                            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 $conf4800 = "/tmp/conf4800";		#temporäre Konfigurationsdatei für Baudwechsel
                            my $endsign = "!";			#Letztes Zeichen im Protokoll vom Zaehler
                            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 ###
                            
                            ### Seriellen Port initialisieren
                            
                            ####4800baud
                            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->rts_active(1);
                            $port->dtr_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';
                            
                            
                            $port->save($conf4800) 	|| warn "Can't save $conf4800: $!\n";
                            
                            ####START 300baud
                            $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";
                            
                            ### Port mit neuer Geschwindigkeit intialisieren
                            
                            $port->restart($conf4800)  || warn "Can't restart $conf4800: $!\n"; ;
                            
                            #$port->baudrate(300); 
                            #$port->write_settings;
                            
                            ### 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;

                            Hier der Auslesecode fürs erste auslesen. Etwas Geduld, kann je nach Zähler bis zu 3 Minuten dauern.
                            Am besten als init.pl speichern.

                            Code:
                            #!/usr/bin/perl
                            use warnings;
                            use strict;
                            use Device::SerialPort;
                            
                            ### KONFIGURATION ###
                            my $device = "/dev/ttyUSB-1-4.1";	#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
                            tipped and coded by a linux dau on several devices ;-)
                            Umgezogen? Ja! ... Fertig? Nein!
                            Baustelle 2.0 !

                            Kommentar


                              Hi Jumi,

                              Schritt 1 dann nach exaktem Ausrichten des Kopfs erledigt...:

                              ==> /?!<0D><0A>
                              <== /ACE0\3k260V01.18
                              ==> <06>000<0D><0A>
                              <== -- STX --
                              <== F.F(00)
                              <== C.1(97394723 )
                              <== C.5.0(00)
                              <== 1.8.0(005433.8*kWh)
                              <== !
                              <== -- ETX --
                              <== -- BCC --


                              Nun muss ich Dein Plugin darauf anpassen?
                              Oder sollte es sofort gehen?

                              Grüße
                              Derzeit zwischen Kistenauspacken und Garten anlegen.
                              Baublog im Profil.

                              Kommentar


                                Der Zähler ist ja wirklich sparsam mit Daten. Also es kommt nur der Zählerstand zur Auslesung in Frage.
                                Ich weiß dass das script noch sehr rudimentär ist ;-) deshalb muss man die Obis-Zahlen die eine Angabe zur Arbeit (kWh) machen nochmal in den hash %countermode schreiben.
                                Die Zuordnung 24 entspricht den 24 Stunden des Tages, hier sollen später dann auch nochmal weitere Daten rein so dass auch 15Minuten oder 1 Stunden rrds erzeugt werden können.

                                Folgendes muss jetzt angepasst werden:

                                Bei dir wird er Zählerstand in 1.8.0 gesendet: 1.8.0(005433.8*kWh)
                                Obis = 1.8.0 -> kommt in beide hashes weil kWh !!!
                                Wert= 005433.8 -> hier zählen wir nun die Stellen incl. Komma -> 8

                                PHP-Code:
                                my %obis=(    "1.8.0"=>8);        #Obis-Zahl => Anzahl der Stellen z.B.: 8 = 005433.8
                                my %countermode=("1.8.0"=>24);    #Obis-Zahl für Zaehlerstaende => 24h Intervall RRD 
                                Das wars eigentlich, Man muss lediglich 3 Werte wissen:

                                1. Welche Obis-Zahlen werden geliefert und möchte ich auswerten ? 1.8.0
                                2. Wie genau ist mein Zähler bei der Ausgabe ? 8 Stellen
                                3. Welche Werten geben Arbeit aus ? 1.8.0
                                Umgezogen? Ja! ... Fertig? Nein!
                                Baustelle 2.0 !

                                Kommentar

                                Lädt...
                                X