SML Stromzähler per USB Schreib-Lesekopf?

Begonnen von matzefisi, 04 August 2013, 14:14:48

Vorheriges Thema - Nächstes Thema

Omega-5

@  zYloriC
Hallo Florian,

ich habe mir noch mal einige Gedanken zu deiner Wunschanzeige gemacht. Die Wirkleistung ist für deinen Zähler immer positiv, weil das der Anschlusswert aller gerade aktiven Verbraucher ist. Woher soll er auch wissen welchen Anteil davon deine Solaranlage übernimmt. Dazu müsstest du die momentane Leistung kennen und davon die angezeigte Leistung subtrahieren. Erst dann bekommst du eine Aussage über die Einspeiseleistung. Oder du nimmst die Werte von Wirkenergie-Lieferung und Wirkenergie-Bezug für einen bestimmten Zeitraum und berechnest daraus die gewünschten Werte. Sonst schau doch mal ins Unterforum "Solaranlagen".

Gruß Friedrich
RaspberryPi2, nanoCUL, 3x DS18B20, FS20: 4x Funk-Schalter ST-4, LaCrosseGW,
HomeMatic: HMLAN, HM-WDS10-TH-O, HM_MYS_RelaisBoard,
I2C: HYT221 über modifiziertes Modul I2_I2C_SHT21.pm (Q&D),

willybauss

Zitat von: zYloriC am 10 März 2016, 23:52:46
...
Die kwh-Angaben zu den beiden Werten helfen mir leider nicht viel. Ich benötige zu aktuellen WATT-Zahl quasi das Vorzeichen, um zu sehen ob es Erzeugung oder Verbrauch ist...
Ich habe zwar keinen SML-Zähler, sondern OBIS, aber ich konnte das so lösen, dass ich ausschließlich die kWh-Zahlen verwendete (weil mein Zähler gar keine Watt ausgibt). Mit einem "differential" UserReading erhält man daraus die aktuelle Leistung, errechnet aus den kWh-Zahlen und den Timestamps zweier aufeinander folgender Ablesungen. Die Zeiten werden offenbar in ms (Millisekunden) verarbeitet, denn meine Werte sind sehr gut aufgelöst, trotz Ablesung im Minutenraster.
Ich kann mich noch dunkel erinnern, dass ich irgendwie mit den Einheiten zu kämpfen hatte, deshalb zuerst die "temp" Readings, woraus dann die endgültigen Werte werden:

P_Bezug_temp:total_consumption
    differential { ReadingsVal("Hausstrom_Zaehler","total_consumption",0)*3600000 },
P_Einsp_temp:total_feed
    differential { ReadingsVal("Hausstrom_Zaehler","total_feed",0)*3600000 },
P_Bezug_Watt:P_Bezug_temp { sprintf("%.0f",ReadingsVal("Hausstrom_Zaehler","P_Bezug_temp",0)) },
P_Einsp_Watt:P_Einsp_temp { sprintf("%.0f",ReadingsVal("Hausstrom_Zaehler","P_Einsp_temp",0)) }
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

willybauss

Und falls es darum geht, den Eigenverbrauch auf Bezug/Einspeisung und PV-Erzeugung zu berechnen, dann entsteht hier gerade ein Thread dazu.

https://forum.fhem.de/index.php/topic,50661.0.html
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

zYloriC

Hallo zusammen,

Zitat von: Adriano am 12 März 2016, 12:43:10
Wollte nur Bescheid geben, dass bei mir auch nicht die neueste 70_SMLUSB.pm geht mit USB IR Lesekopf von UDO und ISKRA MT681.

danke für den Hinweis. Ich habe viel rumprobiert, aber leider bekomme ich keine Werte durch die IR-Diode mehr, sobald ich meine aktuelle 70_SMLUSB.pm durch eine neue ersetze.
Dateibesitzer und Gruppe habe ich schon angepasst. Er zeigt die Schnittstelle auch als OPENED an, aber er empfängt nix.

Meine bestehende, funktionierende 70_SMLUSB.pm habe ich mal angefügt. Wisst ihr, woran es liegen könnte? Auch nach Dateivergleich bin ich bin ratlos..

