Forum: Haus & Smart Home Stromzähler EFR SGM C8 auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Franko P. (sgssn)


Lesenswert?

Hallo
hab nen neuen Stromzähler von EFR bekommen. Der hat neben dem Display 
eine IR-LED die permanent ungefragt Daten ausspuckt. Hab mal ein 
IR-Leser mit UART Schnittstelle drangehalten und mit dem PC 
aufgezeichent, komm aber nicht damit klar, was die Werte bedeuten.
Baudrate 9600 sollte stimmen, im Datenbereich kommt immer wieder die 
Kombination "EFR" vor. ich tippe mal darauf, dass da immer ein neuer 
datensatz beginnt. Hat sich damit mal einer beschäftigt und die Daten 
"entschlüsselt"

Gruß

von 900ss (900ss)


Lesenswert?

Für Tasmota gibt es ein Script für einen EFR Zähler. Nicht deiner.

https://tasmota.github.io/docs/Smart-Meter-Interface/#easymeter-q1d-ascii-obis

Wenn du da recht weit runter scrollst, findest du die Scripte für alle 
möglichen Zähler, auch einen EFR.
Vielleicht spricht ja dein Zähler ähnlich.

von Franko P. (sgssn)


Angehängte Dateien:

Lesenswert?

Ah, ok danke, schau ich mir an.
Mich wundert nur, dass ich Daten nicht anfordern muss, sondern das 
sprudelt von selber.
Hab mal mitgeloggte Daten (programm terminal.exe) angehängt. Was mich 
auch wundert ist, dass die Datensätze offenbar nicht gleich lang sind. 
Könnte es sein, dass das Notebook mit den Daten überfordert ist und 
Daten verschluckt?
ich hab die daten etwas formatiert, die beginnen alle mit "EFR".

gruß

: Bearbeitet durch User
von Franko P. (sgssn)


Lesenswert?

@900ss. Duc Fahrer oder was :-)

von Gunnar F. (gufi36)


Lesenswert?

Ich habe das kürzlich mit einer Fotodiode und Transimpedanzverstärker 
gemacht:
Beitrag "SYNA Holley Smart-Stromzähler defekt - angeblich 50.000 Stück betroffen!"

Hast du an die notwendige Invertierung gedacht? Bei meinem ersten 
Versuch fehlte die noch und es kam nur Müll raus.

von 900ss (900ss)


Angehängte Dateien:

Lesenswert?

Franko P. schrieb:
> Duc Fahrer oder was :-)

Das Modell im Vordergrund :)

: Bearbeitet durch User
von Franko P. (sgssn)


Lesenswert?

Wahnsinn, ne echte Desmo, sieht aus wie Neu. Respekt! Gratuliere!

von Franko P. (sgssn)


Lesenswert?

Hallo
ne ich denke nicht, dass da ne Invertierung fehlt. Ich hab da so nen 
gekauften IR-Leser für diese Stromzähler. Und meiner hat ne 
UART-Schnittstelle spezifiziert, mit der ich dann auf nen 
UART-USB-Wandler gehe und damit rein ins Notebook. Und bei den daten 
wiederholen sich immer wieder die Daten

45 46 52 22 03 und die "45 46 52" = EFR, 22 könnte für die Anzahl der 
folgenden Byte stehen und die 3 vielleicht für 3-Phasig, danach kommt
E2 D7 AB, das könnten die Phasenspannungen sein. Aber danach? Am 
Stromzählerdisplay kann ich die Leistung ablesen, die gerade aufgenommen 
wird, und das passt irgendwie nicht zu dem was danach an Daten kommt.

Gruß

von Sascha W. (sascha-w)


Lesenswert?

Hab den selben Zähler. Zur Auswertung der Daten im SML-Format verwende 
ich NodeRed. Im Lieferzustand gibt er außer paar Daten wie Hersteller 
(EFM) und Versionsnummer den Bezugszählerstand 1.8.0 und den 
Einspeisezählerstand 2.8.0
auf 0.1Wh genau aus. Hab mir die Pin vom Netzbetreiber schicken lassen. 
Dann gibts zusätzlich:
Strom L1, L2, L3
Leistung L1, L2, L3, Gesamt
Spannung L1, L2, L3
Netzfrequenz
und 5 Phasenwinkel

Für NodeRed gibts dazu ein entsprechendes Smartmeter Plugin.
9600Baud 8N1 passt.

Sascha

von 900ss (900ss)


Lesenswert?

