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ß
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.
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
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.
Wahnsinn, ne echte Desmo, sieht aus wie Neu. Respekt! Gratuliere!
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ß
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
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.
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
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
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
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ß
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
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
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
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
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
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ß
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")
#!/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()
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ß
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.
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 ;)
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.