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

  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • lio123
    antwortet
    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?

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • lio123
    antwortet
    [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

    Einen Kommentar schreiben:


  • ctr
    antwortet
    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...

    Einen Kommentar schreiben:


  • lio123
    antwortet
    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

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • lio123
    antwortet
    mit dem WG?
    kenn mich damit nicht aus,

    wo muss ich cat eingeben?

    Einen Kommentar schreiben:


  • ctr
    antwortet
    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?

    Einen Kommentar schreiben:


  • lio123
    antwortet
    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;

    Einen Kommentar schreiben:


  • lio123
    antwortet
    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

    Einen Kommentar schreiben:


  • ctr
    antwortet
    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...

    Einen Kommentar schreiben:


  • lio123
    antwortet
    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

    Einen Kommentar schreiben:


  • ctr
    antwortet
    Was für einen serial-to-rs232 adapter benutzt Du? Evtl gibts Probleme mit dem setzen der Übertragungsrate, meine da mal etwas gehört zu haben...

    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!)

    Einen Kommentar schreiben:


  • lio123
    antwortet
    Hab das Plugin gestern mal eingebunden.
    Das erste mal, dass ich sowas gemacht habe.
    Ich habe es mit meinen Parametern abgeändert, also erstmal
    auf einen Zähler reduziert und den USB-Wandlername eingegeben, der mir unter Socketverbindung angezeigt wurde.

    Es kam der DEBUG-Fehler in der Zeile:

    $port->databits(8);

    'Die habe ich dann mal rausgelöscht um zu sehen wie's weiter geht und die nächste Zeile

    $port->baudrate(9600);

    wurde dann als Fehler angegeben.

    Muss also irgendwie mit der Schnittstelle zusmmenhängen?!?!
    Muss ich da eine Socketverbindung anlegen?
    Wenn ich die Hilfe richtig verstanden habe, dient die Socketverbindung dazu, die Schnittstelle auf verschiedene Weisen (TCP, UDP,...) weiterzuleiten....

    Kann mir da jemand auf die Sprünge helfen?

    Danke und Grüeß,
    Lio

    Einen Kommentar schreiben:

Lädt...
X