Ankündigung

Einklappen
Keine Ankündigung bisher.

Seriell -> USB -> socat -> Wiregate-Plugin

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Seriell -> USB -> socat -> Wiregate-Plugin

    Hallo,
    ich verzweifle gerade daran, Daten von einem USB-Adapter in ein Plugin zu bekommen.
    Habe schon so viel probiert und zusammenkopiert, vielleicht kann jemand schnell drüberschauen, komme einfach nicht weiter.

    Ich bekomme von meinem Stromzähler 316 Bytes an Daten (INFO) (unter Windows / hterm geht das ganz gut).

    Mit cat /dev/ttyUSB0 | od -x sehe ich die gleichen Daten, aber mit
    socat - /dev/ttyUSB0,echo=0,crnl,b9600 | od -x sind schon weniger als die 316 Bytes und vorallem unregelmäßig viele. Hier verstehe ich schon nicht wieso.

    Im Plugin sieht das so aus:
    Code:
    my $socknum = 20; # Eindeutige Nummer des Sockets +1
    
    my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $send_port = "50011"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    my $recv_port = "50010"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    
    if (!$socket[$socknum]) { # socket erstellen
            $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                      Proto => "udp",
                                      LocalAddr => $recv_ip,
                                      PeerPort  => $send_port,
                                      PeerAddr  => $send_ip,
                                      ReuseAddr => 1
                                       )
        or return ("open of $recv_ip : $recv_port failed: $!");
    
        $socksel->add($socket[$socknum]); # add socket to select
    
        $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
        return "opened Socket $socknum";
        plugin_log($plugname,'Soket verbunden. Soketnummer: ' . $socknum);
    } elsif ($fh) { # Readline from USBSERIAL 
        
    
        my $line;
        $line = <$fh>;
        
        #chomp($line);
    
        #if (!$line) { # catch empty line
        #  return;
        #}
        
        
        #plugin_log($plugname,"line: $line");
        my $len = length($line);
        plugin_log($plugname,"len: $len");
        my $bufhex = $line;
        $bufhex =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
        plugin_log($plugname,"hex: $bufhex");
        
    return;
    }
    Ist alles aus verschiedenen Plugins zusammenkopiert.
    Mal kommen hier nur 21 Bytes an, mal 1137, mal 1863 - völlig zufällig.

    Es gibt ja schon ein Plugin für den Stromzähler, aber wie ich gesehen habe, keines mit Sockets.
    Angehängte Dateien
    Wiregate #288

    #2
    Versuche mal

    socat -t1 - /dev/ttyUSB0,echo=0,crnl,b9600 | od -x

    Das -t1 verlängert das timeout von default 0,5 Sekunden auf 1 Sekunde, vielleicht hängt es damit zusammen. Ich hatte mit dem socat auch so einige Kämpfe.

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

    Kommentar


      #3
      Danke JuMi2006, das hat zumindest zum Teil was gebracht.

      Hier nochmal die Ausgabe von cat /dev/ttyUSB0 | od -tx1 (besser, da sonst MSB und LSB vertauscht sind)

      Code:
      0000000 [COLOR=Lime]1b 1b 1b 1b 01 01 01 01[/COLOR] 76 07 00 11 03 ff f0 de
      0000020 62 00 62 00 72 63 01 01 76 01 01 07 00 11 02 57
      0000040 50 4a 0b 06 45 4d 48 01 02 71 53 ea 4e 01 01 63
      0000060 6e d9 00 76 07 00 11 03 ff f0 df 62 00 62 00 72
      0000100 63 07 01 77 01 0b 06 45 4d 48 01 02 71 53 ea 4e
      0000120 01 72 62 01 65 02 57 e9 41 77 77 07 81 81 c7 82
      0000140 03 ff 01 01 01 01 04 45 4d 48 01 77 07 01 00 00
      0000160 00 09 ff 01 01 01 01 0b 06 45 4d 48 01 02 71 53
      0000200 ea 4e 01 77 07 01 00 01 08 00 ff 63 01 82 01 62
      0000220 1e 52 ff 56 [COLOR=Blue]00 [/COLOR][COLOR=Blue]02 9c 5d ab[/COLOR] 01 77 07 01 00 01 08
      0000240 01 ff 01 01 62 1e 52 ff 56 [COLOR=Blue]00 02 9c 5d ab[/COLOR] 01 77
      0000260 07 01 00 01 08 02 ff 01 01 62 1e 52 ff 56 00 00
      0000300 00 00 00 01 77 07 01 00 0f 07 00 ff 01 01 62 1b
      0000320 52 ff 55 [COLOR=Red]00 00 14 13[/COLOR] 01 77 07 81 81 c7 82 05 ff
      0000340 01 01 01 01 83 02 a7 ac a6 32 b9 4e 77 a2 64 19
      0000360 af 06 79 59 61 39 c8 75 9e 60 14 5e bf 86 af ed
      0000400 58 f3 ce fb f0 cf 54 38 a5 bb 04 bf 16 d5 c5 cb
      0000420 80 0e cb 66 35 42 01 01 01 63 5d a1 00 76 07 00
      0000440 11 03 ff f0 e2 62 00 62 00 72 63 02 01 71 01 63
      0000460 50 d9 [B][COLOR=SeaGreen]00 00 1b 1b 1b 1b [/COLOR][COLOR=SeaGreen]1a 01 [I]fa 17[/I][/COLOR][/B] 1b 1b 1b 1b
      0000500 01 01 01 01 76 07 00 11 03 ff f0 e4 62 00 62 00
      0000520 72 63 01 01 76 01 01 07 00 11 02 57 50 4c 0b 06
      0000540 45 4d 48 01 02 71 53 ea 4e 01 01 63 1d 48 00 76
      0000560 07 00 11 03 ff f0 e5 62 00 62 00 72 63 07 01 77
      0000600 01 0b 06 45 4d 48 01 02 71 53 ea 4e 01 72 62 01
      0000620 65 02 57 e9 43 77 77 07 81 81 c7 82 03 ff 01 01
      0000640 01 01 04 45 4d 48 01 77 07 01 00 00 00 09 ff 01
      0000660 01 01 01 0b 06 45 4d 48 01 02 71 53 ea 4e 01 77
      0000700 07 01 00 01 08 00 ff 63 01 82 01 62 1e 52 ff 56
      0000720 00 02 9c 5d ad 01 77 07 01 00 01 08 01 ff 01 01
      0000740 62 1e 52 ff 56 00 02 9c 5d ad 01 77 07 01 00 01
      0000760 08 02 ff 01 01 62 1e 52 ff 56 00 00 00 00 00 01
      0001000 77 07 01 00 0f 07 00 ff 01 01 62 1b 52 ff 55 [COLOR=Red]00[/COLOR]
      0001020 [COLOR=Red]00 14 24[/COLOR] 01 77 07 81 81 c7 82 05 ff 01 01 01 01
      0001040 83 02 a7 ac a6 32 b9 4e 77 a2 64 19 af 06 79 59
      0001060 61 39 c8 75 9e 60 14 5e bf 86 af ed 58 f3 ce fb
      0001100 f0 cf 54 38 a5 bb 04 bf 16 d5 c5 cb 80 0e cb 66
      0001120 35 42 01 01 01 63 4e e8 00 76 07 00 11 03 ff f0
      0001140 e8 62 00 62 00 72 63 02 01 71 01 63 d8 ce 00 00
      0001160 1b 1b 1b 1b 1a 01 8f fb 1b 1b 1b 1b 01 01 01 01
      0001200 76 07 00 11 03 ff f0 ea 62 00 62 00 72 63 01 01
      0001220 76 01 01 07 00 11 02 57 50 4e 0b 06 45 4d 48 01
      0001240 02 71 53 ea 4e 01 01 63 b7 2d 00 76 07 00 11 03
      0001260 ff f0 eb 62 00 62 00 72 63 07 01 77 01 0b 06 45
      0001300 4d 48 01 02 71 53 ea 4e 01 72 62 01 65 02 57 e9
      0001320 44 77 77 07 81 81 c7 82 03 ff 01 01 01 01 04 45
      0001340 4d 48 01 77 07 01 00 00 00 09 ff 01 01 01 01 0b
      0001360 06 45 4d 48 01 02 71 53 ea 4e 01 77 07 01 00 01
      0001400 08 00 ff 63 01 82 01 62 1e 52 ff 56 00 02 9c 5d
      0001420 af 01 77 07 01 00 01 08 01 ff 01 01 62 1e 52 ff
      0001440 56 00 02 9c 5d af 01 77 07 01 00 01 08 02 ff 01
      0001460 01 62 1e 52 ff 56 00 00 00 00 00 01 77 07 01 00
      0001500 0f 07 00 ff 01 01 62 1b 52 ff 55 00 00 14 22 01
      0001520 77 07 81 81 c7 82 05 ff 01 01 01 01 83 02 a7 ac
      0001540 a6 32 b9 4e 77 a2 64 19 af 06 79 59 61 39 c8 75
      0001560 9e 60 14 5e bf 86 af ed 58 f3 ce fb f0 cf 54 38
      0001600 a5 bb 04 bf 16 d5 c5 cb 80 0e cb 66 35 42 01 01
      0001620 01 63 07 dc 00 76 07 00 11 03 ff f0 ee 62 00 62
      0001640 00 72 63 02 01 71 01 63 af 3b 00 00 1b 1b 1b 1b
      Oben farblich hervorgehoben:
      (Hellgrün: Anfang)
      Zählerstand:
      02 9c 5d ab = 43802027/10 = 438020,27 Wh = 4380,2027 kWh [passt!]

      Aktueller Verbrauch:
      00 00 14 13 = 5139/10 = 513,9W [kann sein]
      (Dunkelgrün: Ende)

      Die Ausgabe von
      socat -t1 - /dev/ttyUSB0,echo=0,crnl,b9600 | od -tx1
      sieht auch gut aus:

      Code:
      0000000 1b 1b 1b 1b 01 01 01 01 76 07 00 11 04 00 22 52
      0000020 62 00 62 00 72 63 01 01 76 01 01 07 00 11 02 57
      0000040 60 c6 0b 06 45 4d 48 01 02 71 53 ea 4e 01 01 63
      0000060 61 90 00 76 07 00 11 04 00 22 53 62 00 62 00 72
      0000100 63 07 01 77 01 0b 06 45 4d 48 01 02 71 53 ea 4e
      0000120 01 72 62 01 65 02 57 f5 ed 77 77 07 81 81 c7 82
      0000140 03 ff 01 01 01 01 04 45 4d 48 01 77 07 01 00 00
      0000160 00 09 ff 01 01 01 01 0b 06 45 4d 48 01 02 71 53
      0000200 ea 4e 01 77 07 01 00 01 08 00 ff 63 01 82 01 62
      0000220 1e 52 ff 56 00 02 9c 73 b1 01 77 07 01 00 01 08
      0000240 01 ff 01 01 62 1e 52 ff 56 00 02 9c 73 b1 01 77
      0000260 07 01 00 01 08 02 ff 01 01 62 1e 52 ff 56 00 00
      0000300 00 00 00 01 77 07 01 00 0f 07 00 ff 01 01 62 1b
      0000320 52 ff 55 00 00 15 83 01 77 07 81 81 c7 82 05 ff
      0000340 01 01 01 01 83 02 a7 ac a6 32 b9 4e 77 a2 64 19
      0000360 af 06 79 59 61 39 c8 75 9e 60 14 5e bf 86 af ed
      0000400 58 f3 ce fb f0 cf 54 38 a5 bb 04 bf 16 d5 c5 cb
      0000420 80 0e cb 66 35 42 01 01 01 63 20 ce 00 76 07 00
      0000440 11 04 00 22 56 62 00 62 00 72 63 02 01 71 01 63
      0000460 3d 67 00 00 1b 1b 1b 1b 1a 01 61 3e 1b 1b 1b 1b
      0000500 01 01 01 01 76 07 00 11 04 00 22 58 62 00 62 00
      0000520 72 63 01 01 76 01 01 07 00 11 02 57 60 c8 0b 06
      0000540 45 4d 48 01 02 71 53 ea 4e 01 01 63 88 3c 00 76
      0000560 07 00 11 04 00 22 59 62 00 62 00 72 63 07 01 77
      0000600 01 0b 06 45 4d 48 01 02 71 53 ea 4e 01 72 62 01
      0000620 65 02 57 f5 ef 77 77 07 81 81 c7 82 03 ff 01 01
      0000640 01 01 04 45 4d 48 01 77 07 01 00 00 00 09 ff 01
      0000660 01 01 01 0b 06 45 4d 48 01 02 71 53 ea 4e 01 77
      0000700 07 01 00 01 08 00 ff 63 01 82 01 62 1e 52 ff 56
      0000720 00 02 9c 73 b4 01 77 07 01 00 01 08 01 ff 01 01
      0000740 62 1e 52 ff 56 00 02 9c 73 b4 01 77 07 01 00 01
      0000760 08 02 ff 01 01 62 1e 52 ff 56 00 00 00 00 00 01
      0001000 77 07 01 00 0f 07 00 ff 01 01 62 1b 52 ff 55 00
      0001020 00 15 86 01 77 07 81 81 c7 82 05 ff 01 01 01 01
      0001040 83 02 a7 ac a6 32 b9 4e 77 a2 64 19 af 06 79 59
      0001060 61 39 c8 75 9e 60 14 5e bf 86 af ed 58 f3 ce fb
      0001100 f0 cf 54 38 a5 bb 04 bf 16 d5 c5 cb 80 0e cb 66
      0001120 35 42 01 01 01 63 85 a5 00 76 07 00 11 04 00 22
      0001140 5c 62 00 62 00 72 63 02 01 71 01 63 b5 70 00 00
      Wie kann ich das aber jetzt in einem Plugin aufnehmen und auswerten? Die Zeichen kommen ja nicht auf einmal rein, sondern immer nur 2-5 Bytes - das sagt mir zumindest Wireshark. Wie bastel ich die zusammen, das ich die kompletten 316 Bytes habe?
      Wiregate #288

      Kommentar


        #4
        Hallo
        Alle Versuche das mit einem Plugin zu machen sind wegen Timing-Probleme gescheitert.
        Besser ist es ein Script zu erstellen das über cron aufgerufen wird.
        Oder noch besser mit dem vzlogger.
        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


          #5
          Guck mal die Themen durch:

          https://knx-user-forum.de/wiregate/1...%E4hlerabfrage

          https://knx-user-forum.de/wiregate/2...light=vzlogger

          Im letzteren ist auch die Datenverarbeitung drin. Da müsste man lediglich den Datensatz von Hex nach Ascii bringen und evtl. ein paar regex anpassen.
          Ansonsten wie NetFritz schon sagt scheint für SML vzlogger doch das Mittel der Wahl zu sein.
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            Das Problem ist das die Daten "in häppchen" so wie sie kommen auch vom socat rausgeschickt werden..
            Nachdem es offenbar auf die schnelle keine leicht auswertbaren, fixen Trennzeichen gibt muss man ein bisschen rumbrobieren (evtl. TCP statt UDP) oder die Fragmente im Plugin wieder "zusammenpfriemeln";
            also Byteweise einlesen, auf die Startsequenz warten, ..

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

            Kommentar


              #7
              Hallo
              Ich hänge mich mal hier mit rein.
              Ich versuche in der Konsole meinen SML Easymeter Q3C auszulesen, was mir aber nicht gelinkt.
              Ich lese ihn schon ein paar Monate mit einem Perl-Script aus das ich über Cron starte, das Script läuft einwandfrei.

              Nun möchte ich auch auf diesen Zähler den vzlogger einsetzen, dazu muss der Zähler aber in der Konsole abgefragt werden können.

              Hier mal der erste Teil des Scripts.
              "print "$count <> $x\n ";" gibt in Hex die SML Daten aus.
              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;
              #
              my $port = Device::SerialPort->new("/dev/usbserial-AHVPKI8A") || die $!;
              $port->databits(8);
              $port->baudrate(9600);
              $port->parity("none");
              $port->stopbits(1);
              $port->handshake("none");
              $port->write_settings;
               
              $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               
                      }
              }
              Ein
              stty -F /dev/usbserial-AHVPKI8A 9600
              od -x /dev/usbserial-AHVPKI8A
              in der Konsole bringt keine schlüssigen SML Daten.

              Was kann man noch machen um die Daten in der Konsole abzufragen?
              Der D0-Auslesekopf ist ein USB-Auslesekopf von Udo(volkszähler.org).

              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


                #8
                Hallo
                Habe mal den Auslesekopf an meinen alten KNX-Linux-Rechner mit Debian/squeeze/sid angestöpselt.
                Und siehe da, ein
                stty -F /dev/sttyUSB0 9600
                od -x /dev/sttyUSB0
                in der Konsole bringt schlüssige SML Daten.

                Eine Abfrage von stty -F /dev/sttyUSB0 bring:
                Code:
                speed 9600 baud; line = 0;
                eof = ^A; min = 1; time = 0;
                -brkint -icrnl -imaxbel
                -opost -onlcr
                -icanon -echo -echoe
                Eine Abfrage von stty -F /dev/sttyUSB0 am WG bring:
                Code:
                speed 9600 baud; line = 0;
                min = 1; time = 0;
                -brkint -icrnl -imaxbel
                -opost -onlcr
                -isig -icanon -iexten -echo
                Welcher Eintrag ist denn wohl denn dafür verantwortlich das ich die SML-Daten mit dem WG in der Konsole nicht abfragen kann?
                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


                  #9
                  Hallo
                  WG Schnittstelle mit
                  Code:
                  stty -F /dev/ttyUSB0 cs8 9600 -brkint -icrnl -imaxbel -opost -onlcr 
                  -icanon -echo -echoe eof ^A
                  eingestellt
                  und mit stty -F /dev/ttyUSB0 abgefragt.
                  Code:
                  speed 9600 baud; line = 0; eof = ^A; min = 1; time = 0; -brkint -icrnl 
                  -imaxbel -opost -onlcr -icanon -echo -echoe
                  cat /dev/ttyUSB0 | od -tx1
                  oder
                  od -x /dev/ttyUSB0
                  immer noch keine gültige SML Ausgabe.
                  Obwohl die Schnittstellen abfrage mit stty -F /dev/ttyUSB0 gleiches Ergebniss liefert.

                  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


                    #10
                    Hallo NetzFritz,
                    ich habe es inzwischen auch zum laufen bekommen.

                    ABER: Irgendwo hat es sich aber nach längerer Zeit aufgehängt, cron hatte es mehrmals gestartet, dann restartete sich wirdgated.pl, und der oder was anderes hatte dann nachts immer das licht im Schlafzimmer angeschaltet...?!?
                    Der WAF ist gesunken, und ich hab das Script erstmal gestoppt. Andere Geschichte... ;-)


                    Nun, ich hab leider absolut keine Ahnung von Perl und hab dann einfach mal was zusammen kopiert und gebastelt. Das es nun funktioniert ist wohl eher Zufall. Ich habs aber nicht mit dem OBIS-Zeugs hinbekommen und daher mir einfach angesehen, welche Zeichen vor dem Zählerstand und der momentanen Leistung stehen und dann gefiltert ung damit weitergearbeitet.


                    Aber hier mal meins zum Vergleich (Achtung: buggy!!)
                    Code:
                    #!/usr/bin/perl
                    
                    use Device::SerialPort;
                    use RRDs;
                    
                    my $file = "/dev/ttyUSB0";
                    my $port = Device::SerialPort -> new($file);
                    $port -> baudrate(9600);
                    $port->databits(8);
                    $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
                    
                    
                    ##RRDs
                    my $rrdpath = "/var/www/rrd";        #Pfad für RRDs
                    #my $counterid = "Zaehler_HZ";        #Grundname für RRDs
                    my $rrdname_W = "ehz_W\.rrd";
                    my $rrdname_kWh = "ehz_kWh\.rrd";
                    my $rrdfile_W = $rrdpath."\/".$rrdname_W;
                    my $rrdfile_kWh = $rrdpath."\/".$rrdname_kWh;
                    
                    
                    
                    my $buffer;
                    my $run=1;
                    
                    while($run){
                        #my $char = $port->lookfor();
                        my $char = $port->read(100);
                    
                        if ($char) {
                            ##$unpacked = unpack("H", $char);
                            ##print "".$unpacked;
                            my $bufhex = $char;
                            $bufhex =~ s/(.)/sprintf("%02x",ord($1))/eg;
                            #print "".$bufhex;
                            
                            
                            $buffer .= $bufhex ;
                            if ($buffer =~ "1b1b1b1b01010101"){
                                #print "Buffer: " . $buffer . " \n";
                                $len = length($buffer);
                                #print "len: " . $len . " \n";
                                $bereinigt = $buffer;
                                if ($bereinigt =~ /(.)*(1b1b1b1b01010101(.){616})/){
                                    $bereinigt = $2; #2. match speichern
                                    #print "ok: ". $bereinigt ."\n";
                                    $len = length($bereinigt);
                                    #print "len: " . $len . " \n";
                                    #print "\n\n\n";
                                    
                                    if ($bereinigt =~ /(77070100010800ff63018201621e52ff56)((.){10})01/){ #der Anfang für kWh
                                        $kwh = $2;
                                        #print "Arbeit hex: $kwh\n";
                                        $kwh_dez = (hex $kwh)/10000;
                                        print "Arbeit: " . $kwh_dez . " kWh\t";
                                        #my $kwh_dez1 = int($kwh_dez);
                                        #print "Arbeit: " . $kwh_dez1 . " kWh\t";
                                        
                                        #Wenn nicht vorhanden, dann neues RRD erstellen
                                        unless (-e $rrdfile_kWh){
                                            #RRDs::create ($rrdfile_kWh,"DS:kWh:GAUGE:60:0:1000000","--step=30","RRA:AVERAGE:0.5:1:1200");
                                            RRDs::create ($rrdfile_kWh,
                                                "DS:kWh:GAUGE:300:0:1000000","--step=60",
                                                "RRA:AVERAGE:0.5:1:1440", #1*60s*1440 = 1 Tag Minutengenau
                                                "RRA:AVERAGE:0.5:10:1008", #10*60s*1008 = 7 Tage 10-Minutenmittel
                                                "RRA:MAX:0.5:360:1460",#60*360*1460 = 1 Jahr 6h Maximum
                                            );
                                            
                                        }
                                        #RRD aktualisieren
                                        #print "RRDupdate: " . $rrdfile . " N:$kwh_dez\t";
                                        RRDs::update("$rrdfile_kWh", "N:$kwh_dez");
                                    }
                                    if ($bereinigt =~ /(770701000f0700ff0101621b52ff55)((.){8})01/){ #der Anfang für W
                                        $pwr = $2;
                                        #print "Leistung hex: $kwh\n";
                                        $pwr_dez = (hex $pwr)/10;
                                        print "Leistung: " . $pwr_dez . " W\n";
                                        
                                        #Wenn nicht vorhanden, dann neues RRD erstellen
                                        unless (-e $rrdfile_W){                        
                                            RRDs::create ($rrdfile_W,
                                                "DS:Watt:GAUGE:300:0:1000000","--step=60",
                                                "RRA:AVERAGE:0.5:1:1440", #1*60s*1440 = 1 Tag Minutengenau
                                                "RRA:AVERAGE:0.5:10:1008", #10*60s*1008 = 7 Tage 10-Minutenmittel
                                                "RRA:AVERAGE:0.5:360:1460",#60*360*1460 = 1 Jahr 6h-Mittel
                                                                     
                                                "RRA:MAX:0.5:10:1008", #10*60s*1008 = 7 Tage 10-Max
                                                "RRA:MIN:0.5:10:1008", #10*60s*1008 = 7 Tage 10-Min
                                                                     
                                                "RRA:MAX:0.5:360:1460",#60*360*1460 = 1 Jahr 6h Maximum
                                                "RRA:MIN:0.5:360:1460",#60*360*1460 = 1 Jahr 6h Minimum
                                            );
                                                                                                                                                                                                                                             
                                        }
                                        #RRD aktualisieren
                                        RRDs::update("$rrdfile_W", "N:$pwr_dez");
                                    }
                                        
                                    $buffer="";
                    
                                    #script stoppen
                                    $run=0;
                                }
                            }
                            
                        }
                    }
                    Beim ausführen zeigt das bei mir:
                    Code:
                    Arbeit: 4543.6363 kWh   Leistung: 387.4 W
                    Wiregate #288

                    Kommentar


                      #11
                      Nur so geraten...

                      Im Aktor für das Schlafzimmerlicht ist das A-Flag gesetzt!? -> Bedeutet, dass der Aktor auch bei einem Antworttelegramm seinen Zustand aktualisiert. Ich hatte da oft Probleme mit der CometVisu... Wenn ich die nach einiger Zeit im Browser aufrufte und diese die aktuellen Zustände abfragte wurde immer mein Fernseher abgewürgt, da der Schaltaktor den Strom trennte. Könnte auch nach einem Neustart von wiregated.pl geschehen.

                      Lösung: A-Flag entfernen und den Aktor neu programmieren -> Problem gelöst
                      Gruss Patrik alias swiss

                      Kommentar


                        #12
                        Danke für den Tip,
                        aber so gut wie bei jedem Kanal ist das "A" aktiviert... dann sollte es ja mit auch mehreren Lichtern Probleme geben?! Nun, solange mein Script nicht mehr läuft, stürzt auch wiregated.pl nicht mehr ab :-)
                        Ich versuche das aber mal mit dem A-Flag, wenn der WAF wieder okay ist.

                        [Ne Lösung für das Script muss natürlich her...]
                        Wiregate #288

                        Kommentar


                          #13
                          Ist bei mir nicht anders aber meine Hager-Schaltaktoren reagieren darauf anders als der Rest. Mir wurde nur immer der Strom der geschalteten Steckdosen getrennt. Die Leuchten sind alle auf Dimmern. Da gab es interessanterweise keine Probleme.

                          Naja ich hab bei den Hageraktoren einfach das A-Flag entfernt und seit da ist ruhe im Karton
                          Gruss Patrik alias swiss

                          Kommentar


                            #14
                            @NetFritz:

                            Problem schon gelöst?

                            Habe ein ähnliches Problem, Daten sollen über socat (Konsole) gesendet werden. Senden mit Netbook (Ubuntu 12) klappt auf dem WireGate mit identischem Befehl aber nicht .

                            Der Vollständigkeit halber hier mein Befehl:
                            echo 00028e | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie' | socat -t1 - /dev/ttyUSB-1-4,b2400 | od -tx1

                            Auf dem Netbook sehe ich dann auch meinen gesendeten Befehl, im Wiregate allerdings nicht ... und natürlich auch keine Reaktion.
                            Umgezogen? Ja! ... Fertig? Nein!
                            Baustelle 2.0 !

                            Kommentar


                              #15
                              Hallo
                              Problem noch nicht gelöst.
                              Baustelle ruht erst mal.
                              Lese den Zähler z.Z. mit einem Perl-Script per cron aus.
                              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

                              Lädt...
                              X