FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Inputsammler am 19 Februar 2018, 21:51:22

Titel: GELÖST - Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: Inputsammler am 19 Februar 2018, 21:51:22
Hallo zusammen,

Ich habe ein Perl Script gefunden das meinen Zähler  APATOR 12EC3g nach Anpassungen auslesen kann.
Aber leider versteh ich es noch nicht so ganz Perl.

Jetzt meine Frage kann mir da jemand helfen das ich ein richtiges FHEM taugliches Log erstellt wird
Das ich dann mit einen Dummy fütter.
Oder das Script sogar evtl ein Dummy befüllt wie ich es mit meinen Alten Stromzähler gemacht hatte. (war aber ein Pyton Script)

#!/usr/bin/perl
#
# Holt die Daten vom D0-Zaehler Pafal 20ec3gr
# es wird die obere optische Schnittstelle ausgelesen
# dort liefert der Zaehler alle 2sec. einen Datensatz ?? KANN JA NICHT SEIN, DENN IM VERLAUF DES SCRIPTS WIRD DER ZÄHLER AUFGEFORDERT.
# wird von CRON jede Minute aufgerufen
# http://wiki.volkszaehler.org/software/sml
# 03.2012 by NetFritz
# 07.2013 by Ollir
# 09.2013 by TK for Pafal 20ec3gr


# ========================================
#
use Device::SerialPort;
my $port = Device::SerialPort->new("/dev/ttyUSB0") || die $!;
$port->databits(7);
$port->baudrate(300);
$port->parity("even");
$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  8-10 Zeichen
# Multiplikator (Einspeisung negativ)

%channel = (
  'Netzbezug' => ['1.8.0',4,9,1000], # 1-0:1.8.0  /* kWh aufgenommen */
  'Einspeisung' => ['2.8.0',4,9,-1000],# 1-0:2.8.0  /* kWh rueckgespeis*/
);

#request for pafal
$output="/?!\r\n";
$count=$port->write($output);
sleep(2);
$output="\x06\x30\x30\x30\r\n";
$count=$port->write($output);

# von der schnittstelle lesen
for($i=0;$i<=10;$i++) {
        # wenn mehr als 10 chars gelesen werden wird ausgewertet,
        # wenn nicht wird Schleife 10 mal wiederholt
         my ($count,$saw)=$port->read(255);   # will read max 255 chars
         if ($count >10) {
                        # print  "read $count chars\n";
                        # print  "$count <> $saw\n";  # gibt die empfangenen Daten aus

                while (($uuid) = each(%channel)){
                        $key =  $channel{$uuid}[0] ;
                        $pos =  $channel{$uuid}[1] ;
                        $len =  $channel{$uuid}[2] ;
                                #print "uuid=$uuid , key=$key, pos=$pos, len=$len\n" ;

                        # Stringpos raussuchen
                        $pos1=index($saw,$key);

                        # grob rausschneiden
                        $val1 = substr( $saw , $pos1  , 50);
                        # print $key . " = " . $val1  . "\n";

                        # Messwert selber
                        $val2 = substr( $val1 , length($key) + $pos , $len);

                        # Wert umwandeln
                        $val3 =  $val2*$channel{$uuid}[3];
                        # print $uuid . " : " . $val3 . "\n";

                        # Wert im Hash ablegen
                        $channel{$uuid}[4] = $val3 ;
                }
                # last; # while verlassen
        } else {
                #print "Schnittstellenlesefehler redu = $i ; count = $count <> \n";
         }
}

# ========================================
# Daten per post an den Server senden
# http://xmodulo.com/2013/05/how-to-send-http-get-or-post-request-in-perl.html
# http://wiki.volkszaehler.org/development/api/reference


$timestamp = time() * 1000 ; # msec seit 1.1.1970
while (($uuid) = each(%channel)){
        $val =  $channel{$uuid}[4] ;
        if ($val != 0) {
        print $uuid . " : " . $timestamp . " : " . $val . "\n";

       
    }

}


Als Rückgabe bekomme ich nun

