Smart Meter auslesen

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
Ihr habe ja lange nichts mehr von mir gehört, aber ich war immer da und habe mitgelesen. Hier meine neueste Frickelidee : Wie lese ich den elektronischen Stromzähler von meiner Bude aus ?

Na, man baut sich eine kleine Schaltung die das infrarote Geblinke des Zählers umsetzt und über USB an einen PC weiter gibt :dance3:

Sooo einfach isses nu auch nicht, es hab mehrere Monate gebraucht, bis ich die nötigen Informationen zusammen gesammelt und eine passende kleine Platine dazu gemacht habe. Doch von Anfang an. Vor etwas über 2 Jahren, als meine Eltern gestorben sind, mußte ich die Wohnung komplett neu renovieren. Die beiden waren demenzkrank und haben quasi die Bude von innen raus zerstört. Also kam gleich der Gedanke auf, die komplette Elektroinstallation ebenfalls auf den neuesten Stand zu bekommen. Und so habe ich auch gleich diese neumodischen modernen elektronischen Zähler installieren lassen :



Die Zähler waren noch nicht lange drin, da fiel mir schon auf, das sie eine Infrarotschnittstelle zur Außenwelt hatten. Das Auge rechts oben an den Zählern muß eine Art Schnittstelle sein :



Beim Fotografieren bemerkte ich auch, das dieses "Auge" mit mir "redet". Man erkennt im Kameradisplay immer wieder violette Lichtimpulse. Diese Impulse sind mit dem Auge nicht wahr zu nehmen, da es Infrarotlicht ist, die Kamera sieht es aber :



Nun ging das große Suchen im Internet los. Wie funktioniert der Zähler, welches Protokoll sendet er, wie kann man die Signale abgreifen und umwandeln, gibt es bereits Software dafür, ist vielleicht sogar schon eine Auswerte- und Interfaceelektronik vorhanden ? Bei diversen Studien im Internet, in gewissen Foren, wurden auch Schaltungen vorgeschlagen. Die entsprechen aber nicht meinen "Anforderungen", waren zu primitiv und zu sehr Möchtegerngebastel, so das ich mir doch eine eigene Schaltung entwickelt habe :



Die Schaltung ist universell und kann wohl für die meisten Zähler verwendet werden. Außerdem ist die komplette USB-Schnittstelle bereits mit integriert. Das Platinenlayout sieht dann so aus :



Meine bisher am dichtesten bepackte Miniplatine. Die Leiterbahnen sind gerade mal 0,5mm stark, aber es soll ja alles in ein passendes Gehäuse direkt auf dem Zähler passen. Die Platine habe ich schon seit ein paar Monaten bei irgendeinem Auftrag mitmachen lassen :



Gerade mal 23mm Durchmesser hat diese Winzplatine, aber ihr seid ja nichts anderes von mir gewöhnt :yes4: Bestückt sieht das dann so aus :



Nun nehmen wir ein altes USB-Kabel und zwicken den Stecker von der Geräteseite ab. Die 4 Adern werden mit der Platine verbunden :



Und schon haben wir einen Schreib-/Lesekopf für das Infrarotauge der elektronischen Zähler. Da ich die Schreibfunktion nicht benötige, fehlt auch die Sendediode. Einige Zähler müssen aber aufgefordert werden, etwas zu senden, deshalb ist das auf der Platine auch gleich mit vorgesehen. Das Kabel mit der Schnittstelle sieht dann so aus :



Fehlt noch ein passendes Gehäuse für das Teil. Bei Shapeways (3d-Printing) habe ich mit ein Gehäuse aus Kunststoff drucken lassen. Dazu kommt noch ein Neodym-Magnet, der das Ganze magnetisch auf dem Zähler befestigt :



Der Ringmagnet wird in das Gehäuse eingelegt, darauf kommt ein ausgeschnittener Papierring zur Isolation :



Dann die kleine bestückte Platine einlegen und das Gehäuse verschrauben :

 

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
(suppi, man kann hier nur 15 Grafiken in einem Beitrag einfügen :fie: Deshalb gleich einen Doppelpost dazu :sarcastic: )


Na, sieht doch ganz brauchbar aus. Wie gekauft :dirol: Vorderseite :



Rückseite :



Also "kleben" wir das Ding mal an einen Zähler dran uns schauen, was passiert :



Hier noch etwas größer, damit man es auch besser erkennen kann :