Viele Grüße,
zYloriC


#################################################################################
# 70_SMLUSB.pm
# Module for FHEM to receive SML Data via USB Schreiblesekopf by Udo
#
# http://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-usb-ausgang
#
# Developed for and tested with EHM ED 300 L power meter
#
# Used module 70_USBWX.pm as template. Thanks to Willi Herzig
#
# Matthias Rammes
#
##############################################
# $Id: 70_SMLUSB.pm 1000 2013-09-10 19:54:04Z matzefisi $
package main;

use strict;
use warnings;
use Device::SerialPort;

use vars qw{%attr %defs};

my %obiscodes = (
'77070100010800FF' => 'Zählerstand-Bezug-Total',
'77070100020800FF' => 'Zählerstand-Lieferung-Total',
'77070100010801FF' => 'Zählerstand-Tarif-1-Bezug',
'77070100020801FF' => 'Zählerstand-Tarif-1-Lieferung',
'77070100010802FF' => 'Zählerstand-Tarif-2-Bezug',
'77070100020802FF' => 'Zählerstand-Tarif-2-Lieferung',
'770701000F0700FF' => 'Momentanleistung',
'77070100100700FF' => 'Momentanleistung');

#####################################
sub
SMLUSB_Initialize($)
{
  require "$attr{global}{modpath}/FHEM/DevIo.pm";
  my ($hash) = @_;
  $hash->{ReadFn}     = "SMLUSB_Read";
  $hash->{ReadyFn}    = "SMLUSB_Ready";
  $hash->{DefFn}      = "SMLUSB_Define";
  $hash->{UndefFn}    = "SMLUSB_Undef";
  $hash->{GetFn}      = "SMLUSB_Get";
  $hash->{ParseFn}    = "SMLUSB_Parse";
  $hash->{StateFn}    = "SMLUSB_SetState";
  $hash->{Match}      = ".*";
  $hash->{AttrList}   = $readingFnAttributes;
 
 
}

#####################################
sub
SMLUSB_Define($$)
{
  my ($hash, $def) = @_;
  my @a = split("[ \t][ \t]*", $def);
  return "wrong syntax: 'define <name> SMLUSB <devicename>\@baudrate'"
    if(@a < 3);

  DevIo_CloseDev($hash);

  my $name = $a[0];
  my $dev = $a[2];

  $hash->{fhem}{interfaces} = "power";

  if($dev eq "none") {
        Log3 $hash, 1,"SMLUSB $name device is none, commands will be echoed only";
        $attr{$name}{dummy} = 1;
        return undef;
  }

  $attr{$name}{"event-min-interval"} = ".*:30";

  $hash->{DeviceName}   = $dev;

  Log3 $hash, 5, "SMLUSB: Defined";

  my $ret = DevIo_OpenDev($hash, 0, "SMLUSB_DoInit");

  return $ret;
}


#####################################
sub
SMLUSB_Ready($)
{
  my ($hash) = @_;
  return DevIo_OpenDev($hash, 0, "SMLUSB_DoInit")
        if($hash->{STATE} eq "disconnected");


}

