SML Stromzähler per USB Schreib-Lesekopf?

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

Vorheriges Thema - Nächstes Thema

ritchie

Hallo Hungery,

ich schreibe die Antwort hier, da sich diese Frage wohl andere auch stellen.

Den Script kann man in jedem Verzeichnis ablegen. Ich habe diesen Script im Home-Verzeichnis von pi abgelegt, also "/home/pi".

Wichtig ist jedoch, das man den USB Port in der Datei entsprechend anpasst.
Da ich einen USB Hub angeschlossen habe, verwendet der Script /dev/ttyUSB4.

Dies ist mir leider zu spät aufgefallen. Hier müsste man wohl auf /dev/ttyUSB0 oder /dev/ttyUSB1
für einen Standard Raspberry PI die Datei ändern.

Bin jetzt längere Zeit offline, hoffe aber, das andere hier auch Hilfestellung geben können, da
diese Script eine Abwandung des Volkszähler Script ist.

Viele Grüße

R.



IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

Dennis D.

Zitat von: ritchie schrieb am Mi, 11 September 2013 20:10Hi,

 könnt Ihr testweise mal den angehangen Script bei Euch starten....

Hi ritchie,

leider hab ich es erst heute geschafft wieder was zu machen. Habe gerade mal Dein Script ausprobiert. Habe den Lesekopf jedoch an /dev/ttyAMA0" angeschlossen. Funktioniert trotzdem *g* Hier das Ergebnis:


root@raspberrypi:/home# perl Ehzscript.pm
Schnittstellenlesefehler redu = 0 ; count = 0 <>
read 312 chars
Wert Wirkleistung L2 key=0100150700FF, pos=20, len=10   Value : 0
Wert Spannung L3 key=0100480700FF, pos=20, len=10   Value : 0
Wert Spannung L2 key=0100340700FF, pos=20, len=10   Value : 0
Wert Strom L3 key=0100470700FF, pos=20, len=10   Value : 0
Wert Aktuelle Chiptemperatur key=010060320002, pos=20, len=10   Value : 0
Wert Zählerstand Tarif 2 key=0100010802FF, pos=20, len=10   Value : 9600.7
Wert Wirkleistung L1 key=0100150700FF, pos=20, len=10   Value : 0
Wert Hersteller-Identifikation key=8181C78203FF, pos=20, len=10   Value : 2578658099.2
Wert Strom L2 key=0100330700FF, pos=20, len=10   Value : 0
Wert Zählerstand Totalregister key=0100010800FF, pos=20, len=10   Value : 1434094464.1
Wert Maximale Chiptemperatur key=010060320004, pos=20, len=10   Value : 0
Wert Spannungsmaximum key=010060320304, pos=20, len=10   Value : 0
Wert Gemittelte Chiptemperatur key=010060320005, pos=20, len=10   Value : 0
Wert Minimale Chiptemperatur key=010060320003, pos=20, len=10   Value : 0
Wert Wirkleistung L3 key=0100290700FF, pos=20, len=10   Value : 0
Wert Geräteeinzelidentifikation / Server-ID key=0100000009FF, pos=20, len=10   Value : 32614540939.9
Wert Spannungsminimum key=010060320303, pos=20, len=10   Value : 0
Wert öffentlicher Schlüssel key=8181C78205FF, pos=20, len=10   Value : 47453752429.6
Wert Strom L1 key=01001F0700FF, pos=20, len=10   Value : 0
Wert Zählerstand Tarif 1 key=0100010801FF, pos=20, len=10   Value : 86092293504.7
Wert Spannung L1 key=0100200700FF, pos=20, len=10   Value : 0
Wert aktuelle Wirkleistung key=01000F0700FF, pos=20, len=10   Value : 101363685977.7
root@raspberrypi:/home#


Gruß,
Dennis
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

Hungry

Hallo,

stimmen Deine Werte mit dem Zählerstand überein?
Habe mir bisher keinen Reim daraus machen können.

Hier meine Daten:

root@raspberrypi:/opt/fhem/FHEM# perl Ehzscript.pm
read 324 chars
Wert Wirkleistung L2 key=0100150700FF, pos=20, len=10   Value : 0
Wert Spannung L3 key=0100480700FF, pos=20, len=10   Value : 0
Wert Z√§hlerstand Tarif 1 key=0100010801FF, pos=20, len=10   Value : 22765784448.1
Wert Spannung L2 key=0100340700FF, pos=20, len=10   Value : 0
Wert Z√§hlerstand Tarif 2 key=0100010802FF, pos=20, len=10   Value : 37798169984.1
Wert Strom L3 key=0100470700FF, pos=20, len=10   Value : 0
Wert Aktuelle Chiptemperatur key=010060320002, pos=20, len=10   Value : 0
Wert Wirkleistung L1 key=0100150700FF, pos=20, len=10   Value : 0
Wert Z√§hlerstand Totalregister key=0100010800FF, pos=20, len=10   Value : 57144141451.9