Jepp, da fliegen die Daten. Der Zähler liefert mir alle 1 bis 2 Sekunden ein komplettes "Telegramm" über alle gespeicherten Verbrauchsdaten. Aus dieser Zahlenwurst muß ich die Werte noch raus fischen :



Diese 324 Bytes enthalten alles, was der Zähler speichert. Es ist ein sogenanntes SML-Protokoll (Smart Messaging Language). Jetzt muß ich "nur" noch ein entsprechendes Stück Software schreiben, das mir diese Daten da leserlich darstellt.

.... to be continued ...

Thomas
 

dino03

Aktives Mitglied
27 Okt 2008
6.703
14
38
Sprachen
BascomAVR, Assembler
Hi Thomas,

sieht ja richtig professionell aus :cool: (Aber mit Lochraster bekommt man das noch kleiner :p)

Das geht ja schon beinahe wieder an Reverse-Engineering dran ;) Ich laß mich echt mal überraschen wie das Protokoll nun aussieht und was alles drinsteckt. Bei nem Industriebetrieb wo ich mal vor nem Zählerkasten stand war da alles mögliche drauf zu sehen. CosPhi, Blindleistung, Wirkleistung und was weiß ich noch alles.

Gruß
Dino
 

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
Ein paar Beispiele :



Das rosane ist die Startsqeuenz für SML :

1B 1B 1B 1B - Start Escape Zeichenfolge
01 01 01 01 - Start Übertragung Version 1
76 - jetzt kommt eine SML-Message

Das rote ist die Wirkarbeit Bezug (+) Zählerstand Total, das grüne die Wirkleistung Total.

So kann man sich die ganzen Werte da raus fummeln. Muß nur noch wissen, wie die Werte zu lesen sind, denn im Hexcode kann ich so noch nix anfangen.

Thomas
 

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
Sooo,

ich hab mal das SML-Protokoll ein bißchen auseinander geflöht :

Code:
1B1B1B1B - Start Escape Zeichenfolge
01010101 - Start Übertragung Version 1

7605 - SML-Message + transactionId
06C64A2C - transactionId

6200 - groupNo 00
6200 - abortOnError Ausführung fortsetzen

72630101 - messageBody

7601 - SML_GetList_Res + clientId (not set)
0105024218BA
0B0649534B01027A231797 - ServerID
0101 - refTime + smlVersion
638E3B - crc16 (Checksumme nach CCITT-CRC16)
00 - SMLEndOfMessage

7605
06C64A2D
62006200726307
01

7701
0B0649534B01027A231797

0701
00620AFFFF

72620165 - actSensorTime -> Aktuelles Datum und Zeit der Real Time Clock
031D63F877 - 13377992823 Sekunden => 11.08.2013 13:17:12 MEZ -> 11.08.2013 12:17:12 MESZ

7707 - valListEntry (sequence) + objName
8181C78203FF - Herstelleridentifikation
0101010104 - status, valTime, unit, scaler -> not set + value
49534B - I S K -> ISKRA - Hersteller
01 - valueSignature = not set

7707 - valListEntry (sequence) + objName
0100000009FF
010101010B0649534B01027A231797
01 - valueSignature = not set

7707 - valListEntry (sequence) + objName
0100010800FF - Wirk- Energie Total Bezug
6500000182
01621E - valTime = not set + unit Wh
52FF59 - scaler ??? müßte /10 sein
0000000003DE95A1 - 6491.894,5Wh
01 - valueSignature = not set

7707 - valListEntry (sequence) + objName
0100010801FF - Wirk- Energie Tarif 1 Bezug
0101621E - status = not set + valTime = not set + unit Wh
52FF59 - scaler ??? müßte /10 sein
0000000003DE95A1 - 6491.894,5Wh
01 - valueSignature = not set

7707 - valListEntry (sequence) + objName
0100010802FF - Wirk- Energie Tarif 2 Bezug
0101621E - status = not set + valTime = not set + unit Wh
52FF59 - scaler ??? müßte /10 sein
0000000000000000 - 0,0Wh
01 - valueSignature = not set

7707 - valListEntry (sequence) + objName
01000F0700FF - Wirk- Leistung Total
0101621B - status = not set + valTime = not set + unit W
520065 - scaler = 1
00000183 - 387W
01 - valueSignature = not set

