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

    #31
    Die Wandler habe ich vom Chinesen und dort gerade ein Dateblatt angefragt.
    Bei IP-Symcom habe ich gelesen und auch auf Volkszähler.org, dass die EHZ andere Baudraten benutzen.
    Vermute mal, dass es mit dem USB-Wandler dann weniger was zum tun hat.

    Könntest Mal noch wegen dem
    my $abs_ls = "ff628201621e52ff69"; # Hex-Wert um den Beginn des abolsuten Standes zu kennzeichnen
    my $abs_rs = "01770700006001ff";# Hex-Wert um das Ende des abolsuten Standes zu kennzeichnen

    nachschauen?

    Danke und Grüße,
    Lio

    Kommentar


      #32
      eHZ mit SML hat 9600 8N1, eHZ pre-SML (OBIS?) hat 9600 7E1, da kommt aber zeilenweise ASCII raus und man braucht das ganze Decoding gar nicht

      Was soll ich mit den Werten nachgucken? Die kommen aus dem IP-Symcon Forum und funktionieren bei mir einwandfrei.

      Wenn man es "richtig" machen würde, würde man einen SMLRequest an den Zähler schicken und den SMLResponse auswerten. Da es aber noch keine Perl Libraries dafür gibt (nur C und Java) ist mir das zu aufwendig...

      Kommentar


        #33
        so, also der USB-Adapter kann alle gängigen Datenformate und Baudraten.


        hab' die Info gefunden
        Anfängerfrage zu Serial Port / Debug (eHZ auslesen) - Seite 3 - IP-Symcon Community Forum
        -werde mich zu dem Topic dann mal reinlesen und hoffentlich auch die andern Info mal zusammenstellen.

        Welcher kernel ist denn auf dem WG installiert?

        Lio

        Kommentar


          #34
          Hier mal das Log:

          [INFORMATION]011-12-08 21:23:45.412,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1362) line 30, <FILE> line 118590.

          2011-12-08 21:24:45.430,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1363) line 30, <FILE> line 118680.

          2011-12-08 21:25:45.752,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1364) line 30, <FILE> line 118770.

          2011-12-08 21:26:46.084,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1365) line 30, <FILE> line 118860.

          2011-12-08 21:27:46.882,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1366) line 30, <FILE> line 118950.

          2011-12-08 21:28:47.208,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1367) line 30, <FILE> line 119040.

          2011-12-08 21:29:47.529,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1368) line 30, <FILE> line 119130.

          2011-12-08 21:30:47.670,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1369) line 30, <FILE> line 119220.

          2011-12-08 21:31:47.997,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1370) line 30, <FILE> line 119310.

          2011-12-08 21:32:48.783,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1371) line 30, <FILE> line 119400.

          2011-12-08 21:33:49.105,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1372) line 30, <FILE> line 119490.

          2011-12-08 21:34:49.431,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1373) line 30, <FILE> line 119580.

          2011-12-08 21:35:49.728,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1374) line 30, <FILE> line 119670.

          2011-12-08 21:36:50.579,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1375) line 30, <FILE> line 119760.

          2011-12-08 21:37:50.960,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1376) line 30, <FILE> line 119850.

          2011-12-08 21:38:51.284,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1377) line 30, <FILE> line 119940.

          2011-12-08 21:39:51.613,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1378) line 30, <FILE> line 120030.

          2011-12-08 21:40:51.736,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1379) line 30, <FILE> line 120120.

          2011-12-08 21:41:52.058,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1380) line 30, <FILE> line 120210.

          2011-12-08 21:42:52.189,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1381) line 30, <FILE> line 120300.

          2011-12-08 21:43:04.390,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1382) line 28, <FILE> line 120388.

          2011-12-08 21:44:04.724,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1383) line 28, <FILE> line 120476.

          2011-12-08 21:45:05.065,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1384) line 28, <FILE> line 120564.

          2011-12-08 21:45:25.287,EHZ Zählerabfrage,,0s,Can't call method "databits" on an undefined value at (eval 1385) line 28, <FILE> line 120652.

          2011-12-08 21:46:26.088,EHZ Zählerabfrage,,0s,Can't call method

          "databits" on an undefined value at (eval 1386) line 28, <FILE> line 120740.

          [/INFORMATION]



          Stimmt die Zeile überhaupt bei Verwendung eines USB-TTL Konverters???
          use Device::SerialPort;

          Kommentar


            #35
            Zitat von ctr Beitrag anzeigen
            Um zu sehen ob überhaupt etwas ankommt könntest Du ja mal mit einem "cat" auf das USB-Device horchen (Achtung Bninäroutput, den Terminal zerlegt es eventuell) oder auch mit minicom (ohne Modeminit-Strings!)
            Hast Du das mal gemacht?

            Kommentar


              #36
              mit dem WG?
              kenn mich damit nicht aus,

              wo muss ich cat eingeben?

              Kommentar


                #37
                Zitat von lio123 Beitrag anzeigen
                Welcher kernel ist denn auf dem WG installiert?
                2.6.32 für gewöhnlich, alle halbwegs handelsüblichen USB-Seriell werden unterstützt (aber auch mit dem "alten" 2.6.26)
                Aber zwei Hinweise: Es gibt von den China-Dingern mal so gefühlte 30% die einfach garnicht gehen, egal mit welchem OS/Kernel, ich spreche da aus Erfahrung

                Und tut euch einen gefallen: lasst das mit dem Device::Serialport im Plugin/Perl, schleift das über den socat (Seriell/Socketverbindungen, siehe Plugins für CUL/CUN, DMX etc.)
                Immer seriell->socat->UDP->Plugin, das spart eine Menge hässliche Details beim handling..

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

                Kommentar


                  #38
                  hab ja 3 Stück da! Also müsste einer gehen!
                  Treiber ist in dem Kernel dafür zumindest schon enthalten.

                  Jaa, lese mich da mal rein mit Deinem Socat.
                  'Musst mir aber sagen,was ich dann dafür aus dem script ergänzen/weglassen muss.

                  Wozu wird im Editor oben eine Gruppenadresse ausgwählt?
                  Dazu steht in der Hilfe nichts.

                  Danke und Grüße,
                  Lio

                  Kommentar


                    #39
                    Ja ich hatte sowieso geplant das auf socat umzuschreiben, aber wichtiger finde ich erstmal native SML Commands.
                    Bei mir gibt es seriell null Probleme (mit 3 Zählern und des RS232-USB-Wandlern die bei den Opto-Köpfen dabei waren), dafür eben mit der Tatsache, dass die "passiven" SML Nachrichten nur bei Last übertragen werden...

                    @lio: Von Deinen Fehlermeldungen her sehe ich die Problematik eine Stufe vor dem Plugin, also irgendwo auf seriell/USB Ebene, da läßt sich remote schwer helfen und einem Linux-Anfänger zu empfehlen eine Root-SSH-Session aufs WG zu machen möchte ich dann auch nicht...

                    Kommentar


                      #40
                      [QUOTE=ctr;195241]dafür eben mit der Tatsache, dass die "passiven" SML Nachrichten nur bei Last übertragen werden...
                      QUOTE]

                      Kann dein OKK kein "Senden"?

                      Werde heute abend mal die USB taschen und per HyT die Funktion sicherzustellen.

                      Lio

                      Kommentar


                        #41
                        Doch kann er, nur "ich" kann es nicht, weil die Syntax dafür alles andere als trivial ist...

                        Kommentar


                          #42
                          Hallo,

                          melde mich nun mal zurück.
                          Der Zähler spuckt nun SML aus.
                          Die Nachricht ist anders aufgebaut als bei HAger, dies erfordert eine Anpassung von Beginn/ENde eines Wertes.
                          Diese Werte habe ich nun angepasst.
                          1.) Hardware funktioniert 100%
                          2.) SML liegt vor
                          3.) Leider output "Waited 10 seconds and got no SML message"

                          Mit 20 Sekunden gibt es eine Plugin-Timeout fehler

                          Das Programm steht also im ersten Abschnitt.
                          Daten müssten ja ankommen, gibt es eine Möglichkeit das als debugging zu überprüfen?


                          [INFORMATION]
                          # Monitoring a eHz Reader (SML)
                          # v0.1
                          # License: GPL v2
                          # basierend auf Untersuchungen hier: Mein Stromzähler geht in Rente!! Und nun? - IP-Symcon Community Forum

                          use Device::SerialPort;
                          use strict;

                          my @reader;
                          my @GA_MeterReading;
                          my @GA_ActivePower;
                          $reader[0] = Device::SerialPort->new("/dev/usbserial-1-4"); # USB Device erster Reader/Zähler
                          $GA_MeterReading[0] = "0/0/1"; # GA für Wert (Zählerstand) erster Zähler



                          my $abs_ls = "FF63018201621E52FF56"; # Hex-Wert um den Beginn des abolsuten Standes zu kennzeichnen
                          my $abs_rs = "01770700006001ff";# Hex-Wert um das Ende des abolsuten Standes zu kennzeichnen

                          my $glob_timeout=10; # Timeout, vermutlich zu hoch für WG

                          sub readSML
                          {
                          my $port = $_[0];
                          my $ls = $_[1];
                          my $rs = $_[2];
                          $port->databits(8);
                          $port->baudrate(9600);
                          $port->parity("none");
                          $port->stopbits(1);
                          $port->purge_all();
                          $port->rts_active(0);
                          $port->dtr_active(1);
                          $port->read_char_time(0); # don't wait for each character
                          $port->read_const_time(1000); # 1 second per unfulfilled "read" call
                          my $abs=0;
                          my $chars=0;
                          my $buffer="";
                          my $timeout=$glob_timeout;


                          while ($timeout>0) {
                          my ($count,$saw)=$port->read(1); # will read _up to_ 255 chars
                          if ($count > 0) {
                          $chars+=$count;
                          $buffer.=sprintf("%02x",unpack("C",$saw));
                          $buffer =~ /$ls(.*?)$rs/;
                          $abs = hex($1)/10000;
                          if ($abs != 0) {
                          return $abs;
                          }
                          }
                          else {
                          $timeout--;
                          }
                          }

                          if ($timeout==0) {
                          die "Waited $glob_timeout seconds and got no SML message\n";
                          }
                          }

                          $plugin_info{$plugname.'_cycle'} = 60;

                          for my $i (0 .. $#reader) {

                          my $MeterReading = -1;
                          my $ActivePower = -1;
                          $MeterReading = &readSML($reader[$i],$abs_ls,$abs_rs);


                          if ($MeterReading != -1) {
                          update_rrd("MeterReading_$i","",$MeterReading);
                          if ($GA_MeterReading[$i]) {
                          knx_write( $GA_MeterReading[0] , $MeterReading, 9 );
                          }
                          }

                          }



                          return 0;[/INFORMATION]

                          wie macht man da scrollbalken dran?

                          Kommentar


                            #43
                            Auf die Gefahr hin mich zu wiederholen: Das wird so IMHO nichts!

                            - ein Plugin darf schlicht nicht rumbummeln, auf Bytes warten, sleepen o.ä.
                            - das serielle Porthandling ist im Detail eklig mit restarts, disconnects etc.pp.
                            -> Daher am besten erstmal das Modell wie bei den anderen Plugin, die ähnliches tun:
                            Seriell<->socat<->UDP<->Plugin

                            Das Plugin wird durch plugin_socket_subscribe dann automatisch aufgerufen, wenn Daten am Port anliegen. Man muss dann noch sehen, ob man es hinbekommt, komplette Telegramme vom socat zu bekommen; Stichwort eol= (Datensatz/Zeilen Anfangs-/End-kennungszeichen soweit vorhanden)

                            siehe z.B. Atmolight (einfach)
                            CUL/CUN (eher komplex)
                            Denon,RFID (read-only)

                            Zur letzten Frage: Code

                            Anbei noch ein paar zugehörige socat-Beispiele

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

                            Kommentar


                              #44
                              isch hab' da heut' middasch schu ma geguckt
                              un heut' abnd werd's isch mal probiere

                              und Du bist guter Hoffnung, dass es daran liegt?

                              EOL_ das letzt h-Zeichen ist immer unterschiedlich
                              die ca 4 h-Zeichen davor immer gleich und immer an der selben stelle.

                              Funktioniert der restliche PERL dann so wie er da geschrieben steht?

                              Kommentar


                                #45
                                my ($count,$saw)=$port->read(1); # will read _up to_ 255 chars
                                if ($count > 0) {
                                $chars+=$count;
                                $buffer.=sprintf("%02x",unpack("C",$saw));
                                $buffer =~ /$ls(.*?)$rs/;
                                $abs = hex($1)/10000;
                                if ($abs != 0) {
                                return $abs;

                                das heisst doch nur sovie wie:

                                mach den Mund 255 Zeichen lang auf und schreib es in den buffer???

                                kann sein, dass was mit der Umwandlung nicht stimmt:
                                $buffer.=sprintf("%02x",unpack("C",$saw));
                                $buffer =~ /$ls(.*?)$rs/;

                                Kommentar

                                Lädt...
                                X