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

    #76
    Hallo
    Ich werde es noch ein paar Tage Testen, dann kann ich es ja veröffentlichen.
    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


      #77
      Schreib eine eMail/PN mit deinem SF-Account oder anhängen, ich finds immer schade wenn solche Entwicklungen untergehen (auch wenn es vielleicht nicht 100% meiner Meinung entspricht, ist da erstmal egal..)

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

      Kommentar


        #78
        Hallo
        Ich werde das Perl-Script nochmal so umändern das es per CRON aufgerufen werden kann.
        Dann kann es ins SVN.
        Das Script ist auf den SML-Zähler Easymeter Q3C zugeschnitten, kann aber auf andere SML-Zähler angepasst werden wenn man die OBIS-Kennung der einzelnen Messwerte kennt.
        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


          #79
          Hallo
          Hier das Perl-Script für den Easymeter-Zähler.
          Code:
          #!/usr/bin/perl
          #
          # Holt die Daten vom SML-Zaehler Easymeter Q3C
          # es wird die obere optische Schnittstelle ausgelesen
          # dort liefert der Zaehler alle 2sec. einen Datensatz
          # wird von CRON jede Minute aufgerufen
          # http://wiki.volkszaehler.org/software/sml
          # 03.2012 by NetFritz
          #
          use Device::SerialPort;
          use RRDs;
          #
          my $port = Device::SerialPort->new("/dev/usbserial-2-4") || die $!;
          $port->databits(8);
          $port->baudrate(9600);
          $port->parity("none");
          $port->stopbits(1);
          $port->handshake("none");
          $port->write_settings;
          $port->dtr_active(1);
          $port->purge_all();
          $port->read_char_time(0);     # don't wait for each character
          $port->read_const_time(1000); # 1 second per unfulfilled "read" call
          #
          # OBIS-Kennzahl und Anzahl der Zeichen von Anfang OBIS bis Messwert, Messwertwertlaenge immer 8 Zeichen 
          %obis_len = (
          '01010801FF' => 42, # Aktueller Zählerstand T1 +  Bezug                                                
          '02020805FF' => 42, # Aktueller Zählerstand T5 -  Abgabe
          '00010700FF' => 24  # Momentane Summe der Leistung +-
          ); 
          my $pos = 0;
          my $hexval;
          my @hexdec;
          while ($i < 3) { # wenn 540 chars gelesen werden wird mit last abgebrochen, wenn nicht wird Schleife 2 mal widerholt
                  my ($count,$saw)=$port->read(540);   # will read 540 chars
                  if ($count == 540) {                 # wurden 540 chars gelesen ?       
                          my $x=uc(unpack('H*',$saw)); # nach hex wandeln
                          # print  "$count <> $x\n ";  # gibt die empfangenen Daten in Hex aus
                          #
                          foreach $key(keys%obis_len){
                                $pos=index($x,$key);                              # pos von OBIS holen
                                $value = substr($x,$pos+$obis_len{$key},8);       # Messwert
                                $value{$key} = hexstr_to_signed32int($value)/100; # von hex nach 32bit integer
                          }
                                last; # while verlassen
                  }
                  else { 
                         $i++;  
                         redo; # bei Fehler while nochmal               
                  }
          }
          #
          @hexdec = encode_dpt9($value{'00010700FF'});
          $hexval = sprintf("%x", $hexdec[0]) . " " . sprintf("%x", $hexdec[1]);
          system("groupwrite ip:127.0.0.1 5/0/12 $hexval");
          #
          @hexdec = encode_dpt9($value{'01010801FF'});
          $hexval = sprintf("%x", $hexdec[0]) . " " . sprintf("%x", $hexdec[1]);
          system("groupwrite ip:127.0.0.1 5/0/13 $hexval");
          #
          @hexdec = encode_dpt9($value{'02020805FF'});
          $hexval = sprintf("%x", $hexdec[0]) . " " . sprintf("%x", $hexdec[1]);
          system("groupwrite ip:127.0.0.1 5/0/14 $hexval"); 
          #
          RRDs::update("/var/www/rrd/Zaehler_Leistung.rrd", "N: $value{'00010700FF'}"); 
          #
          #
          # ---  Sub Konvertiert hex string to 32 bit signed integer ----------
          sub hexstr_to_signed32int {
              my ($hexstr) = @_;
              die "Invalid hex string: $hexstr"
                  if $hexstr !~ /^[0-9A-Fa-f]{1,8}$/;
              my $num = hex($hexstr);
              return $num >> 31 ? $num - 2 ** 32 : $num;
          }
          # ---  Sub  2byte signed float --------------------------------------
          sub encode_dpt9 { 
              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;
          }
          # Ende
          Viel Spass damit.
          Makki Du kannst das Script ja ins SVN stellen.
          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


            #80
            Hallo,

            so wie ich es verstanden habe muss da irgendwas noch mit CRON passieren?
            Was muss ich noch zusätzlich machen?

            Danke und Grüße,
            Lio

            Kommentar


              #81
              Hallo
              Ruf das Script erst mal von der Konsole aus auf.
              Lösch dazu aus dieser Zeile das Kommentarzeichen "'#"
              Code:
              # print  "$count <> $x\n ";
              Dann kannst Du sehen ob da auch Daten ankommen.
              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


                #82
                knirsch-

                was ist und wie komme ich zur KONSOLE?

                sorry,
                Lio

                Kommentar


                  #83
                  @lio: ssh (z.B. Putty), Google ist Dein Freund, mit marginalem Aufwand sollte sich daraus auch ein Plugin machen lassen..

                  @NetFritz: ist drin

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

                  Kommentar


                    #84
                    ah ja, hab da mal was mit WinSCP gemacht-geht auch, oder?
                    wie ist das passwort für root?


                    Grüße,
                    Lio

                    Kommentar


                      #85
                      Das auf dem Aufkleber an der Unterseite (auch wenn das User-PW geändert wurde..)

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

                      Kommentar


                        #86
                        mein fehler-falscher Port

                        ..putty läuft nun auch..

                        ..und nun?

                        Kommentar


                          #87
                          Zitat von lio123 Beitrag anzeigen
                          ..und nun?
                          Ja, und nun=?
                          Konkrete Fragen/Probleme werden bearbeitet, Linux-Grundlagen findet Tante Google auch ohne mein zutun

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

                          Kommentar


                            #88
                            Ich möchte mich mit meinem Zähler hier mal einklinken. Laut Tante Google und mit meinen spärlichen Linux-Kenntnissen bin ich schon so weit gekommen dass mein Zähler mit mir spricht.

                            Der Zähler antwortet leider nur auf meine Frage und sendet keine kontinuierlichen Daten raus. Es ist ein EMH ITZ -> Datenblatt und wird folgendermaßen angesprochen:

                            300 Baud
                            1 Stopbit
                            7 Datenbit
                            Parity even

                            Er antwortet auf "/?!" gesendet mit CR-LF dann im Klartext mit der OBIS-Zahl und den Werten.

                            Im Netz habe ich folgendes Script gefunden, angepasst und seit einem Neustart des Wiregate und damit verbundenen Wechsel von /dev/ttyUSB-2-4 auf /dev/ttyUSB-1-4 läuft das script auch sauber durch, beendet sich aber noch nicht. Das ist mir soweit auch klar weil "while(1)" ja wohl unendlich ist.

                            Wie bekomme ich jetzt sauber die 1.8.0 (Zählerstand in kWh) separiert? Den Rest brauch ich eigentlich nicht wirklich. Trotz aller Bemühungen hab ich das mit Arrays immer noch nicht drauf, aber das wäre hier wohl von Vorteil.

                            Das ganze würde ich erstmal als Cronjob laufen lassen bis ich mehr über den Zähler erfahren habe und irgendwie mehr Speed in die Abfrage bekomme.

                            Hier das Script und das Ergebnis aus der Konsole:

                            Code:
                            #!/usr/bin/perl
                            
                            #
                            # (m)ein Stromz0hler mit IR-Schnittstelle blubbert nach einem "Anforderung-
                            # telegramm" Daten raus. Das Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit
                            # und gerader Parit0t zu senden. Das ist der Initialmodus von Ger0ten,
                            # die das Protokoll IEC 62056-21 implementieren.
                            #
                            # Autor: Andreas Schulze
                            # Bugfix: Eric Schanze
                            # Datum: 20120302
                            #
                            
                            my $PORT='/dev/ttyUSB-1-4';
                            my $anforderungstelegramm = "\n/?!\r\n";
                            
                            use warnings;
                            use strict;
                            use utf8;
                            use Device::SerialPort;
                            
                            my $tty = new Device::SerialPort($PORT) || die "can't open $PORT: $!";
                            $tty->baudrate(300)      || die 'fail setting baudrate';
                            $tty->databits(7)        || die 'fail setting databits';
                            $tty->stopbits(1)        || die 'fail setting stopbits';
                            $tty->parity("even")     || die 'fail setting parity';
                            $tty->write_settings     || die 'fail write settings';
                            $tty->rts_active(1);
                            $tty->dtr_active(1);
                            $tty->read_char_time(500);     # 0.5 seconds for each character
                            $tty->read_const_time(3000);   # 3 second per unfulfilled "read" call
                            #$tty->debug(1);
                            
                            my $num_out = $tty->write($anforderungstelegramm);
                            die "write failed\n" unless ($num_out);
                            die "write inclomplete\n" unless ($num_out == length($anforderungstelegramm));
                            print "$num_out Bytes written\n";
                            
                            my ($num_read, $s);
                            while(1) {
                              ($num_read, $s) = $tty->read(10);
                              print $s;
                            }
                            
                            
                            $tty->close || die "can't close $PORT: $!";
                            die Konsole sieht dann so aus:

                            Code:
                            root@wiregate403:~# perl /var/tmp/test2.pl
                            6 Bytes written
                            /EMH4\@--ITZ-G0039E
                            F.F(00000000)
                            0.0.0(02200263)
                            0.0.1(02922369)
                            0.0.2(00000000)
                            0.1.0(03)
                            0.1.2*03(0120301000000)
                            0.1.2*02(0120201000000)
                            0.1.2*01(0120123113234)
                            0.1.2*00(0000000000000)
                            0.1.2*99(0000000000000)
                            0.1.2*98(0000000000000)
                            0.1.2*97(0000000000000)
                            0.1.2*96(0000000000000)
                            0.1.2*95(0000000000000)
                            0.1.2*94(0000000000000)
                            0.1.2*93(0000000000000)
                            0.1.2*92(0000000000000)
                            0.1.2*91(0000000000000)
                            0.1.2*90(0000000000000)
                            0.1.2*89(0000000000000)
                            0.2.2(11131719)
                            0.9.1(1222325)
                            0.9.2(1120329)
                            1.8.0(0001715.0*kWh)
                            1.8.0*03(0001307.3*kWh)
                            1.8.0*02(0000507.0*kWh)
                            1.8.0*01(0000009.3*kWh)
                            1.8.0*00(0000000.0*kWh)
                            1.8.0*99(0000000.0*kWh)
                            1.8.0*98(0000000.0*kWh)
                            1.8.0*97(0000000.0*kWh)
                            1.8.0*96(0000000.0*kWh)
                            1.8.0*95(0000000.0*kWh)
                            1.8.0*94(0000000.0*kWh)
                            1.8.0*93(0000000.0*kWh)
                            1.8.0*92(0000000.0*kWh)
                            1.8.0*91(0000000.0*kWh)
                            1.8.0*90(0000000.0*kWh)
                            1.8.0*89(0000000.0*kWh)
                            1.8.1(0001707.8*kWh)
                            1.8.1*03(0001300.0*kWh)
                            1.8.1*02(0000499.7*kWh)
                            1.8.1*01(0000002.0*kWh)
                            1.8.1*00(0000000.0*kWh)
                            1.8.1*99(0000000.0*kWh)
                            1.8.1*98(0000000.0*kWh)
                            1.8.1*97(0000000.0*kWh)
                            1.8.1*96(0000000.0*kWh)
                            1.8.1*95(0000000.0*kWh)
                            1.8.1*94(0000000.0*kWh)
                            1.8.1*93(0000000.0*kWh)
                            1.8.1*92(0000000.0*kWh)
                            1.8.1*91(0000000.0*kWh)
                            1.8.1*90(0000000.0*kWh)
                            1.8.1*89(0000000.0*kWh)
                            1.8.2(0000003.2*kWh)
                            1.8.2*03(0000003.2*kWh)
                            1.8.2*02(0000003.2*kWh)
                            1.8.2*01(0000003.2*kWh)
                            1.8.2*00(0000000.0*kWh)
                            1.8.2*99(0000000.0*kWh)
                            1.8.2*98(0000000.0*kWh)
                            1.8.2*97(0000000.0*kWh)
                            1.8.2*96(0000000.0*kWh)
                            1.8.2*95(0000000.0*kWh)
                            1.8.2*94(0000000.0*kWh)
                            1.8.2*93(0000000.0*kWh)
                            1.8.2*92(0000000.0*kWh)
                            1.8.2*91(0000000.0*kWh)
                            1.8.2*90(0000000.0*kWh)
                            1.8.2*89(0000000.0*kWh)
                            1.8.3(0000002.0*kWh)
                            1.8.3*03(0000002.0*kWh)
                            1.8.3*02(0000002.0*kWh)
                            1.8.3*01(0000002.0*kWh)
                            1.8.3*00(0000000.0*kWh)
                            1.8.3*99(0000000.0*kWh)
                            1.8.3*98(0000000.0*kWh)
                            1.8.3*97(0000000.0*kWh)
                            1.8.3*96(0000000.0*kWh)
                            1.8.3*95(0000000.0*kWh)
                            1.8.3*94(0000000.0*kWh)
                            1.8.3*93(0000000.0*kWh)
                            1.8.3*92(0000000.0*kWh)
                            1.8.3*91(0000000.0*kWh)
                            1.8.3*90(0000000.0*kWh)
                            1.8.3*89(0000000.0*kWh)
                            1.8.4(0000002.0*kWh)
                            1.8.4*03(0000002.0*kWh)
                            1.8.4*02(0000002.0*kWh)
                            1.8.4*01(0000002.0*kWh)
                            1.8.4*00(0000000.0*kWh)
                            1.8.4*99(0000000.0*kWh)
                            1.8.4*98(0000000.0*kWh)
                            1.8.4*97(0000000.0*kWh)
                            1.8.4*96(0000000.0*kWh)
                            1.8.4*95(0000000.0*kWh)
                            1.8.4*94(0000000.0*kWh)
                            1.8.4*93(0000000.0*kWh)
                            1.8.4*92(0000000.0*kWh)
                            1.8.4*91(0000000.0*kWh)
                            1.8.4*90(0000000.0*kWh)
                            1.8.4*89(0000000.0*kWh)
                            2.8.0(0000002.2*kWh)
                            2.8.0*03(0000002.2*kWh)
                            2.8.0*02(0000002.2*kWh)
                            2.8.0*01(0000002.2*kWh)
                            2.8.0*00(0000000.0*kWh)
                            2.8.0*99(0000000.0*kWh)
                            2.8.0*98(0000000.0*kWh)
                            2.8.0*97(0000000.0*kWh)
                            2.8.0*96(0000000.0*kWh)
                            2.8.0*95(0000000.0*kWh)
                            2.8.0*94(0000000.0*kWh)
                            2.8.0*93(0000000.0*kWh)
                            2.8.0*92(0000000.0*kWh)
                            2.8.0*91(0000000.0*kWh)
                            2.8.0*90(0000000.0*kWh)
                            2.8.0*89(0000000.0*kWh)
                            !
                            Jetzt schonmal Danke für einige Tips ... ich bin auch nicht zu faul für Google und co. falls jemand nen guten Ansatz hat.

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

                            Kommentar


                              #89
                              Zitat von JuMi2006 Beitrag anzeigen
                              I
                              300 Baud
                              Puh, wem da wohl mal wieder jemand das Hirn amputiert hat (vermutlich der BWL-Student wegen 20ct dem Techniker), ich mein jeder 8-Bit uC (1€) schafft auch ohne externen Quarz (30ct extra) 115kbit

                              300 Baud ist halt schon seeeeeeeeeeeeeeeehr laaaaaaaaaaaaaaaaaaaaaangsam, alte Handy surfen mit der 1000fachen Geschwindigkeit, aktuelle mit ein paar tausenderstellen mehr..

                              Egal.. wo liegt das Problem? Für ein Perl-Plugin sind solche schnarchzapfen nicht optimal aber geht (wenige davon), cronjob: besser, den Wert halt iwo hinschreiben und dann damit machen was man anstrebt..

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

                              Kommentar


                                #90
                                Zitat von JuMi2006 Beitrag anzeigen
                                Wie bekomme ich jetzt sauber die 1.8.0 (Zählerstand in kWh) separiert? Den Rest brauch ich eigentlich nicht wirklich. Trotz aller Bemühungen hab ich das mit Arrays immer noch nicht drauf, aber das wäre hier wohl von Vorteil.
                                Mit regulären Ausdrücken (regular expressions) kannst du einen Stringvergleich machen. Dein Zählerstand hat ja folgendes Format "1.8.0(0001715.0*kWh)", also machst du eine IF in deiner Schleife. Wenn $s den String "1.8.0(" enthält, dann muss es dein Zählerstand sein. Innerhalb der IF dann noch einen substr machen um nur die Zahl zu extrahieren und schon hast du deinen Zählerstand.

                                Hier mal etwas Lektüre für den Stringvergleich mit regulären Ausdrücken: Comparing values in perl

                                ALTERNATIV: Wenn der Zählerstand immer an der selben Stelle im Array steht kannst du auch gleich direkt auf den Index zugreifen, dann sparst du dir die Suche nach dem Textanfang. Wie man mit Arrays umgeht siehst du hier: Arrays in Perl - Besonderheiten

                                Da du aber immer schrittweise liest, wird das so nicht funktionieren. Du könntest dir aber eine Zählervariable einbauen. Sprich eine Variable die du vor der Schleife mit 0 initialisierst und in der Schleife bei jedem Durchgang um eins hochzählst. Bis sie den Wert hat, an dem dein Zählerstand stehen müsste (einfach abzählen in deiner Ausgabe). Hat sie den Wert erreicht hast du deinen Zählerstand in $s, diesen Speichern und den Zähler wieder zurückstellen (auf 0). Bei der nächsten Schleifenwiederholung wird dieser wieder hochgezählt bis er wieder den Wert erreicht hat usw.

                                Das sollten jetzt zumindestens mal einige Stichworte für eine Google Suche gewesen sein
                                Mit freundlichen Grüßen
                                Niko Will

                                Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                                - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                                Kommentar

                                Lädt...
                                X