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

  • JuMi2006
    antwortet
    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

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • lio123
    antwortet
    mein fehler-falscher Port

    ..putty läuft nun auch..

    ..und nun?

    Einen Kommentar schreiben:


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

    Makki

    Einen Kommentar schreiben:


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


    Grüße,
    Lio

    Einen Kommentar schreiben:


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

    @NetFritz: ist drin

    Makki

    Einen Kommentar schreiben:


  • lio123
    antwortet
    knirsch-

    was ist und wie komme ich zur KONSOLE?

    sorry,
    Lio

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    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

    Einen Kommentar schreiben:


  • lio123
    antwortet
    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

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    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

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    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

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    Hallo
    Ich werde es noch ein paar Tage Testen, dann kann ich es ja veröffentlichen.
    Gruß NetFritz

    Einen Kommentar schreiben:


  • lio123
    antwortet
    ja ich zum Beispiel-habe leider immer noch keine Lösung, bzw Erfahrung das anzugehen und umzusetzen.
    Wäre über hilfen dankbar.

    Grüße,
    Lio

    Einen Kommentar schreiben:


  • makki
    antwortet
    So ähnlich hätte ich das auch vorgeschlagen..

    Zitat von NetFritz Beitrag anzeigen
    Die Augenblickliche Leistung wird alle 2sek. in die rrd und die SQLite DB geschrieben.
    Das arme Ding naja kann jeder machen wie er mag

    Das ganze wäre evtl. für andere auch interessant, geht sonst evtl. wieder unter und der nächste sucht sichs wieder zusammen, es gibt im OA-SVN auch einen "Tools"-Ordner (sofern einmalig/keine Lust auf SVN kann ichs auch gern reinschieben..)

    Makki

    Einen Kommentar schreiben:

Lädt...
X