Sascha W. schrieb:
> Für NodeRed gibts dazu ein entsprechendes Smartmeter Plugin

Oh, interessant.  Ich habe zwar nicht den gleichen Zähler aber einen 
anderen der SML ausgibt. Danke gut den Hinweis.

von 900ss (900ss)


Lesenswert?

Franko P. schrieb:
> Wahnsinn, ne echte Desmo, sieht aus wie Neu. Respekt! Gratuliere!

Danke. Ich habe das Moped schon seit 1986 (ist Bj. 1981). Allerdings war 
sie damals silber/blau. Rot sind sie "alle" deshalb ist meine 
schwarz/gold. ;) Und es gefällt mir wirklich besser.

: Bearbeitet durch User
von Peter R. (peter_r689)


Lesenswert?

Hallo,
mal zurück zur eigentlichen Frage. Der Zähler liefert alle Sekunde den 
Datensatz mit den Zählerständen. Ohne Freischaltung nur die Daten, die 
auch auf dem Display zu sehen sind. Nach Freischaltung per PIN auch 
einiges mehr, wie die momentane Leistung. Die lässt sich gut nutzen, den 
eigenen Verbrauch zu analysieren oder sogar Leistungen zu steuern, um 
eine Einspeisung zu minimieren.
Und der Zähler liefert die Daten nach dem SML-Protokoll. Tasmota kann 
das dekodieren, sowie auch andere Auslesegeräte meinzaehler.com 
powerfox.de -> einfach googeln ;-)

Gruß Peter

von Mario M. (thelonging)


Lesenswert?


von 900ss (900ss)


Lesenswert?

Es gibt einen fertigen Lesekopf der mit Tasmota geliefert wird. Ich 
nutze den und er funktioniert gut.

Info dazu:
https://sites.google.com/view/hichi-lesekopf/startseite

Der Kopf zum kaufen in der Bucht:
https://www.ebay.de/itm/315375748332

Die Seite mit den Scripten hatte ich oben schon verlinkt. Dein Zähler 
taucht da nur nicht auf. Ein anderer von EFR allerdings schon.

Du musst dir "nur" für deinen Zähler das passende Script bauen. Dann 
liefert dir der Lesekopf alles z.B. per MQTT.
Es sei denn du möchtest gerne alles selber bauen.

Du müsstest auch prüfen ob die Sender-Empfangsbohrungen vom Abstand 
passen von deinem Zähler und dem Kopf. Ich weiß nicht ob das "genormt" 
ist.

: Bearbeitet durch User
von Franko P. (sgssn)


Lesenswert?

Mein Lesekopf sieht genauso aus wie der Tasmota. Ich habe jetzt nur 2 
Probleme. Zum einen eben, dass ich nicht weiss, was die Daten bedeuten 
und dass ich den Eindruck habe, dass nein Notebook überfordet ist. Aber 
letzteres lässt sich schon lösen. Und ich brauch schon die Bedeutung der 
daten, da das Ganze Teil einer Überwachung auf uC-Basis werden soll. Ich 
lese mir mal durch was es da oben alles an Infos und Links gegeben hat. 
Da bin ich beschäftigt. Danke erst mal.

Gruß

von 900ss (900ss)


Lesenswert?

Franko P. schrieb:
> Und ich brauch schon die Bedeutung der daten

Vielleicht mal freundlich beim Hersteller fragen. Vielleicht schicken 
sie dir das Protokoll. Oder im Forum zu Tasmota schauen, evtl. hast das 
schon jemand gelöst und es wurde nur kein Script in der Sammelseite, die 
ich bekomme hatte, aufgeführt.

Sascha hat oben schon geschrieben, dass er die Daten mit NodeRed 
auswertet. Also da müsste ja was zu holen sein. Evtl. über das Plugin zu 
NodeRed.

: Bearbeitet durch User
von Franko P. (sgssn)


Lesenswert?

Ja danke. Beim Hersteller hab ich schon nachgefragt: Es gibt nichts was 
es nicht schon auf der Homepage an Downloads gibt. Also ja, werd ich mal 
die Qullen oben absuchen. Hatte ja gehofft hier jemanden zu finden, der 
da schon reingekrochen ist.....

: Bearbeitet durch User
von Peter Z. (hangloose)


Lesenswert?

Bei meinem Holley Zähler...
Der komplette Datensatz startet immer mit

1B 1B 1B 1B 01 01 01 01

Die letzten beiden Bytes bevor wieder die Startsequenz kommt sind die
CRC16 Checksumme