#####################################
sub
SMLUSB_SetState($$$$)
{
  my ($hash, $tim, $vt, $val) = @_;
  return undef;
}
#####################################
sub
SMLUSB_Clear($)
{
my $hash = shift;
my $buf;
# clear buffer:
if($hash->{SMLUSB})
   {
   while ($hash->{SMLUSB}->lookfor())
      {
      $buf = DevIo_DoSimpleRead($hash);
      $buf = uc(unpack('H*',$buf));
      }
   }

return $buf;


#####################################
sub
SMLUSB_DoInit($)
{
my $hash = shift;
my $name = $hash->{NAME};
my $init ="?";
my $buf;

SMLUSB_Clear($hash);

return undef;
}

#####################################
sub SMLUSB_Undef($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
delete $hash->{FD};
$hash->{STATE}='close';
$hash->{SMLUSB}->close() if($hash->{SMLUSB});
Log3 $hash, 0, "SMLUSB: Undefined";
return undef;
}

#####################################
# called from the global loop, when the select for hash->{FD} reports data
# This function reads the RAW hex data and hands over the data to parse function when a SML end is detected
# ToDo: Generalize this, so that also other protocols are supported
sub
SMLUSB_Read($)
{
  my ($hash) = @_;
  my $name = $hash->{NAME};
  my $char;

  my $mybuf = DevIo_DoSimpleRead($hash);
  $mybuf = uc(unpack('H*',$mybuf));

  my $usbdata = $hash->{helper}{PARTIAL};

  if(!defined($mybuf) || length($mybuf) == 0) {
        SMLUSB_Disconnected($hash);
        return "";
  }
 
 
  # Find the end of a SML file
  # Source: http://de.wikipedia.org/wiki/Smart_Message_Language
  # ToDo: Sometimes the beginning (1B1B1B1B010101) is not complete. We should clarify this.

  if ((defined $hash->{helper}{PARTIAL}) and ($hash->{helper}{PARTIAL} =~ m/1B1B1B1B1A[0-9A-F]{6}$/)) {
        Log3 $hash, 5, "SMLUSB: End of SML found. Looking for a beginning.";
        if ($hash->{helper}{PARTIAL} =~ m/^1B1B1B1B01010101/) {
          SMLUSB_Parse($hash, $hash->{helper}{PARTIAL} );
          $hash->{helper}{PARTIAL} = "";
          Log3 $hash, 5, "SMLUSB: Beginning of SML File found start parsing";
        } else {
          if ($hash->{helper}{PARTIAL} =~ m/^(1B){0,4}01010101/) {
            $hash->{helper}{PARTIAL} =~ s/^(1B){0,4}01010101/1B1B1B1B01010101/g;
            SMLUSB_Parse($hash, $hash->{helper}{PARTIAL} );
            $hash->{helper}{PARTIAL} = "";
            Log3 $hash, 5, "SMLUSB: Partial beginning of SML File found. Repaired and  start parsing";
          } else {
            # fR einkommentiert 2 Zeilen
            Log3 $hash, 5, "SMLUSB: No beginning of SML File found. Try it anyway, but no guarantee :) -> ". substr($hash->{helper}{PARTIAL},0,50);
            SMLUSB_Parse($hash, $hash->{helper}{PARTIAL} );
            $hash->{helper}{PARTIAL} = "";
          }
        }
  } else {
        $usbdata .= $mybuf;
        $hash->{helper}{PARTIAL} = $usbdata;
        $hash->{PARTIAL} = "";
  }

}

#####################################
sub
SMLUSB_Shutdown($)
{
  my ($hash) = @_;
  return undef;
  Log3 $hash, 0, "SMLUSB: Shutdown";
}

#####################################


#####################################
sub
SMLUSB_Get($@)
{
my ($hash, @a) = @_;

my $msg;
my $name=$a[0];
my $reading= $a[1];
$msg="$name => No Get function ($reading) implemented";
return $msg;
}

#####################################
sub
SMLUSB_Parse($$)
{
  my ($hash,$rmsg) = @_;

  my $telegramm;
  my $scaler;
  my $unit;
  my $direction = "Bezug";

  my $length_all = 0;
  my $length_value = 0;

  my $smlfile = $rmsg;

  # Try to find a SML telegramm in the SML file
 
 
  Log3 $hash, 5, "SMLUSB: Started parsing";

  readingsBeginUpdate($hash);

  while ($smlfile =~ m/7707[0-9A-F]{10}FF[0-9A-F]{16,9999}/) {
    $telegramm = $&;

    # Try to find the OBIS code in the hash of known and supported OBIS codes
    # OBIS Code with the start (7707) is always 8 bit long (16 nible)

    if (defined $obiscodes{substr($telegramm,0,16)}) {

      # OBIS code found start parsing

      $length_all   = 16;
      $length_value = 0;

      # Detect length of status word (very static at the moment)
      # You can find more information if you google for type length field
      # 01 = Statusword not set
      # 62 is (6 = no more tl fields and type = unsigned?, 2 = 2 bytes or 4 hex chars)
     
     
      $length_all+=hexstr_to_signed32int(substr($telegramm,17,1))*2+2;

      # Detect the direction of engergy from the status word

      $direction = "Bezug"       if (substr($telegramm,$length_all-4,2) eq "82");
      $direction = "Einspeisung" if (substr($telegramm,$length_all-4,2) eq "A2");

      # Detect the unit. Also very static and could be improved

                  if (substr($telegramm,$length_all,4) eq "621E") {
                        $unit = "W/h"; }
                  else {
                        $unit = "W"; }

      $length_all+=4;

      # Detect the scaler. Also very static and could be improved

      $scaler=10 if (substr($telegramm,$length_all,4) eq "52FF");
      $scaler=1  if (substr($telegramm,$length_all,4) eq "5200");
      $scaler=1  if (substr($telegramm,$length_all,4) eq "5201");

      Log3 $hash, 5, "SMLUSB: SML Telegram found: $telegramm - Scaler: " . substr($telegramm,$length_all,4);



      # Detect the value length.

      $length_value=hexstr_to_signed32int(substr($telegramm,$length_all+1,1))*2;
      $length_all+=2;

      # If value is bigger than 9999 W/h change to kW/h

                if (sprintf("%.2f",hexstr_to_signed32int(substr($telegramm,$length_all,$length_value-2))/$scaler) > 9999) {
                        $scaler = 10000;
                        $unit = "kW/h"; }


      # Output of results only if a meaningful value is found. Otherwise nothing happens.
# fR Auskommentiert > 0
                if (sprintf("%.2f",hexstr_to_signed32int(substr($telegramm,$length_all,$length_value-2))/$scaler) ) {
                        Log3 $hash, 5, "SMLUSB: Reading BulkUpdate. Value > 0";

                        if ((substr($telegramm,0,16) eq "770701000F0700FF") || (substr($telegramm,0,16) eq "77070100100700FF")) {
                                Log3 $hash, 5, "SMLUSB: Setting state";
                                $hash->{STATE}="$unit: " . sprintf("%.2f",hexstr_to_signed32int(substr($telegramm,$length_all,$length_value-2))/$scaler) . " - $direction";
                                        if ($direction eq "Einspeisung") {
                                                readingsBulkUpdate($hash, $obiscodes{substr($telegramm,0,16)}, sprintf("%.2f",hexstr_to_signed32int(substr($telegramm,$length_all,$length_value-2))/$scaler$
                                        }
                                        else {
                                                readingsBulkUpdate($hash, $obiscodes{substr($telegramm,0,16)}, sprintf("%.2f",hexstr_to_signed32int(substr($telegramm,$length_all,$length_value-2))/$scaler$
                                        }
                        }
                        else {
                                readingsBulkUpdate($hash, $obiscodes{substr($telegramm,0,16)}, sprintf("%.2f",hexstr_to_signed32int(substr($telegramm,$length_all,$length_value-2))/$scaler));
                        }
                }
        }
    else {
      # If no known OBIS code can be found the telegramm will be ignored (or logged)
      # print "No Obis Code found!: " . substr($telegramm,0,16) ."\n";
      # The telegramm  header needs at least to be removed from the smlfile to detect the next one.
      $length_all=16;
    }

    # Remove found telegram from remaining sml file.
    $smlfile = substr($smlfile,index($smlfile,$&)+$length_all+$length_value,length($smlfile));
  }

  # No good crc16 function found or developed yet. This is a todo
  #my $crc = substr($smlfile,length($smlfile)-4,4);
  #print "CRC: $crc - \n";
 
    Log3 $hash, 5, "SMLUSB: Parsing ended";

  readingsEndUpdate($hash, 1);

  return undef;
}

#####################################
sub hexstr_to_signed32int {
    my ($hexstr) = @_;
    #die "Invalid hex string: $hexstr"
    #    if $hexstr !~ /^[0-9A-Fa-f]{1,8}$/;

    my $num = hex($hexstr);
    return $num >> 31 ? $num - 2 ** 32 : $num;
}
#####################################
sub
SMLUSB_Disconnected($)
{
  my $hash = shift;
  my $dev = $hash->{DeviceName};
  my $name = $hash->{NAME};

  return if(!defined($hash->{FD})); # Already deleted
 
  #SMLUSB_CloseDev($hash);
  DevIo_CloseDev($hash);

  $readyfnlist{"$name.$dev"} = $hash; # Start polling
  $hash->{STATE} = "disconnected";

  # Without the following sleep the open of the device causes a SIGSEGV,
  # and following opens block infinitely. Only a reboot helps.
  sleep(5);

  DoTrigger($name, "DISCONNECTED");
}



1;

=pod
=begin html
<a name="SMLUSB"></a>
<h3>SMLUSB</h3>
<ul>
  The SMLUSB module interprets SML Files which are received over a serial connection.</br>
  You can use for example the USB IR Read and write head from volkszaehler.org project.</br>
  <br><br>
  <a name="SMLUSBdefine"></a>
  <b>Define</b>
  <ul>
    <code>define <name> SMLUSB <devicename>\@baudrate'</code>
    <br>
    <br>Defines the device over a serial port<br>
    </pre>
  </ul>
  <a name="SMLUSBattr"></a>
  <b>Attributes</b>
  <ul>
    <li><a href="#event-min-interval">event-min-interval</a></li>
  </ul>
  <br>
</ul>
=end html
=cut

matzefisi

Hallo zusammen,

ich habe jetzt die letzte funktionierende Version im Github wieder aktiv gemacht. Sorry für die Probleme.
Ich werde nächste Woche nochmal prüfen, warum es bei mir läuft aber bei Euch nicht. Der Pollingmode läuft von der Performance her nämlich deutlich besser.

MfG
Matzefisi

zYloriC

Hallo Matzefisi,

die bereitgestellte letzte Version von dir funktioniert bei mir leider auch nicht. Ich bekomme ein einziges

W: 511.00 - Bezug

nach dem fhem-Neustart und im Log steht sekündlich

SMLUSB: End of SML found. Looking for a beginning.

aber es werden keine Werte erfasst und das FileLog wird nicht mit Werten gefüllt. Irgendwie komisch.

Ich hätte gern die Direction-Info, aber irgendwie will es nicht.... schade. Infos zu meiner funktionsfähigen Version sind ja unten in meinem letzten Post.

Viele Grüße, zYloriC

Omega-5

#306
Zitat von: zYloriC am 21 März 2016, 17:16:01
Ich hätte gern die Direction-Info, aber irgendwie will es nicht.... schade. Infos zu meiner funktionsfähigen Version sind ja unten in meinem letzten Post.

Um es nochmal ganz deutlich zu sagen - Es gibt keine Direction-Info!!! Willibauss und ich haben es dir doch schon erklärt. Die Leistung ist immer nur abhängig von deinen aktiven Verbrauchern. Nehmen wir mal an du hast nur einen Kühlschrank mit 180W in Betrieb und es ist dunkel, dann wird die komplette Energie vom Versorger bereitgestellt. Jetzt scheint die Sonne und die Solaranlage liefert 1000W und du schaltest zusätzlich eine Kochplatte mit 1000W ein. Die aktuelle Wirkleistung wird dann mit 1180W angezeigt. Wie soll denn jetzt die Direction-Info aussehen?

Gruß Friedrich
RaspberryPi2, nanoCUL, 3x DS18B20, FS20: 4x Funk-Schalter ST-4, LaCrosseGW,
HomeMatic: HMLAN, HM-WDS10-TH-O, HM_MYS_RelaisBoard,
I2C: HYT221 über modifiziertes Modul I2_I2C_SHT21.pm (Q&D),

zYloriC

Hey Friedrich,

danke mal für den erneuten Versuch. Davon abgesehen, dass es wie angesprochen leider gar nicht mit dem letzten 70_SMLUSB.pm klappt, will ich kurz über meinen Hager-Zähler berichten.

Bei deinem geschilderten Szenario mit Kühlschrank (180W Verbrauch), Kochplatte (1000W Verbrauch) und PV-Anlage (1000W Ertrag) bin ich mir recht sicher, dass mein Zähler 180W und ein "A-->" (Verbrauch) anzeigen würde. Wenn ich die Kochplatte aus machen würde, wären es 820W (Ertrag) mit einem "<--A"

Mangels Sonne kann ich es jetzt nicht testen, hole es aber nach.

Im Hager EHZ363Z5 Handbuch heißt es
ZitatEnergierichtung
Das Symbol +A –> bzw. -A <– ist aktiviert, sobald positive bzw. negative Wirkenergie oberhalb der Anlaufschwelle registriert wird.

Gruß, zYloriC

willybauss

@ zYloriC

Ich weiß so langsam nicht mehr, was Du von uns willst.

In Antwort #294 hat Omega-5 Deinen Zähler-Output aufgeschlüsselt. Darin kommen u.a. "Wirkenergie Total Bezug" und "Wirkenergie Total Lieferung" vor, außerdem die "aktuelle Wirkleistung" - offenbar ohne Vorzeichen.

Wenn der Wert von "Wirkenergie Total Bezug" sich von einer Messung zur nächsten ändert, dann beziehst Du Energie. Der Wert von "Wirkenergie Total Lieferung" wird sich gleichzeitig eben nicht ändern, da Strom nun mal nur in die eine oder andere Richtung fließt.

Wenn  "Wirkenergie Total Lieferung" sich von einer Messung zur nächsten ändert ("Wirkenergie Total Bezug" ändert sich dann nicht), dann lieferst Du Energie ==> das Vorzeichen von "aktuelle Wirkleistung" ist jetzt anders rum.

Alternativ kannst Du  - wie von mir in Antwort #301 beschrieben -  auf die Auswertung der vorzeichenlosen "aktuelle Wirkleistung" ganz verzichten und statt dessen die Leistungen für Bezug/Lieferung aus den Zählerständen  "Wirkenergie Total Bezug" und "Wirkenergie Total Lieferung" ermitteln. Wie das geht habe ich ja dort beschrieben.
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

Omega-5

#309
Hallo Florian,

Asche auf mein Haupt. Von deinem Zähler wird doch ein Status übertragen. Ich habe die Analyse der von dir gelieferten Logs weiter geführt, und siehe da mit der Angabe von Mazefisi aus dem Beitrag #292 habe ich durch Suche nach  A2 bzw 82 die Stelle gefunden. Allerdings kann der Status mit dem aktuellen Programm nicht gefunden werden.

Zitat von: matzefisi am 10 März 2016, 15:19:21
das bildet mein Modul eigentlich schon ab. Und war steht das meiner Erkenntnis nach im Statusword:

77070100010800FF 640101 A2 01 621E 52FF 56 0001450FA101  --> Einspeisung
77070100010800FF 640101 82 01 621E 52FF 56 000145A40201  --> Bezug


Bei dir sieht das so aus:

77070100010800ff Wirkenergie Total Bezug
62 status (TL[1] + unsigned[8])
82 status --> Bezug bzw. a2 --> Lieferung.
01 valTime = not set
62 unit (TL[1] + unsigned[8])
1e unit = Wh
52 scaler (TL[1] + integer[8])
ff scaler = -1
55 value (TL[1] + integer[32])
02ab1b85 value = 44768133 * 10 hoch-1 in Wh
01 valueSignature = not set


Ich hänge auch mal die kommentierte Ausgabe an. Ganz habe ich es immer noch nicht geschafft.
Bei mir läuft immer noch eine etwas modifizierte 70_SMLUSB.pm Version vom 14.Jan.2015. So lange sie klappt werde ich auch nicht updaten.

@ Mazefisi SML und die endlose Baustelle.  ;)

Gruß Friedrich
RaspberryPi2, nanoCUL, 3x DS18B20, FS20: 4x Funk-Schalter ST-4, LaCrosseGW,
HomeMatic: HMLAN, HM-WDS10-TH-O, HM_MYS_RelaisBoard,
I2C: HYT221 über modifiziertes Modul I2_I2C_SHT21.pm (Q&D),

zYloriC

Irgendwie wurde der Ton etwas ruppig... ich danke aber allen für die Unterstützung und Geduld mit meinen Fragen!

Danke Friedrich für die erneute Analyse. Bedeutet das nun, dass mein Zähler die Direction-Info liefert, aber nicht ganz dem Standard entspricht?
Mein altes 70_SMLUSB-Modul enthält zwar auch " $direction = "Bezug" & $direction = "Einspeisung"" aber es zeigt diese Infos nicht an. Alle neueren SMLUSB Versionen aktualisieren keine Werte. Die Schnittstelle ist OPENED und es werden ganz viele SML-Message-Enden gefunden, aber keine Anfänge...

Gibt es absehbare Änderungen, die ich in der letzten 70_SMLUSB vornehmen muss, damit mein Zähler auch "Bezug & Einspeisung" nutzt bzw. anzeigt?? Oder muss ich erstmal abwarten und auf meiner alten SMLUSB bleiben?

Nochmal danke an alle. Schon jetzt, auch ohne Bezug/Einspeisung ein super Modul!!
Viele Grüße, zYloriC

matzefisi

Hallo zusammen,

der Ton ist doch hier zum Glück noch nicht ruppig geworden und es ist ja auch nicht nötig. :)

@zYloriC: Wie Du schon gemerkt hast habe ich leider nich all zu viel Zeit für FHEM und die Module. Und neben dem SML Modul habe ich auch noch ein paar andere Sachen, die ich für mich gerne am laufen hätte (BBQ Thermometer, NIBE Heizung, 2ter und 3ter FHEM RPi im Netz :) ) Daher warte bitte erstmal etwas ab, denn:

Ich arbeite gerade an dem Problem:

Zitat@ Mazefisi SML und die endlose Baustelle.  ;)

Icinger ist gerade dabei den SML Part in sein OBIS Modul einzubauen. Bedeutet dass wir künftig für die Stromzähler nur noch ein Modul haben und damit dann auch das Troubleshooting (hoffentlich) etwas einfacher wird, das mehr Leute an dem Modul bauen. Ich unterstütze Icinger gerade etwas mit den Tests. Sobald er es freigibt, werde ich hier eine Entsprechende Mitteilung geben und mein Modul dann einstellen.

MfG
Matzefisi

Omega-5

#312
Zitat von: zYloriC am 22 März 2016, 22:59:34
Danke Friedrich für die erneute Analyse. Bedeutet das nun, dass mein Zähler die Direction-Info liefert, aber nicht ganz dem Standard entspricht?

Hallo Florian,
SML und Standart, das schließt sich fast aus.  ;)
Im Protokoll sind parametrierbare und herstellerspezifische Daten möglich. Es ist aufwendig sich da durch zu wursteln. Wenn man nach SML sucht, sieht man, dass es auch einige Bibliotheken für verschiedene Programmiersprachen gibt. Ich suche auch noch nach einem Programmablaufplan für einen Parser. Wenn es dich interessiert gibt es hier zwei Protokollbeschreibungen V1.02 http://www.itrona.ch/downloads.html und hier V1.03 http://www.emsycon.de/downloads/SML_081112_103.pdf.
In diesem Zusammenhang kommt dem "Typ-Length-Field" eine Bedeutung zu. Mazefisi testet an der entsprechenden Stelle auf "64"hex d.h. Unsigned24 (3 Byte) und das gibt es im Standardprotokoll nicht (EMSYCON GmbH, Dr. M. Wisy Seite 35/36).
Bei dir sind es "62"hex --> Unsigned8 --> 1 Byte "82" oder "A2" für den Status. Ich gehe mal davon aus, dass Mazefisi das aus der Ausgabedatei eines anderen Zählers hat, oder es sich schlicht um einen Übertragungsfehler handelt.
Jedenfalls müsste man  ;)  an dieser Stelle im Programm ansetzen.