Dennis D.

Neee, übereinstimmen tun die nicht. Die müssen noch irgendwie umgerechnet werden. Auch bei vzlogger waren die Ergebnisse nicht mit den Werten auf dem Zähler-Display identisch. Habe aber auch noch nicht herausgefunden wie.
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

matzefisi

Ja, ich habe auch schon die Erfahrung gemacht, dass die Werte unterschiedliche Faktoren haben Und ich weiß auch noch nicht, wie ich das im Modul abbilden soll. Bin gerade dabei nochmal das SML Protokoll auseinander zu nehmen. Ich meine ich hätte da ein Feld names Faktor oder so gesehen. Bei mir (ED300L) muss ich durch 1000 und den aktuellen Verbrauchswert durch 10 teilen.

MfG
Matthias

Dennis D.

Ja, bei dem eHZ ist das ähnlich. Ausgelesener Wert durch 10000 um auf kWh zu kommen! Laut Spezifikationen hat der Zähler eine Auflösung von 100mWh. Also durch 10 teilen um auf Wh zu kommen und dann halt durch 1000 um auf kWh zu kommen. Bei der Wirkleistung muss glaub ich nur durch 10 geteilt werden.
Habe aber schon eine Erklärung für die abweichenden Werte bei mir: Das Script ist ja fürn Easymeter-Zähler. Der hat aber andere Channel-ids als der EMH-Zähler. Muss das Script also dementsprechend anpassen. Die IDs für Deinen ED300L und meinen eHZ müssten identisch sein. Probier mal in dem Ehzscript.pm folgende Zeilen (68-71)zu ändern:


  'Zählerstand Totalregister' => ['0100010800FF',20,10],
  'Zählerstand Tarif 1' => ['0100010801FF',20,10],
  'Zählerstand Tarif 2' => ['0100010802FF',20,10],
  'aktuelle Wirkleistung' => ['01000F0700FF',20,10],

in

  'Zählerstand Totalregister' => ['070100010800FF',20,10],
  'Zählerstand Tarif 1' => ['070100010801FF',20,10],
  'Zählerstand Tarif 2' => ['070100010802FF',20,10],
  'aktuelle Wirkleistung' => ['0701000F0700FF',14,8],


Alle Werte des EMH-Zählers (eHz und ED300L) müssten dann in Wattstunden (Wh) korrekt angezeigt werden.

Ich weiß zwar nicht wie das umzusetzen wäre, aber in einem FHEM-Modul müsste man irgendwie alle Channel-ids hinterlegen und dann halt im define die Channels für den eigenen Zähler filtern. Z.B. so:

define [Zählername] MODULNAME <Zählertyp> <Adresse>
bzw.
define MeinZaehler EHZ_SML EMH /dev/ttyAMA0
oder
define MeinZaehler EHZ_SML Easymeter /dev/ttyUSB1

Gruß,
Dennis
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

Hungry

Hallo Dennis,

habe das Script geändert.
Ausgabe jetzt:

root@raspberrypi:/opt/fhem/FHEM# perl Ehzscript.pm
Schnittstellenlesefehler redu = 0 ; count = 0 <>
read 324 chars
Wert Wirkleistung L2 key=0100150700FF, pos=20, len=10   Value : 0
Wert Spannung L3 key=0100480700FF, pos=20, len=10   Value : 0
Wert Spannung L2 key=0100340700FF, pos=20, len=10   Value : 0
Wert Strom L3 key=0100470700FF, pos=20, len=10   Value : 0
Wert Aktuelle Chiptemperatur key=010060320002, pos=20, len=10   Value : 0
Wert Zählerstand Tarif 2 key=070100010802FF, pos=20, len=10   Value : 98786705587.3
Wert Wirkleistung L1 key=0100150700FF, pos=20, len=10   Value : 0
Wert Strom L2 key=0100330700FF, pos=20, len=10   Value : 0
Wert Zählerstand Totalregister key=070100010800FF, pos=20, len=10   Value : 57695692427.9
Wert Zählerstand Tarif 1 key=070100010801FF, pos=20, len=10   Value : 44240620928.1