Der Bezug Datensatz startet bei mir mit
77 07 01 00 01 08 00 ff
Wobei der Zählerstand in den letzten Bytes bevor es wieder mit 01 77
weitergeht stehen sollte. Diesen Wert dann durch 10000 teilen, dann hat
man den Bezug in kWh.

Der Einspeise Datensatz startet bei
77 07 01 00 02 08 00 ff

Hier findet man auch einiges...

https://www.stefan-weigert.de/php_loader/sml.php

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Also das Plugin für Nodered baut auch auf einer SML Bibliothek auf die 
es bei Github gibt - ist halt Java Script. Würde mich nicht wundern wenn 
es das auch in C gibt. Die Frage ist ob man den kompletten Dekoder in 
einen μC einbauen will, Tasmota macht das meines Wissens auch nur so das 
es im Datenstrom nach bestimmten Mustern sucht wie Beispielsweise 1.8.0.
Die Register des EFM für die restlichen Werte kann ich mal raussuchen 
und hier einstellen.

Sascha

von Franko P. (sgssn)


Lesenswert?

Ah super, jetzt kommt Licht ins Dunkel!
danke und Gruß

von Sascha W. (sascha-w)


Angehängte Dateien:

Lesenswert?

Hallo,

hab mal eine Doku vom -C4 angehangen die ich im Internet gefunden habe, 
dort stehen auch die OBIS-Codes drin, die mit den ausgelesenen des C8 
übereinstimmen.

In der Textdatei die ausgelesenen Werte aus NodeRed mit Smartmeter-Node 
als dekodierte Rohdaten der einzelnen Register.

Gruß Sascha

hier noch die SML-Lib auf Github
https://github.com/Apollon77/smartmeter-obis

: Bearbeitet durch User
von Franko P. (sgssn)


Lesenswert?

Super, danke für Eure Bemühungen.

Jetzt muss ich erst mal meinen uC dafür programmieren, damit ich dann 
die Werte rausfiltern kann.

Danke nochmal an Alle und Gruß

von Schorsch Z. (schorsch_z)


Lesenswert?

import re

def extract_sml_values(data):
    def find_value(obis_code, length, scale_factor):
        pattern = obis_code + r'.*?(?P<value>[0-9a-fA-F]{' + 
str(length*2) + '})'
        match = re.search(pattern, data)
        if match:
            value = int(match.group('value'), 16)
            return value / scale_factor
        return None

    consumption = find_value('77070100010800ff', 3, 10000)
    production = find_value('77070100020800ff', 3, 10000)
    power = find_value('77070100100700ff', 2, 1)

    return {
        'consumption': consumption,
        'production': production,
        'power': power
    }

# Example usage:
sml_data = 
"010950312e30312e30320101016305f500760500088fef62006200726302017101631fb 
200001b1b1b1b1a01b3bf1b1b1b1b01010101760500088ff06200620072630101760107f 
fffffffffff050002daa60b0a014546522303e3ffaa7262016402db4f0163a78b0076050 
0088ff162006200726307017707ffffffffffff0b0a014546522303e3ffaa070100620af 
fff7262016402db4ff108770701006032010101010101044546520177070100600100ff0 
10101010b0a014546522303e3ffaa0177070100010800ff641c01047262016402db4f621 
e52ff64043f040177070100020800ff017262016402db4f621e52ff641037f3017707010 
0100700ff0101621b5200523e0177070100240700ff0101621b520052150177070100380 
700ff0101621b5200521701770701004c0700ff0101621b520052110177070100200700f 
f0101622352ff6309380177070100340700ff0101622352ff6309440177070100480700f 
f0101622352ff63094a01770701001f0700ff0101622152fe628f0177070100330700ff0 
101622152fe62630177070100470700ff0101622152fe62500177070100510701ff01016 
208520052790177070100510702ff0101620852005300f00177070100510704ff0101620 
85200530112017707010051070fff010162085200530118017707010051071aff0101620 
8520053011b01770701000e0700ff0101622c52ff6301f30177070100000200000101010 
10630312e30330177070100605a020101010101054635344201770701006161000001010 
101030000017707010060320104010101010950312e30312e303201010163484e0076050 
0088ff26200620072630201710163347400001b1b1b1b1a013b8f1b1b1b1b01010101760 
500088ff36200620072630101760107ffffffffffff050002daa70b0a014546522303e3f 
faa7262016402db5001634dad00760500088ff462006200726307017707ffffffffffff0 
b0a014546522303e3ffaa070100620affff7262016402db50f1087707010060320101010 
10101044546520177070100600100ff010101010b0a014546522303e3ffaa01770701000 
10800ff641c01047262016402db50621e52ff64043f040177070100020800ff017262016 
402db50621e52ff641037f30177070100100700ff0101621b52005240017707010024070 
0ff0101621b520052140177070100380700ff0101621b5200521101770701004c0700ff0 
101621b5200521a0177070100200700ff0101622352ff6309370177070100340700ff010 
1622352ff6309440177070100480700ff0101622352ff63094a01770701001f0700ff010 
1622152fe628f0177070100330700ff0101622152fe62640177070100"