Gruß Friedrich
RaspberryPi2, nanoCUL, 3x DS18B20, FS20: 4x Funk-Schalter ST-4, LaCrosseGW,
HomeMatic: HMLAN, HM-WDS10-TH-O, HM_MYS_RelaisBoard,
I2C: HYT221 über modifiziertes Modul I2_I2C_SHT21.pm (Q&D),

matzefisi

Hallo zusammen,

ich habe mir gerade nochmal zYloriC´s SML code angeschaut und durch meinen Parsertest laufen lassen. Im Parsertest funktioniert das Erkennen der Energierichtung einwandfrei. Mir fällt aber gerade ein, dass ich einen Commit zugelassen habe und es eine Änderung im FHEM gegeben hat, die den State beeinflusst haben. (Das Problem liegt glaube ich in Zeile 307)

@zYloriC:

Geht auch dieses Version nicht bei dir? https://github.com/matzefisi/fhem-70_SMLUSB/blob/master/70_SMLUSB.pm
Ich habe die Änderungen bzgl. Polling Mode erstmal wieder entfernt und demnach müsste es zumindest laufen. Es kann sein dass es noch Probleme mit dem STATE gibt, aber die Readings sollten zumindest gefüllt werden.

Du könntest dir Quick&Dirty aber ein neues Reading mit der Flussrichtung erzeugen, indem du in dem Modul eine Zeile hinzufügst (z.B. in Zeile 274)
  readingsBulkUpdate($hash, $obiscodes{"direction")}, $direction);