7707 - valListEntry (sequence) + objName
8181C78205FF - Public Key des Zählers
01010101 - status = not set + valTime = not set + unit = not set
8302BD191EE9B4816EB2990D6EFD69DB80673ECE2FC385B3D5B7EBD5DE6460E2E0EA58DEDF8E151A841034435AB7BF77E5A901010163C80E00760506C64A2E62006200726302
01 - valueSignature = not set

7101 - listSignature (not set) + actGatewayTime (not set)
630B5A - crc16 (Checksumme nach CCITT-CRC16)
00 - SMLEndOfMessage
-- Erweiterungsbyte (bis Anzahl Byte modulo 4 = 0)
1B1B1B1B - Ende Escape Zeichenfolge
1A - Ende der Nachricht
00 - Anzahl Erweiterungsbyte
8F28 - Checksumme gesamte Nachricht (CCITT-CRC16)
Na, sehr viel kommt da nicht raus, aber immerhin. Ich kann die Energie und die Leistung ablesen. Werde das nun in einen kleinen Linix-PC schieben und dort zerpflücken. Dann kommt noch eine grafische Aufbereitung dazu, die mir das Ganze auf meiner Webpage darstellt.

Thomas
 

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
Das Projekt ist (fast) beendet :cool:

Mein Zähler loggt jetzt sauber auf einen kleinen Miniserver :



... und stellt die Informationen grafisch dar :



Jetzt muß ich nur nur die anderen 3 Zähler über einen USB-Hub anschließen und auswerten. Im Prinzip einfach nur den Code duplizieren und das wars dann schon.

Thomas
 

Hemi

Premium Benutzer
30 Nov 2008
999
11
18
Korntal-Münchingen, Germany
Sprachen
C, C++, PHP, Java
Hey Thomas,

coole Sache :ciao:

Was ist das für ein Miniserver?
 

Ditron

Mitglied
11 Dez 2011
266
5
18
Sprachen
BascomAVR
Wow, werde erst jetzt auf dein Projekt aufmerksam. Ganz klasse!

Das kannst du ja quasi vermarkten ... :flute:
 

dino03

Aktives Mitglied
27 Okt 2008
6.703
14
38
Sprachen
BascomAVR, Assembler

Hemi

Premium Benutzer
30 Nov 2008
999
11
18
Korntal-Münchingen, Germany
Sprachen
C, C++, PHP, Java
Hi,

könnte man heute auch nen RasPi für einsetzen. Ließe sich sogar noch besser an den Atmel koppeln.

Gruß
Dino
Prinzipiell schon. Ich persönlich würde dafür aber eher sowas hier nehmen:

CubieBoard: klick mich

CubieBoard 2: klick mich

Vorteile gegenüber RPi:
-> SATA
-> vernünftig angebundener USB
-> mehr Speicher
-> mehr Leistung
-> mehr GPIOs

Okay, zugegeben, das Ding kostet auch "etwas" mehr.
 

werner7

Neues Mitglied
1 Jan 2019
1
0
1
Hallo Knickohr,
hab man deine Markierte Stelle, dass rote sool ja die Wirkarbeit Bezug sein eingebeben.

Irgendwie bekomme ich bei deinen Hex „Zahlen“ nichts brauchbares geboten, siehe Foto.


Hab ich da wo einen „Systemfehler“ gemacht ?

Gruß
 

Anhänge

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.257
59
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Rot markiert ist (HEX):
Code:
77 07 01 00 01 08 00 FF 65 00 00 01 82 01 62 1E 52 FF 59 00 00 00 00 03 DD 7D 69 01
Knickohr schrieb dazu:
7707 - valListEntry (sequence) + objName
0100010800FF - Wirk- Energie Total Bezug
6500000182
01621E - valTime = not set + unit Wh
52FF59 - scaler ??? müßte /10 sein
0000000003DE95A1 - 6491.894,5Wh
01 - valueSignature = not set
Wäre also hier:

7707 - valListEntry (sequence) + objName
0100010800FF - Wirk- Energie Total Bezug
6500000182
01621E - valTime = not set + unit Wh
52FF59 - scaler ??? müßte /10 sein
0000000003DD7D69 - ??? Wh
01 - valueSignature = not set

Also 0x03DD7D69 dWh (deziWh, wegen dem Scaler)
0x03DD7D69 dWh = 64847209 dWh = 6.484.720,9 Wh
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.303
10
38
Hannover
Sprachen
C, C#
Sehr interessant ;)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)