root@RpiV3:/opt/fhem/SCRIPT# perl Apator.pm
Netzbezug : 1519072909000 : 6060
Einspeisung : 1519072909000 : -3220
Titel: Antw:Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: Inputsammler am 20 Februar 2018, 10:38:05
Frage warum funktioniert dies nicht
while (($uuid) = each(%channel)){
        $val =  $channel{$uuid}[4] ;
        if ($val != 0) {
        print $uuid . " : " . $timestamp . " : " . $val . "\n";
        #system('perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler Wixxer 3" ');
        system('perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler $uuid $val " ');


wenn ich im Terminal das eingebe funktioniert es
perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler Einspeisung 2"
mache funktioniert es

was mache ich falsch ?

danke
Titel: Antw:Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: Wernieman am 20 Februar 2018, 12:44:00
Meine Empfehlung: Anstelle von /opt/fhem/fhem.pl auf nc ausweichen (hier als bash-code)
echo -en "set ${1} ${2}\nquit\n" | nc -w 5 localhost 7072

Anstelle von "localhost" geht auch irgendein anderer Servername. Gibt auch eine Lösung für telnet-ssl.

Btw. Wenn DU Passwort eingerichtet hast, ist Übertragung auch möglich.
Titel: Antw:Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: CoolTux am 20 Februar 2018, 13:02:27
Zitat von: Inputsammler am 20 Februar 2018, 10:38:05
Frage warum funktioniert dies nicht
while (($uuid) = each(%channel)){
        $val =  $channel{$uuid}[4] ;
        if ($val != 0) {
        print $uuid . " : " . $timestamp . " : " . $val . "\n";
        #system('perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler Wixxer 3" ');
        system('perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler $uuid $val " ');


wenn ich im Terminal das eingebe funktioniert es
perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler Einspeisung 2"
mache funktioniert es

was mache ich falsch ?

danke

Funktioniert nicht ist keine Fehlerbeschreibung!
Titel: Antw:Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: Wernieman am 20 Februar 2018, 13:09:02
BTW:
Du hast nicht alle { beendet, oder der Code-Block ist nicht vollständig ...
Titel: Antw:Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: Inputsammler am 20 Februar 2018, 15:08:56
Hallo zusammen,

Zitat von: CoolTux am 20 Februar 2018, 13:02:27
Funktioniert nicht ist keine Fehlerbeschreibung!

Sorry versuche es nun besser zu machen

Das komplette Script ist im 1.Beitrag.

ich habe in den Perl Code diese Variable $uuid und $val
print $uuid . " : " . $timestamp . " : " . $val . "\n";

jetzt wollte ich in dem Script ,machen das er die Variablen ausgiebt als
Reading Name soll $uuid sein
ReadinWert soll $val sein

Diesen Code habe ich in den Perl Script eingefügt.
system('perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler $uuid $val " ');

Als Fehlermeldung bekomme ichNetzbezug : 1519130456000 : 15190
Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.

Einspeisung : 1519130456000 : -3220
Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.


Aber das habe ich doch
name ist --> dmy_Stromzaehler
reading --> Variable $uuid
value --> Variable $val

Wenn ich die Zeile mit statischen Werten ersetze bekomme ich die readings ins Dummy
system('perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler Einspeisung 3000" ');

Gruß Gerd





Titel: Antw:Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: CoolTux am 20 Februar 2018, 15:19:40

system("perl /opt/fhem/fhem.pl 7072 "setreading  dmy_Stromzaehler $uuid $val" ");


Versuche mal so, oder die inneren escapen


system("perl /opt/fhem/fhem.pl 7072 \"setreading  dmy_Stromzaehler $uuid $val\" ");

Titel: Antw:Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: Inputsammler am 21 Februar 2018, 06:47:46
Zitat von: CoolTux am 20 Februar 2018, 15:19:40

Versuche mal so, oder die inneren escapen


system("perl /opt/fhem/fhem.pl 7072 \"setreading  dmy_Stromzaehler $uuid $val\" ");


Danke dir CoolTux, für deine Hilfe.

Funktioniert soweit gut. Script wird per crontab alle 5 Minuten gestartet.
Titel: Antw:GELÖST - Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: CoolTux am 21 Februar 2018, 06:58:36
Cooler wäre natürlich das ganze über FHEM zu machen und die Verbindung dauerhaft bestehen zu lassen so das alle Daten die ankommen abgefasst werden. Gibt ja ne Menge Module die USB auslesen  ;)
Titel: Antw:GELÖST - Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: Inputsammler am 21 Februar 2018, 22:05:21
Hey CoolTux,

Ja das wäre echt cool. Aber soweit ich das mitbekommen habe wäre dann FHEM für 2 bis 3 Sekunde blockiert.
Da man ja einen String reinschicken muss 2 Sekunden warten muss und dann nochmals fragen ...
Dann bekommt man de Infos vom Zähler.

Habe mit schon mal Module angesehen aber bin noch nicht so ganz dahinter gekommen.

Kannst du mir einen Tip geben welche Module ich dazu ansehen sollte um daraus zu lernen.

Danke Dir.

Gruß Gerd
Titel: Antw:GELÖST - Hilfe beim Modulbauen oder Script für kompatibles Logfile
Beitrag von: CoolTux am 22 Februar 2018, 05:20:22
Das mit den 2s musst Du im Skript nur machen, weil Dein Skript nicht als Daemon läuft. FHEM läuft ja ständig und in einer select Schleife wird ständig gefragt ob an der Schnittstelle Daten anliegen zum abholen. Du musst nur den write abschicken. Bilde mir auch ein das muss man nur einmal und dann kommen ständig Daten über Bus. Aber ich kenne das Teil nicht und weiß es nicht.

Im Grunde musst Du Mal schauen welche Module serielle Schnittstellen ansprechen, denn nichts anderes macht Dein Skript.

Module müsste ich selber mal schauen.