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"
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".
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.
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.
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.
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 ;-)
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.
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.
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.
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.....
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
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.
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.
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")
1
time.sleep(1) # Wait before next read attempt
2
except serial.SerialException as e:
3
print(f"Serial port error: {e}")
4
except KeyboardInterrupt:
5
print("Script terminated by user")
6
except Exception as e:
7
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)
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.
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.ä. ;)
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 ;)
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!
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.