Und dann kannst Du ein stateFormat Attribut anlegen mit folgendem Inhalt:
W: power - direction

Ich kann es leider gerade nicht testen, aber damit sollte die Energierichtung bei dir wieder auftauchen.

MfG
Matzefisi

Oswald

Hallo Matthias,
ich lese, dank Deiner Hilfe meinen Stromzähler MT681 EDL21/40 mit dem Modul SMLUSB und dem USB-Infrarot-Lesekopfes von Udo aus. Das hat auch gut funktioniert bis vor kurzem. Aber seit Ende Februar bekomme ich immer folgende Fehlermeldung in fhem..log Datei. Dies passiert bei jedem Auslesen des Zählers. Mir ist das jetzt erst aufgefallen nach dem das System sehr träge wurde und die fhem...log immer größer wurde. Ich habe am System nichts geändert nur upgedatet. Hast Du eine Idee was da schief läuft?


Auszug aus der fhem-2016-02.log
2016.02.28 14:18:30 3: powerZaehler device opened
Useless use of subtraction (-) in void context at (eval 30) line 1, <$fh> line 70.
2016.02.28 14:18:32 3: Verbrauch: Bareword "statZaehlerstand" not allowed while "strict subs" in use at (eval 30) line 1, <$fh> line 70.
Bareword "Bezug" not allowed while "strict subs" in use at (eval 30) line 1, <$fh> line 70.