Mein Zählerstand ist bei Tarif 1 Obis 1.8.1    -  3.416 Kwh
und bei                          Tarif 2 Obis 1.8.2    -  5.859 Kwh

macht zusammen  9.275 Kwh.

Passt also von der Umrechnung immer noch nicht.

Gruß
Hungry

Hungry

Da habe ich gleich noch eine Frage,
was hat es denn mit dem Key auf sich,
bzw. was wird damit definiert?

Durch Änderung am Script hat sich bei mir der Wert geändert.

Ist das also der Faktor?

matzefisi

Hi zusammen,

nein, key pos und length werden für die Perl Funktion substr() benutzt. Also um aus einer ganzen SML Datei bestimmte Teile auszuschneiden. Und da ist anscheinend wieder jeder Zähler und teilweise auch jede Variable anders.

Das hier ist z.B. eine RAW Ausgabe von meinem Leser:


1B1B1B010101017607000A026BF23F620062007263010176010107000A01D4A61509080C2AEE2D4C4FB20101635B1E007607000A026BF2406200620072630701
770109080C2AEE2D4C4FB2070100620AFFFF7262016501D49D2C7A77078181C78203FF0101010104454D4801
77070100000009FF0101010109080C2AEE2D4C4FB201
77070100010800FF6401018201621E52FF560001890D2A01
77070100020800FF6401018201621E52FF560002AB146F01
77070100010801FF0101621E52FF560001890D2A01
77070100020801FF0101621E52FF560002AB146F01
77070100010802FF0101621E52FF56000000000001
77070100020802FF0101621E52FF56000000000001
770701000F0700FF0101621B52FF650000071401
77078181C78205FF017262016501D49D2C01018302B129F735283A1BDE947854998A99985F91CF8C227D56885A7C54ED898B6BA534930154A11599F522F3DC0080223AC
77A010101633F15007607000A026BF24362006200726302017101632F21000000001B1B1B1B1A033187


Wobei dann
77070100010800FF6401018201621E52FF560001890D2A01
der Teil für den Wert 1.0.8 ist. Und der eigentliche Wert ist: 1890D2A. Irgendwo in dieser Zeile müsste aber auch ein Faktor zu finden sein. Der Wert 82 gehört z.B. zum Statuswort und bedeutet, dass mein Zähler gerade im Bezugmodus arbeitet. Also ich speise zur Zeit nichts ein.

Siehe dazu auch:
http://de.wikipedia.org/wiki/Smart_Message_Language
http://wiki.volkszaehler.org/software/sml

Wer schon mal mit den Anfängen vom Modul rumspielen möchte kann das hier tun:
https://github.com/matzefisi/fhem-modules
Wichtig! Das Modul ist noch im absoluten Bastelzustand. Es legt aktuell noch keine Readings an, sonder gibt nur Rohdaten im FHEM Log aus!
Und es werden noch massive Änderungen am Modul passieren, was das Parsing angeht. Aber so könnt Ihr ja schon mal draufschauen.

MfG
Matthias

matzefisi

Hab die Seite wiedergefunden:
http://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/emh-ehz-h1

Da wird beschrieben, dass es je zwei Byte für die Einheit und den Scaler, also den Faktor, gibt:

              07 01 00 01 08 00 FF             objName 1-0:1.8.0*255
                                                Wirkarbeit Bezug total
               63 01 82                         status = unsigned 16
               01                               valTime
               62 1E                            unit (unsigned8) 1E = Wh
               52 FF                            scaler (int8) -1 = *10^-1 = /10
               56 00 01 29 71 4F                value  19493967/10 = 1949396,7 Wh = 1949,3967 kWh
               01                               valueSignature (leer)

matzefisi

So, die erste Version mit neuem parsing und funktionierenden Readings ist online.
https://github.com/matzefisi/fhem-modules

Das Modul wird demnächst nochmal umbenannt um auch den anderen Standard abbilden zu können.

(siehe Anhang / see attachement)

Dennis D.

WOW! Das ging ja jetzt mal schnell! Habs gleich mal ausprobiert. Et löööpt!


(siehe Anhang / see attachement)


Momentanleistung wird korrekt ausgelesen.
Zählerstand Bezug Tarif 1 wird korrekt ausgelesen und entspricht dem aktuellen Zählerstand.
Mit den restlichen Werten kann ich nichts anfangen. Ist kein Zweirichtungszähler und es wird auch nix eingespeist. Ist quasi ein 08-15 Haushaltszähler.