results = extract_sml_values(sml_data)
print(f"Total Consumption: {results['consumption']:.4f} kWh")
print(f"Total Production: {results['production']:.4f} kWh")
print(f"Current Power: {results['power']} W")

von Schorsch Z. (schorsch_z)


Lesenswert?

#!/usr/bin/python3
import serial
import time
import binascii
import struct

PORT = '/dev/ttyUSB20'
BAUDRATE = 9600
TIMEOUT = 10  # Increased timeout

def read_sgm_c8():
    try:
        with serial.Serial(PORT, BAUDRATE, timeout=TIMEOUT) as ser:
            print(f"Connected to {PORT} at {BAUDRATE} baud")
            while True:
                data = ser.read(2000)  # Increased buffer size
                if data:
                    print(f"Received {len(data)} bytes")
                    print(f"Raw data: 
{binascii.hexlify(data).decode()}")
                    if b'\x1b\x1b\x1b\x1b' in data:
                        print("Found start sequence")
                        process_sml_message(data)
                    else:
                        print("Start sequence not found in data")
                else:
                    print("No data received")

                time.sleep(1)  # Wait before next read attempt
    except serial.SerialException as e:
        print(f"Serial port error: {e}")
    except KeyboardInterrupt:
        print("Script terminated by user")
    except Exception as e:
        print(f"An error occurred: {e}")

def process_sml_message(data):
    consumption = find_value(data, '77070100010800ff', 3, 10000)
    production = find_value(data, '77070100020800ff', 3, 10000)
    power = find_value(data, '77070100100700ff', 2, 1)
    voltage = find_value(data, '77070100200700ff', 2, 10)
    current = find_value(data, '770701001f0700ff', 2, 1000)

    print(f"Total Consumption: {consumption:.4f} kWh")
    print(f"Total Production: {production:.4f} kWh")
    print(f"Current Power: {power:.1f} W")
    print(f"Voltage: {voltage:.1f} V")
    print(f"Current: {current:.3f} A")

    if power is not None and voltage is not None and current is not None 
and voltage > 0 and current > 0:
        apparent_power = voltage * current
        if apparent_power > 0:
            power_factor = power / apparent_power
            print(f"Power Factor: {power_factor:.3f}")

    print("---")

def find_value(data, obis_code, length, scale_factor):
    index = data.find(bytes.fromhex(obis_code))
    if index != -1:
        value_bytes = data[index + len(bytes.fromhex(obis_code)) + 
13:index + len(bytes.fromhex(obis_code)) + 13 + length]
        if len(value_bytes) == length:
            return int.from_bytes(value_bytes, 'big') / scale_factor
    return None

if _name_ == "__main__":
    read_sgm_c8()

von Franko P. (sgssn)


Lesenswert?

Hallo
danke für den Code. Ich arbeite mit C, aber komme im Moment nicht dazu.

Der Link von @Peter Z
https://www.stefan-weigert.de/php_loader/sml.php

gibt hier eigentlich alles her, was ich gebraucht habe. Und bei 
@Schorsch Z stehts ja auch noch mal.

Also danke nochmal an Alle.

Gruß

von Eckhardt F. (neso)


Angehängte Dateien:

Lesenswert?

Hallo Franko,
ich habe auch den Zähler "efr  SGM-C8 a620s".
Ich wollte auch den Zähler über die optische Schnittstelle auslesen und
die Daten dann mit dem Raspberry/Python auslesen. Ohne "Volkszähler", 
"Tasmota", "IOBroker" & Co. Einfach alles selber stricken und was dabei 
lernen! Einen Lesekopf habe ich mir auch erspart, der ist völlig 
unnötig.
Es reicht, wenn man die Senderdiode im Zähler ausliest. Das geht ganz 
einfach mit einer Diode "PT334" und einem 10-KOhm-Widerstand. Das ist 
alles.
Ein Raspberry Nano (V 1) reicht auch aus, wenn dieser nicht allzuviele 
Zusatzaufgaben übernehmen soll. Als Betriebssystem habe ich "bullseye" 
Lite.

Was man dann noch benötigt, ist die Kenntnis, an welchen Stellen im 
empfangenen Datensatz vom Zähler die Messwerte (Bezug, Einspeisung, 
momentane Leistung usw. "versteckt" sind. Das habe ich nur mir viel 
Fleiß und Probiererei herausbekommen. Eine Hilfe sowohl vom 
Netzbetreiber (die haben selber keine Ahnung) als auch vom Hersteller 
des Zählers kann man nicht erwarten. Der Hersteller hat wahrscheinlich 
zu viele Anfragen in dieser Angelegenheit. Eine Antwort habe ich nach 2 
Wochen immer noch nicht bekommen. Er kann seine Antwort jetzt behalten 
!!

Anbei ist mein Python-Code (in kleinen Teilen von anderen 
Forums-Mitgliedern abgekupfert), die eigentlichen Fundstellen aber 
selber herausgefunden. Falls noch Fragen zur Diode, Widerstand und 
Befestigung der  Diode auftreten, bitte bei mir melden.

Mit besten Grüßen, auch an alle andern SGM-C8-Benutzer.

von 900ss (900ss)


Lesenswert?

Eckhardt F. schrieb:
> Einen Lesekopf habe ich mir auch erspart, der ist völlig
> unnötig.

Völlig unnötig für deine Priorität, "selber machen, lernen". Wobei gegen 
"lernen" wirklich nichts einzuwenden ist.
Es gibt Leute, die haben nur Interesse an den Werten und möchten diese 
möglichst einfach bekommen. Da ist dieser Lesekopf sehr gut für 
geeignet. Ein fertiges Produkt, günstig und relativ einfach in Betrieb 
zu nehmen und sieht am Zähler auch noch gut aus. Besser als eine mit 
Pflaster an den Zähler geklebte Diode o.ä. ;)

Eckhardt F. schrieb:
> Ein Raspberry Nano (V 1) reicht auch aus

Du wolltest schreiben, ein ATMegaxxx würde ausreichen :)
Wenn man denn gerne Python nehmen möchte dann würde sicher ein Rasperry 
Pi Pico ausreichen. Falls nicht bekannt:In dem Lesekopf arbeitet ein 
ESP32.
Einen 4-Kern Rechner mit Linux als "reicht aus" zu bezeichnen hat schon 
was ;)

