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
    Naja, ich selbst hab da jetzt nicht so die Not, da ich seinerzeit eon zwei Zähler mit S0-Schnittstelle aus den Rippen geknabbert habe Die laufen am Binäreingang, fertig..

    Aber für andere ist das Thema IMHO durchaus sehr interessant und für SML macht man auch nicht "mal eben" eine Webabfrage auf anderen Lösungen

    Makki

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Du könntest ggf den Messstellenbetreiber wechseln. Das muss ja nicht die EON sein.

    Einen Kommentar schreiben:


  • makki
    antwortet
    Posten: gerne. Vielleicht kann ich das ja ein bisschen komfortabel zusammenpacken.. Ich hab zwar (noch? Hallo eon, §21b EnWG..) keinen passenden Zähler aber die werden kommen;
    Insofern finde ich das Thema relativ spannend und das WG bietet sich dafür ja dringend an

    Hatte da auch eine libsml entdeckt, sieht ganz gut aus..
    Ob nun in C, PHP oder Perl ist denke ich sekundär, solange es am Ende des Tages einfach funktioniert..

    Makki

    Einen Kommentar schreiben:


  • ctr
    antwortet
    Ich habe inzwischen aus dem example/sml_server aus der libehz ein Standalone-Programm zum Auslesen der Werte erstellt was nicht mehr auf Hex-Parsing beruht sonder nativ SML/Obis spricht. Dadurch funktioniert das Auslesen sofort, auch bei meinem vorher problematischem PV-Einspeisezähler.

    Ich lasse das jetzt allerdings vom Cron direkt in ein rrd schreiben ohne "Umweg" über ein WG Plugin (auch weil ich das Senden auf den Bus nie benutzt habe, sondern nur das RRD). Bei Interesse kann ich den (C-)Code hier gern posten. Wenn man die Werte auf dem Bus braucht kann man das Binary ja auch per "system" aus dem Plugin aufrufen...

    Einen Kommentar schreiben:


  • lio123
    antwortet
    Hab das jetz noch mal frisch gemacht und 1:1 reinkopiert, weils n.m.I. schon passen würde.

    Das Ergebnis im Bild.

    Un hier mal den String:
    Code:
    1B1B1B1B01010101760700090129E1D262006200726301
    0176010107000900514B460B06454D4801027152C87D010163A
    55000760700090129E1D3620062007263070177010B06454D480
    1027152C87D0172620165005139477777078181C78203FF01010
    10104454D480177070100000009FF010101010B06454D4801027
    152C87D0177070100010800FF63018201621E52FF560000C6966
    60177070100010801FF0101621E52FF560000C69666017707010
    0010802FF0101621E52FF56000000000001770701000F0700FF0
    101621B52FF5500003D1A0177078181C78205FF0101010183025
    590B4D1321AB69C538768156DACA7993A95576468864D78FDC1
    21CC754507953C4B255CA3D3E5AF112F92940ADD46C40101016
    3F73700760700090129E1D66200620072630201710163C868000
    01B1B1B1[B][COLOR=Red]B1[/COLOR][/B]A01AEC4
    1B1B1B deutet auf einen Start/Ende hin könnte man auf die rot markierte Stelle nicht EOL setzen?

    Das sind jetzt >255 zeichen -> ein problem?
    Angehängte Dateien

    Einen Kommentar schreiben:


  • makki
    antwortet
    Das rfid_last_XXX kommt aber definitiv nicht aus dem von mir geposteten, das ist schlicht MischMaschMurks..
    Das RFID-Plugin liest nun RFID-Transponder, ich meinte das eher als Beispiel, sicher nicht 1:1..

    EOL (Datensatz/Zeilenende) wäre nur dann interessant, wenn es ein fixes Zeichen dafür gibt. Dan würde einem der socat jeden Datensatz hübsch in ein Paket packen, ansonsten muss man sich die Schnipsel halt im Plugin selbst zusammensetzen.

    Makki

    Einen Kommentar schreiben:


  • lio123
    antwortet
    [INFORMATION]
    DL TEST_rfidlast_ 5d461325786691.29115EDL TEST_rfidlast_ 5d46441325786812.99741EDL TEST_rfidlast_00001325786799.86727EDL TEST_rfidlast_00011325786865.98999EDL TEST_rfidlast_0011325786932.04128EDL TEST_rfidlast_001a1325786748.29116EDL TEST_rfidlast_001a31325786681.79558EDL TEST_rfidlast_004c671325786845.73635EDL TEST_rfidlast_0097f1325786714.14367EDL TEST_rfidlast_017771325786800.47096EDL TEST_rfidlast_01801325786717.69914EDL TEST_rfidlast_01811325786721.25858EDL TEST_rfidlast_01821325786798.09559EDL TEST_rfidlast_01a1311325786868.94438EDL TEST_rfidlast_01a5111325786935.01513EDL TEST_rfidlast_01b1b1325786763.21966EDL TEST_rfidlast_01b1b1b1325786696.07834EDL TEST_rfidlast_04c671325786928.48361EDL TEST_rfidlast_04c676a1325786720.0739

    [/INFORMATION]


    im editor wurde mir das so angezeigt

    bei EDL TEST_rfidlast_04c676a ist "04c676a" der Hexcode der SML-Nachricht-den habe ich heute auswendig gelernt

    Die Daten kommen im WG an, könnte jetzt nachher probieren den SOCAT, soweit ins richtige Script einzubinden. Der Code muss aber weiter unten in einer Schleife angepasst werden, dazu melde ich mich aber nochmal.

    ach was wichtiges am Rande: EOL=XX? Bedeutet / bewirkt genau was?
    Angehängte Dateien

    Einen Kommentar schreiben:


  • makki
    antwortet
    den socat abschalten dürfte am einfachsten sein, den Rest versteh ich nicht, was mir das nun sagen soll, woher das stammt, ...

    Es gibt hier ein wirklich praktisches Code einfügen, dann kann man das auch lesen..

    Makki

    Einen Kommentar schreiben:


  • lio123
    antwortet
    huch! wie hält man das wieder an?

    erste Zeile im Plugin "Return;" schreiben?

    EDL TEST_cycle3600EDL TEST_last1325790656.48292EDL TEST_resultReceived HEXdump: 1eEDL TEST_rfidlast_ 5d461325786691.29115EDL TEST_rfidlast_ 5d46441325786812.99741EDL TEST_rfidlast_00001325786799.86727EDL TEST_rfidlast_00011325786865.98999EDL TEST_rfidlast_0011325786932.04128EDL TEST_rfidlast_001a1325786748.29116EDL TEST_rfidlast_001a31325786681.79558EDL TEST_rfidlast_004c671325786845.73635EDL TEST_rfidlast_0097f1325786714.14367EDL TEST_rfidlast_017771325786800.47096EDL TEST_rfidlast_01801325786717.69914EDL TEST_rfidlast_01811325786721.25858EDL T

    EDIT: ja das wars.
    Also Die Daten kommen im WG an, könnte jetzt nachher probieren den SOCAT, soweit ins richtige Script einzubinden. Der Code muss aber weiter unten in einer Schleife angepasst werden, dazu melde ich mich aber nochmal.

    ach was wichtiges am Rande: EOL=XX? Bedeutet / bewirkt genau was?

    Einen Kommentar schreiben:


  • lio123
    antwortet
    F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
    0 S root 32104 1 0 80 0 - 1075 - 18:58 ? 00:00:00 /usr/bin/socat -u /dev/usbserial-1-4,raw udp-datagram:192.168.2.255:50011,bind=:50012,reuseaddr ,broadcast


    Na klar!
    Angehängte Dateien

    Einen Kommentar schreiben:


  • makki
    antwortet
    Ähm, der KNX-write ist mal nix, von vorne:

    Code:
    # Plugin zum Hexdump empfangener UDP-Daten
    
    ##################
    ### DEFINITION ###
    ##################
    
    my $socknum = 5; # Eindeutige Nummer des Sockets
    
    # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
    $plugin_info{$plugname.'_cycle'} = 3600;
    
    my $recv_ip = "192.168.2.255"; # Empfangsport (UDP, wie in Socket-Einstellungen)
    my $recv_port = "50011"; # Empfangsport (UDP, wie in Socket-Einstellungen)
    
    #######################
    ### ENDE DEFINITION ###
    #######################
    
    # Hauptverarbeitung
    # or ($fh and eof($socket[$socknum]))
    if (!$socket[$socknum]) { # socket erstellen
      $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port, Proto => "udp", LocalAddr => $recv_ip )
        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 UDP-Socket $socknum";
    }
    elsif ($fh) { # Read from UDP-Socket
      my $buf;
      recv($fh,$buf,255,0);
      my $bufhex = $buf;
      $bufhex =~ s/(.)/sprintf("%x",ord($1))/eg;
      return "Received $buf HEXdump: $bufhex";
    }
    
    return; # cyclic call
    Der socat-Eintrag(screenshot?) muss natürlich dazupassen! In diesem Fall Broadcast aufs LAN, das er grün ist heisst noch nicht das er die Daten an den richtigen schickt

    Makki

    Einen Kommentar schreiben:


  • lio123
    antwortet
    Hab das jetzt mal eingestellt. der SOCAT ist grün

    Das Plugin soweit abgeändert mit meinen Daten.
    Zur Ausgabe habe ich im letzten Abschnitt verständnisprobleme,
    deshalb gelöscht und angepasst. Ziel ist den String als Rückgabewert
    in der Plugin Übersicht abzulesen. -da steht jetzt aber nix
    das ist zum Teil gut, aber halt ohne ergebnis????

    # Plugin R.S-Systems RFID-Reader to KNX


    ##################
    ### DEFINITION ###
    ##################

    my $socknum = 5; # Eindeutige Nummer des Sockets +1

    # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
    $plugin_info{$plugname.'_cycle'} = 300;

    my $recv_ip = "192.168.2.255"; # Empfangsport (UDP, wie in Socket-Einstellungen)
    my $recv_port = "50011"; # Empfangsport (UDP, wie in Socket-Einstellungen)
    my %rfid_ga;
    $rfid_ga{'30343136323c3634373a20'} = '11/2/1'; # Gruppenadresse auf die bei dieser RFID gesendet wird
    #.. usw.
    my $interval = 30; # Sendeintervall für RFIDs in Reichweite in Sekunden

    #######################
    ### ENDE DEFINITION ###
    #######################

    # Hauptverarbeitung
    # or ($fh and eof($socket[$socknum]))
    if (!$socket[$socknum]) { # socket erstellen
    if (defined $socket[$socknum]) { #debug
    if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
    undef $socket[$socknum];
    } #debug
    $socksel->remove($socket[$socknum]);
    $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
    Proto => "udp",
    LocalAddr => $recv_ip
    )
    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 UDP-Socket $socknum";
    }
    elsif ($fh) { # Read from UDP-Socket
    my $buf;
    recv($fh,$buf,255,0);
    next if(!$buf || length($buf) < 2); # Bogus messages
    my $bufhex = $buf;
    $bufhex =~ s/(.)/sprintf("%x",ord($1))/eg;
    if (time() - $plugin_info{$plugname.'_rfidlast_'.$bufhex} < $interval) {
    # repeated
    knx_write( "12/2/20" , $bufhex, 9 );
    return;
    }
    }

    return;

    Einen Kommentar schreiben:


  • makki
    antwortet
    Ich kenn das Protokoll nicht, schwer zu sagen aus der Ferne, aber ein bisschen was wird man schon ändern müssen.

    Versuchs erstmal so wie in dem RFID-Plugin - das gibt ganz simpel in Hex zurück, welche happen da überhaupt kommen. Wenns gut läuft, landets alles in einem Telegramm, dann sieht man weiter..

    Makki

    Einen Kommentar schreiben:


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

    das heisst doch nur sovie wie:

    mach den Mund 255 Zeichen lang auf und schreib es in den buffer???

    kann sein, dass was mit der Umwandlung nicht stimmt:
    $buffer.=sprintf("%02x",unpack("C",$saw));
    $buffer =~ /$ls(.*?)$rs/;

    Einen Kommentar schreiben:


  • lio123
    antwortet
    isch hab' da heut' middasch schu ma geguckt
    un heut' abnd werd's isch mal probiere

    und Du bist guter Hoffnung, dass es daran liegt?

    EOL_ das letzt h-Zeichen ist immer unterschiedlich
    die ca 4 h-Zeichen davor immer gleich und immer an der selben stelle.

    Funktioniert der restliche PERL dann so wie er da geschrieben steht?

    Einen Kommentar schreiben:

Lädt...
X