Soweit sieht das aber echt brauchbar aus. Wünschenswert wäre nun die Rundung (oder das Abschneiden) der Werte auf nur noch eine Nachkommastelle.

Ne Frage nebenbei: Wie realisier ich nun, dass man vom Zählerstand den Tagesverbrauch ableiten kann. Kann man das im Logfile machen?

Gruß,
Dennis

 
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

matzefisi

Hi Dennis,
ZitatMomentanleistung wird korrekt ausgelesen.
Zählerstand Bezug Tarif 1 wird korrekt ausgelesen und entspricht dem aktuellen Zählerstand.
Sehr gut :)

ZitatMit den restlichen Werten kann ich nichts anfangen. Ist kein Zweirichtungszähler und es wird auch nix eingespeist. Ist quasi ein 08-15 Haushaltszähler.
Kann es sein, dass Du zwei unterschiedliche Tarife hast? Nachtstrom z.B.? Bei mir springt der Zähler im Display alle X Sekunden von Bezug auf Einspeiseanzeige um. Soweit ich weiß können die Zähler aber auch zwei unterschiedliche Strompreise (Tarife) abbilden. Mein Zähler für die Wärmepumpe macht das zum Beispiel. Es sind bei Dir aber valide Werte. Das heißt: Das Script funktioniert nur der Zähler liefert dann entsprechend etwas komisches.

Um das zu debuggen könntest Du mal das Modul wie folgt abändern:


  if ($usbdatastore =~ m/1B1B1B1B1A[0-9A-F]{6}$/) {
    SMLUSB_Parse($hash, $usbdata);
        $usbdatastore = "";
  } else {
   $usbdata .= $mybuf;
   $usbdatastore = $usbdata;
  }


Ersetzten durch (Oder die Loggingzeile hinzufügen)


  if ($usbdatastore =~ m/1B1B1B1B1A[0-9A-F]{6}$/) {
    SMLUSB_Parse($hash, $usbdata);
    Log 1, "SMLUSB RAW: $usbdata";
    $usbdatastore = "";
  } else {
   $usbdata .= $mybuf;
   $usbdatastore = $usbdata;
  }


Dann sollte ein ganzer Haufen an HEX-Zahlen im FHEM Log erscheinen. Das ist dann ein komplettes SML File von Deinem Zähler und das könnten wir dann hier mal auseinandernehmen.
Wichtig! Wenn Du ein paar Files hast, das logging unbedingt wieder auskommentieren! Ansonsten läuft irgendwann Dein Log voll.

ZitatSoweit sieht das aber echt brauchbar aus. Wünschenswert wäre nun die Rundung (oder das Abschneiden) der Werte auf nur noch eine Nachkommastelle.
Ne Frage nebenbei: Wie realisier ich nun, dass man vom Zählerstand den Tagesverbrauch ableiten kann. Kann man das im Logfile machen?
Rundung, Tagesverbrauchswerte usw. kommen noch. Ich bin erstmal froh, dass ich gestern soweit gekommen bin. Problem ist auch noch, dass meine Readings keine Events erzeugen und somit noch nichts in irgendwelche Logs geschrieben wird.

Wenn Ihr wollt, könnt Ihr Ideen oder auch Fehler gerne hier mit angeben https://github.com/matzefisi/fhem-modules/issues

MfG
Matthias

Dennis D.

Hi Matthias,

ne, habe nur einen Tarif. Wie gesagt, nur Haushaltsstrom. Heizung läuft über Gas. Für Wärmepumpen wird vom Netzbetreiber aus meist ein separater Zähler verwendet.

Das nur Zählwerk 1 aktiv ist sieht man ja, dass er bei "Zählerstand Tarif 2 Bezug" ne "0" stehen hat.

Debuggen kann ich erst heut Abend. Vorschläge werde ich mal bei github schreiben. (muss ich mich dafür da registrieren oder kann man da einfach so seinen senf dazugeben?).

Gruß,
Dennis
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

matzefisi

Hi Dennis,

mmmh ok, das ist komisch. Keine Ahnung wo dann die anderen Werte herkommen. Müssen wir mal beobachten ob das evtl. auch bei anderen Leuten auftritt.

Gerade gesehen, dass schon jemand bei Github aktiv war :). Ja man muss sich dort registrieren. Wer das nicht möchte, kann aber auch gerne hier posten, ich werde das dann entsprechend übertragen.

MfG
Matthias