2016.02.28 14:18:32 1: Including ./log/fhem.save
2016.02.28 14:18:32 3: WARNING: unsupported character in reading Zählerstand-Bezug-Total (not A-Za-z/\d_\.-), notify the SMLUSB module maintainer.
2016.02.28 14:18:32 3: WARNING: unsupported character in reading Zählerstand-Tarif-1-Bezug (not A-Za-z/\d_\.-), notify the SMLUSB module maintainer.
2016.02.28 14:18:32 1: usb create starting
2016.02.28 14:18:34 3: Probing CUL device /dev/ttyAMA0
2016.02.28 14:18:34 3: Can't open /dev/ttyAMA0: Keine Berechtigung
2016.02.28 14:18:34 1: usb create end
2016.02.28 14:18:34 0: Featurelevel: 5.7
2016.02.28 14:18:34 0: Server started with 19 defined entities (fhem.pl:10769/2016-02-08 perl:5.020002 os:linux user:fhem pid:10783)
2016.02.28 14:18:35 1: PERL WARNING: Useless use of subtraction (-) in void context at (eval 34) line 1.
2016.02.28 14:18:35 2: Bareword "statZaehlerstand" not allowed while "strict subs" in use at (eval 34) line 1.
Bareword "Bezug" not allowed while "strict subs" in use at (eval 34) line 1.

2016.02.28 14:18:35 1: PERL WARNING: Useless use of subtraction (-) in void context at (eval 35) line 1.
2016.02.28 14:18:35 2: Bareword "statZaehlerstand" not allowed while "strict subs" in use at (eval 35) line 1.
Bareword "Bezug" not allowed while "strict subs" in use at (eval 35) line 1.

2016.02.28 14:18:35 1: PERL WARNING: Useless use of subtraction (-) in void context at (eval 36) line 1.
2016.02.28 14:18:35 2: Bareword "statZaehlerstand" not allowed while "strict subs" in use at (eval 36) line 1.
Bareword "Bezug" not allowed while "strict subs" in use at (eval 36) line 1.