GELÖST - Hilfe beim Modulbauen oder Script für kompatibles Logfile

Begonnen von Inputsammler, 19 Februar 2018, 21:51:22

Vorheriges Thema - Nächstes Thema

Inputsammler

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
Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.

Inputsammler

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
Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.

Wernieman

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.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

CoolTux

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!
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wernieman

BTW:
Du hast nicht alle { beendet, oder der Code-Block ist nicht vollständig ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Inputsammler

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





Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.

CoolTux


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\" ");

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Inputsammler

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.
Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.

CoolTux

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  ;)
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Inputsammler

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
Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net