von Eckhardt F. (neso)


Angehängte Dateien:

Lesenswert?

Oh, hier hat sich ja ein Verkäufer von Leseköpfen zu Wort gemeldet!

Meine Lösung mit nur einer Fotodiode, um 4-5 Werte aus dem Zähler 
auszulesen, kostet weniger als 1 Euro und der Raspberry Nano war noch 
über. Nirgend wo steht, dass die Rechenleistung eines Pico nicht 
ausreichen würde.

Ein Foto zur Befestigung der Diode auf dem Zähler ist beigefügt.
Dort ist kein Pflaster zu erkennen.

Diese Kritik an meinem Beitrag war mehr als überflüssig!

von 900ss (900ss)


Lesenswert?

Eckhardt F. schrieb:
> Oh, hier hat sich ja ein Verkäufer von Leseköpfen zu Wort gemeldet!

Glaubst du :)

Eckhardt F. schrieb:
> Diese Kritik an meinem Beitrag war mehr als überflüssig!

Du hast sie leider nicht verstanden. Ist ok, alles gut. Und du hast 
scheinbar auch die ";)" übersehen.

Eckhardt F. schrieb:
> Ein Raspberry Nano (V 1) reicht auch aus, wenn dieser nicht allzuviele
> Zusatzaufgaben übernehmen soll. Als Betriebssystem habe ich "bullseye"
> Lite.

"Reicht auch aus"?? Das ist mit Kanonen auf Spatzen schießen. Dann von 
"reicht auch aus" zu schreiben ist schon spaßig ;) Dass es damit auch 
funktioniert, ist klar.

Eckhardt F. schrieb:
> Diese Kritik an meinem Beitrag war mehr als überflüssig!

War nichtmal negativ gemeint, wie du sie scheinbar verstanden hast.

von Peter R. (peter_r689)


Angehängte Dateien:

Lesenswert?

Hallo,

das hier weiter oben dargestellte SML-Protokoll enthält folgende elektr. 
Daten

"# Example usage:
sml_data = "

siehe Bild.

Gruß Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.