Hauptmenü

Eigenes Modul Easymeter

Begonnen von Crawler, 08 Januar 2016, 15:14:54

Vorheriges Thema - Nächstes Thema

Crawler

Hi,
ich suche jemanden der mir mein Perl script in ein fhem Modul umwandelt.
hatte mich schon durch mehrere Module gelesen aber irgendwie komme ich nicht drauf.
#!/usr/bin/perl -w
package main;
use strict;
use Device::SerialPort;
use Time::HiRes qw(usleep);
my $serial = Device::SerialPort->new("/dev/ttyAMA0");
   $serial->baudrate(9600);
   $serial->databits(7);
   $serial->parity("even");
   $serial->stopbits(1);
   $serial->purge_all();
my ($count, $data) = undef;
my $charcount = 0;
my $buffer = "";
my $delay = 5;
my $time = time;
my $nexttime =time;
my $lasttime = time() + 10;
# Read response
START:
while(1) {
  while (time() >= $nexttime) {
   if (time() >= $lasttime) {
     print "Zeit vorbei\r\n";
     exit;
     print "start time() \r\n";
   }
   ($count, $data)=$serial->read(297); # Telgegramm mit einer länge von 297 empfangen
   $buffer.= $data; # Buffer füllen
   $charcount += $count; # Anzahl Zeichen zählen
   if ($charcount >= 297) { # Wenn 297 Zeichen empfangen sind
     print "count >= 290\r\n";
# sleep(1);
# print "$buffer"; debug
    if (!index($buffer,'/') == 0) {
      print "data error!\r\n";
      $serial->lookclear;
      $charcount = 0;
      $buffer = "";
      $count = 0;
      $data = 0;
     #  exit;
    }
    if (index($buffer,'/') == 0 && index($buffer,'!') >= 290) {
      #print "$buffer";
        #########################################################
      my $referenceindex = index($buffer, '1-0:1.8.0*255(') + 14;
      my $reference = substr($buffer, $referenceindex, 16);
      $reference =~ s/\G0//g;
        #########################################################
      my $feedindex = index($buffer, '1-0:2.8.0*255(') + 14;
      my $feed = substr($buffer, $feedindex, 16);
      $feed =~ s/\G0//g;
        #########################################################
      my $L1index = index($buffer, '1-0:21.7.0*255(') + 15;
      my $L1 = undef;
        if (index($buffer, '-', $L1index ) == $L1index ) {
           $L1 = substr($buffer, $L1index + 1, 9);
           $L1 =~ s/\G0//g;
           my $L1sign = substr($buffer, $L1index, 1);
           $L1 = join "", $L1sign, $L1;
        }
      else {
        $L1 = substr($buffer, $L1index, 9);
        $L1 =~ s/\G0//g;
      }
        #########################################################
      my $L2index = index($buffer, '1-0:41.7.0*255(') + 15;
      my $L2 = undef;
        if (index($buffer, '-', $L2index ) == $L2index ) {
           $L2 = substr($buffer, $L2index + 1, 9);
           $L2 =~ s/\G0//g;
           my $L2sign = substr($buffer, $L2index, 1);
           $L2 = join "", $L2sign, $L2;
        }
      else {
        $L2 = substr($buffer, $L2index, 9);
        $L2 =~ s/\G0//g;
      }
        #########################################################
      my $L3index = index($buffer, '1-0:61.7.0*255(') + 15;
      my $L3 = undef;
        if(index($buffer, '-', $L3index ) == $L3index ) {
          $L3 = substr($buffer, $L3index + 1, 9);
          $L3 =~ s/\G0//g;
          my $L3sign = substr($buffer, $L3index, 1);
          $L3 = join "", $L3sign, $L3;
        }
        else {
          $L3 = substr($buffer, $L3index, 9);
          $L3 =~ s/\G0//g;
        }
        #########################################################
      my $Lallindex = index($buffer, '1-0:1.7.0*255(') + 14;
      my $Lall = undef;
        if (index($buffer, '-', $Lallindex) == $Lallindex) {
          $Lall = substr($buffer, $Lallindex + 1, 9);
          $Lall =~ s/\G0//g;
          my $Lallsign = substr($buffer, $Lallindex, 1);
          $Lall = join "", $Lallsign, $Lall;
        }
        else {
          $Lall = substr($buffer, $Lallindex, 9);
          $Lall =~ s/\G0//g;
        }
        print "Bezug = $reference\r\n";
        print "Einspeisung = $feed\r\n";
        print "Phase 1 = $L1 \r\n";
        print "Phase 2 = $L2 \r\n";
        print "Phase 3 = $L3 \r\n";
        print "alle Phasen = $Lall \r\n";
        $serial->purge_all();
        $charcount = 0;
        $buffer = "";
        $nexttime += 5;
        goto START;
    }
   }
  }
}


über Verbesserungsvorschläge wäre ich sehr erfreut.
Das Script arbeitet aber elegant sieht es nicht aus.
Ich schaffe es auch gerade nicht einen Daten Fehler hervor zurufen wenn jemand eine Idee hätte wie ich diesen weg testen kann.

Telegramm kommt alle 2 sekunden mit 9600 7E1
Zitat/ESY5Q3DB1024 V3.04

1-0:0.0.0*255(0272160155556)
1-0:1.8.0*255(00000792.5617691*kWh)
1-0:2.8.0*255(00002394.6904431*kWh)
1-0:21.7.0*255(000013.06*W)
1-0:41.7.0*255(000029.72*W)
1-0:61.7.0*255(000184.51*W)
1-0:1.7.0*255(000227.29*W)
1-0:96.5.5*255(80)
0-0:96.1.255*255(1ESY1160155556)
!
FHEM auf Raspi + HMLan + 14 Aktoren + OBIS(Strom) über GPIO