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

    Zitat von XueSheng Beitrag anzeigen
    meinen Laptop mit Ubuntu 12.10 bemüht. Mir ist noch nicht ganz klar, warum ich damit nicht weitergekommen bin.
    Weil die Kernel-Version von Ubuntu 12.10 < 3.3-rc2 ist.

    Gruß
    Udo

    Edit: Asche auf mein Haupt... Du hast Recht. 12.10 hat schon Kernel 3.5.4 und höher.
    Warum es dann nicht funktioniert hat? Keine Ahnung.

    Kommentar


      Das kommt davon, wenn man zu faul ist mal eben die Kernel Version zu prüfen. Irgendwie hatte ich im Hinterkopf, dass Ubuntu 12.10 einen neueren Kernel verwendet.

      Makki hatte mir gestern noch einen neuen Kernel für das Wiregate aufgespielt. Danach funktionierte die Kommunikation mit dem Schreib-Lese-Kopf ohne Probleme!

      Nochmals Danke für die schnelle Hilfe!

      Kommentar


        Hallo,

        leider kann ich noch nicht berichten, hatte (habe?) wohl probleme mit dem USB-Wandler. Nun habe ich einen neuen und werde testen.

        Ein erster Zwischenerfolg:
        Den gleichen Zähler, nämlich EMH-EHZ-H benutze ich für die Wärmepumpe mit 2 Tarifen. Irgendwie gab's da wohl ein Sichtproblem zwischen Zähler und Lesekopf, wie sich eher zufällig herausstelle.

        Aber nun:
        Mirko, dazu bräuchte ich ausser den OBIS
        #0701000F0700FF = 7.0 FIXME !!! [0F]0700
        #070100010801FF = 1.8.1
        noch die
        #070100010802FF = 1.8.2
        #070100010800FF = ???

        Ist das was größeres?
        Leider verstehe ich nicht ganz, wie Du da vorgehst.
        Die Hex-Obis sind ja im skript nur kommentiert.


        Danke und GRüße,
        Lio

        Kommentar


          Eigentlich ist es ganz einfach. Auch bei SML wird der s.g. OBIS-Code verwendet.
          Im SVN hab ich den Link zu Wikipedia hinterlegt das wiederum auf ein die Erklärung der Codes verweist.

          Beispiel:

          1.8.0 = Gesamtbezug über alle Tarife
          1.8.1 = Bezug Tarif 1
          1.8.2 = Bezug Tarif 2
          usw.
          2.8.0 = Einspeisung über alle Tarife
          2.8.1 = Einspeisung Tarif 1
          usw.
          Dann gibt es noch diverse andere Codes für Leistung, Spannung pro Phase usw. hier ist es jedoch vom EVU/Messstellenbetreiber abhängig welche Werte der Zähler liefert. Das EVU bestellt die Zähler meist vorkonfiguriert beim Hersteller.

          Im SML Protokoll werden diese Codes nun auch verwendet, das zeigt der Kommentar im Plugin:

          #070100010801FF = 1.8.1


          Das FIXME! bezieht sich auf einen Wert den ich bei Dir keinem Obis-Code zuordnen konnte. Da würde es nur helfen das mit mehreren Zählern zu vergleichen...bleibt also als Aufgabe für zukünftige Nutzer ... "0F" ist dort irgendwie nicht nachvollziehbar.

          So jetzt zum eigentlichen Problem:
          Die Werte die Du auslesen willst trägst Du hier ein:

          Code:
          my @obis;
          push @obis,{obis=>"1.8.0",  fact=>10000, ga =>"14/8/1", dpt => 14, rrd_name => "Zaehler_Verbrauch", rrd => "c"   }; #rrd: c=counter ; g=gauge
          push @obis,{obis=>"7.0",    fact=>10,    ga =>"14/8/0", dpt => 9 , rrd_name => "Zaehler_Leistung",  rrd => "g" };
          #neuer Wert
          push @obis,{obis=>"1.8.1",    fact=>10,    ga =>"14/8/2", dpt => 14 , rrd_name => "Zaehler_Leistung",  rrd => "c" };
          #usw.
          Zählerstände haben hier immer den DPT14 und c=counter.
          Ein Momentanwert (Leistung,Spannung etc.) bekommt DPT9 g=gauge
          Den Faktor muss man ausprobieren ... das hab ich nun nicht implementiert ... so tief wollte ich mich nicht in SML einlesen.


          Grüße
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            Hallo,

            danke Mirko,
            sowas hatte ich mir schon gedacht.

            Leider gibt es bzgl des Test schlechte neuigkeiten.
            Datt ding will einfach nich.
            Hab mir anstelle des PL2303 Wandler einen FTDI FT232R Wandler getauscht.
            Dem neuen Wandler wird nun auch ein Namen (/dev/usbserial-A601NKCL) im WG zugewiesen (udev??)
            Das hat Makki erwirkt. Beim PL2303 war dies danach nicht der Fall.

            Jedoch nach ca 3h ist das WG mit dem neuen Wandler auch nicht mehr erreichbar. Da hilft nur ein Spannung abschalten.

            Ich werde nun mal den cornjob deaktivieren und den Wandler aber stecken lassen. Mal gucken was passiert.

            Mirko,
            könntest Du mir noch diese Zeile erklären (aufruf cornjob)

            /usr/bin/perl /home/user/sml.pl das hier: >/dev/null 2>&1

            Kommentar


              Das sorgt dafür dass keine Nachricht an root geschickt wird.
              Falls ein aktiver email-Dienst im WireGate hinterlegt ist würde Dir das Wiregate sonst jedes mal die Ausgabe per Mail schicken
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                Hallo Mirko,

                das beruhigt.
                Als nachdem der Wandler nun lange am WG ohne Nutzung ist und das System läuft, kanns nun mehr nur an Cron, dem skript oder irgendwas mit usb liegen.

                GRüße,
                lio

                Kommentar


                  Hallo lio, hallo Mirko,

                  ich habe ein ähnliches Verhalten. Mein raspberry hängt sich nach ca 4 bis 5 Stunden Scriptlaufzeit einfach auf. Ich hab jetzt schon verschiedenste Sachen getestet:
                  - Skript darf nur einfach laufen (siehe vorherige Post)
                  - hab parallel Logging mitlaufen lassen ob die Last nach oben geht - Fehlanzeige, steht auf einmal
                  - gleiches für den Speicher - ebenso Fehlanzeige,.

                  Momentan vermute ich, dass es an der tty-Behandlung im Perl liegt, da der Rapsi mit vzlogger und dem gleichen Lesekopf tagelang problemlos läuft.

                  Ich habe jetzt das Perlscript so verändert, das es als Schleife alle 20 Sekunden die tty liest und die Daten ausgibt ohne den Port zu schließen. Ist quasi ein Daemon geworden.
                  Der Test läuft seit heute - ich werde berichten.

                  Grüße
                  Gunnar

                  Kommentar


                    Hallo Gunnar,

                    mangels eigenen SML-Zählers kann da natürlich was im Argen sein. Die Fehlerbehandlung war ja auch nicht implementiert.

                    Perl + Serielle + Ich sind über Device::SerialPort auch nie richtig Freunde geworden. Generell ist das sehr "gewöhnungsbedürftig" ich hatte mal 3 (drei!) Alix1D die beim gleichen Script anders reagierten (bis hin zum wegfliegen des USB).
                    Versuch das ganze vielleicht mal so umzustellen wie hier:
                    SourceForge.net Repository - [openautomation] Contents of /tools/d0-IEC62056-meter/iec62056-meter.pl
                    Ab Zeile 66 bzw. 86 wircd das ganze über "echo socat" gelöst ...

                    Die Device::SerialPort Geschichte würde ich in Perl als "broken" bezeichnen. Damit habe ich schon Tage verbracht.

                    @Lio:
                    Ich vermute da USB-Probleme ... will aber auch nicht ausschließen dass das Script irgendwo mal ins leere läuft.
                    Umgezogen? Ja! ... Fertig? Nein!
                    Baustelle 2.0 !

                    Kommentar


                      Gute Idee, Script läuft momentan immer noch vor sich hin.
                      Hab parallel mal socat am zweiten Kopf getestet. Sieht erst mal ganz gut aus:

                      socat -T 3 - /dev/ttyUSB1,echo=0,b9600,raw,parenb=1,parodd=0,cstopb= 1|od -tx1
                      0000000 1b 1b 1b 1b 01 01 01 01 76 07 00 11 02 1e 3d f0
                      0000020 62 00 62 00 72 63 01 01 76 01 01 07 00 11 02 4a
                      0000040 bf 50 09 04 03 9f c8 de 58 74 8a 01 01 63 02 9c
                      0000060 00 76 07 00 11 02 1e 3d f1 62 00 62 00 72 63 07
                      0000100 01 77 01 09 04 03 9f c8 de 58 74 8a 01 72 62 01
                      0000120 65 02 4a c3 7d 79 77 07 81 81 c7 82 03 ff 01 01
                      0000140 01 01 04 45 4d 48 01 77 07 01 00 00 00 09 ff 01
                      0000160 01 01 01 09 04 03 9f c8 de 58 74 8a 01 77 07 01
                      0000200 00 01 08 00 ff 63 01 82 01 62 1e 52 ff 56 00 05
                      0000220 5b 5b 31 01 77 07 01 00 02 08 00 ff 63 01 82 01
                      0000240 62 1e 52 ff 56 00 00 00 12 2b 01 77 07 01 00 01
                      0000260 08 01 ff 01 01 62 1e 52 ff 56 00 03 8b 14 0a 01
                      0000300 77 07 01 00 02 08 01 ff 01 01 62 1e 52 ff 56 00
                      0000320 00 00 12 2b 01 77 07 01 00 01 08 02 ff 01 01 62
                      0000340 1e 52 ff 56 00 01 d0 47 27 01 77 07 01 00 0f 07
                      0000360 00 ff 01 01 62 1b 52 ff 55 00 00 04 dc 01 77 07
                      0000400 81 81 c7 82 05 ff 01 01 01 01 83 02 0a 0f 92 fd
                      0000420 55 eb ea 0c 21 66 9f fd db 2e c7 9d dd 97 94 d3
                      0000440 82 3a 3d 43 aa fa f4 f3 8b d8 91 6a 1e 15 f3 a4
                      0000460 a0 44 b7 5d 77 e7 cc c7 be f5 1d 2b 01 01 01 63
                      0000500 c4 c5 00 76 07 00 11 02 1e 3d f4 62 00 6

                      Muss mich dann nur mal an der Auswertung im Perl versuchen.

                      Grüße
                      Gunnar

                      Kommentar


                        Die Auswertung ist ja schon gemacht
                        Du musst lediglich einen Datensatz rausfiltern ...
                        Umgezogen? Ja! ... Fertig? Nein!
                        Baustelle 2.0 !

                        Kommentar


                          klar, die Arbeit hast Du ja schon gemacht :-)
                          socat tut schonmal - auch einiges fixer als Perl. Der Rest dann morgen (hoffentlich).

                          Hier mal der Aufruf:
                          socat -T 3 - /dev/ttyUSB1,echo=0,b9600,raw,parenb=1,parodd=0,cstopb= 1,readbytes=512|od -x|cut -c 9-|sed 's/ //g'
                          1b1b1b1b01010101077611001e025abe
                          00620062637201010176070111004a02
                          1eea04099f03dec87458018a6301b73c
                          760000070211be1e625b620072000763
                          770109010304c89f58de8a7472010162
                          0265e94a79b10777818182c7ff030101
                          01014504484d770101070000090001ff
                          010109010304c89f58de8a7477010107
                          0100000863ff82016201521e56ff0500
                          f45b0172077700010802ff0001630182
                          1e62ff52005600002b12770101070100
                          010801ff6201521e56ff0300ad8b014b
                          077700010802ff0101011e62ff520056
                          00002b12770101070100020801ff6201
                          521e56ff010047d0012707770001070f
                          ff0001011b62ff5200557100019d0777
                          818182c7ff050101010102830f0afd92
                          eb550cea6621fd9f2edb9dc797ddd394
                          3a82433dfaaaf3f4d88b6a91151ea4f3
                          44a05db7e777c7ccf5be2b1d01016301
                          29a4760000070211be1e625e62007200
                          0263710163010b2e000000001b1b1b1b
                          031a528d1b1b1b1b0101010107761100
                          1e0260be006200626372010101760701
                          11004a0220ea04099f03dec87458018a
                          6301eb2c760000070211be1e62616200
                          72000763770109010304c89f58de8a74
                          720101620265e94a79b30777818182c7
                          ff03010101014504484d770101070000
                          090001ff010109010304c89f58de8a74
                          770101070100000863ff82016201521e
                          56ff0500f45b017e077700010802ff00

                          Kommentar


                            Hi Gunnar,

                            nur um dem richtigen Faden zu folgen...
                            ...geht es bei Dir ebenso ums das SML-Skript von Mirko, mit den selben Ursachen?

                            Danke und Gruß,
                            Lio

                            Kommentar


                              Hi Lio,

                              ja, ist immer noch das gleiche Thema. Ich möchte meinen ED300L auslesen, der spricht ja SML.
                              Das neue Script scheint das Problem zu lösen, hat die ganze Nacht anstandslos Daten geliefert. Ich mach das mal schick, dann stell ich es hier ein.

                              Grüße
                              Gunnar

                              Kommentar


                                Hi,

                                das angepasste Perl-Script hat quasi 24 Stunden überstanden. Hier der geänderte Code:

                                Code:
                                #!/usr/bin/perl
                                
                                use warnings;
                                use strict;
                                use Device::SerialPort;
                                use feature "switch";
                                use EIBConnection;
                                use RRDs;
                                use Fcntl qw(:DEFAULT :flock);
                                
                                
                                #0701000F0700FF = 7.0       FIXME !!! [0F]0700
                                #070100010801FF = 1.8.1
                                #070100010800FF = 1.8.1
                                
                                # Lock setzen damit Skript nur einmal startet
                                
                                
                                  open  *{0}
                                        or die "What!? $0:$!";
                                  flock *{0}, LOCK_EX|LOCK_NB
                                    or die "$0 is already running somewhere!\n";
                                
                                
                                my $eib_url = "ip:rk_nas";     #for local eibd "local:/tmp/eib" for eibd in LAN: "ip:192.168.2.220:6720"
                                my $device = "/dev/ttyUSB0";
                                my $repeat = 20;   # Wiederholung alle x Sekunden
                                my $rrdpath = "/var/www/rrd";
                                my $debug = 0;
                                
                                my @obis;
                                
                                push @obis,{obis=>"1.8.2",  fact=>10000, ga =>"5/5/5", dpt => 14, rrd_name => "Zaehlerstand", rrd => "c"   }; #rrd: c=counter ; g=gauge
                                # Workaround fuer 15.7.0 - aktuellen Verbrauch
                                push @obis,{obis=>"F.7.0",    fact=>10,    ga =>"5/5/6", dpt => 14 , rrd_name => "Zaehler_Leistung",  rrd => "g" };
                                
                                
                                my @countermodes = (5,15,60,1440);    #Aufloesungen fuer COUNTER RRDs in Minuten (1440 = Tagesverbrauch)
                                
                                
                                my $port = Device::SerialPort->new($device) || die $!;
                                
                                $port->databits(8) || die "failed setting databits";
                                $port->baudrate(9600) || die "failed setting baudrate";
                                $port->parity("none") || die "failed setting parity";
                                $port->stopbits(1);
                                $port->handshake("none");
                                $port->dtr_active(0);
                                $port->purge_all();
                                $port->read_char_time(0);     # don't wait for each character
                                $port->read_const_time(4000); # 1 second per unfulfilled "read" call
                                $port->write_settings || die "cannot write settings";
                                
                                
                                # Loop zum Datenempfang
                                
                                my $error=0;
                                
                                while ($error != 1)
                                {
                                
                                   my ($x,$data) = 0 ;
                                   my $sml = 0;
                                   my $start = 0;
                                   my $value = 0;
                                   my $dec_value = 0;
                                   my $count = 0;
                                   my $saw = 0;
                                
                                   if ($debug == 1) {print "Step 1 - Daten holen \n";}
                                
                                   while ($start < 2)  # wait for second 1B1B1B1B01010101
                                     {
                                      ($count,$saw)=$port->read(512);   # will read 512 chars
                                      if ($count == 512)       # wurden 512 chars gelesen ?
                                        {
                                         $x = uc(unpack('H*',$saw)); # nach hex wandeln
                                         $data .= $x;
                                         if ($data =~ /1B1B1B1B01010101/)  {$start ++};
                                        } # if
                                     }  # while
                                
                                   if ($debug==1) {print "Step 2 - Reg Exp 1 Datensatz zusammensetzen \n";}
                                   $data =~ m/1B1B1B1B01010101(.*?)B1B1B1/;
                                   $sml = $1;
                                
                                   print "Zaehler Haushalt: \n";
                                
                                   if ($debug==1) {print "Step 3 - Datensatz auswerten \n";}
                                
                                   foreach my $obiscnt (@obis)
                                    {
                                     # Umwandeln OBIS in HEx-Wert
                                     my $obissearch = $obiscnt->{obis};
                                     $obissearch =~ s/\./0/g;
                                     # FF fuer Suche an  Hex-Wert anhaegne
                                     $obissearch .="FF";
                                     if ($debug==1) { print $obissearch."     Obis\n";}
                                     $sml =~ m/$obiscnt->{obis}(.*?)0177/;
                                     my $sml_val = $1;
                                
                                     if ($debug==1)  {  print $1." contains hex \n";}
                                
                                     #extract value
                                     $sml_val =~ s/^.*52FF//;
                                     $sml_val = substr($sml_val,2);
                                     if ($debug == 1) {  print $sml_val." hex \n";}
                                     $value = $sml_val;
                                
                                     $dec_value = sprintf("%d", hex($value));
                                     $dec_value /= $obiscnt->{fact};
                                     print $dec_value."<<<<---- Wert\n";
                                
                                     #  RRD-Graphen erstellen  - bei Bedarf wieder aktiv setzen
                                     #if ($obis->{rrd} eq "c")
                                     #   {
                                     #   &rrd_counter ($obis->{rrd_name},$dec_value)
                                     #   }
                                     #if ($obis->{rrd} eq "g")
                                     #   {
                                     #   &rrd_gauge ($obis->{rrd_name},$dec_value)
                                     #   }
                                
                                     &knx_write ($obiscnt->{ga},$dec_value,$obiscnt->{dpt});
                                     if ($debug == 1) {print "GA:".$obiscnt->{ga}." Wert:".$dec_value." DPT:".$obiscnt->{dpt}."\n";}
                                
                                    } # foreach
                                
                                    sleep $repeat;
                                
                                } # while
                                
                                $port->close() || warn "Serial port did not close proper!\n";
                                undef $port;
                                
                                ### SUBS ###
                                
                                sub rrd_counter {}  # wie gehabt
                                sub rrd_gauge {}  # wie gehabt
                                sub knx_write {}  # wie gehabt

                                Kommentar

                                Lädt...
                                X