IR-INFO-Schnittstelle eines Stromzählers auslesen

Guten Abend Experten,

ich möchte meinen EDL21-Zähler an der IR-Schnittstelle auslesen. Es gibt dazu viele Projekte, einige sind mir bekannt, z.B. der VOlkszähler.

Ich habe einen Arduino, eine Photodiode (TSOP34146) und einen Vorwiderstand (z.B. 1kOhm) und möchte nun das SML-Protokoll auslesen. (Zähler ist freigeschaltet und PIN eingegeben)

Dazu nutze ich eine Bibliothek und den folgenden Code:

#include <IRremote.h>

byte IRPin = 10;
IRrecv irrecv(IRPin); //Objekt initialisieren für die IR Übertragung
decode_results results;

void setup(){
 Serial.begin(9200); 
 pinMode(IRPin, INPUT);
 irrecv.enableIRIn(); //Den IR Pin aktivieren 
}

void loop(){

	if (irrecv.decode(&results)) { //Wenn etwas gelesen wurde dann...
		//Ausgabe des Wertes auf die Serielle Schnittstelle.
		byte value = results.value;
		Serial.println(value,HEX);
		irrecv.resume(); // auf den nächsten Wert warten
	}
 
}

Das SML-Protokoll sieht vor, dass die ersten vier Bytes folgendermaßen sein sollen:

1B 1B 1B 1B (Escape Sequenz zum Start)
01 01 01 01 (Start SML)

Bei mir kommt aber nur Kauderwelsch, wenn ich die Diode vor meinen Zähler halte:

22:40:34.326 -> FE
22:40:34.360 -> FF
22:40:34.431 -> FF
22:40:34.568 -> FF
22:40:36.386 -> 4B
22:40:36.489 -> FF
22:40:36.633 -> 46
22:40:36.736 -> 93
22:40:38.389 -> B2
22:40:38.572 -> CB
22:40:40.444 -> F1
22:40:40.482 -> B6
22:40:40.552 -> FF
22:40:40.732 -> FF
22:40:40.802 -> FF
22:40:42.563 -> E6
22:40:42.630 -> FF
22:40:42.701 -> FF
22:40:44.538 -> D3
22:40:44.538 -> 1
22:40:44.576 -> FF
22:40:44.680 -> FF
22:40:44.935 -> FF
22:40:46.661 -> FF
22:40:46.734 -> FF
22:40:46.768 -> FF
22:40:48.637 -> 3

Jetzt meine Fragen:

  • Kann das eigentlich mit einer PhotoDIODE funktionieren? Die Projekte legen immer Wert auf den PhotoTRANSISTOR. Mir ist auch der Unterschied klar, aber nicht warum eine Diode nicht auch funktionieren sollte.
  • Die Variable value ist bei mir eine Byte-Variable. Das ist doch wohl richtig - oder? Wenn ich int verwende kommen natürlich ganz andere Zahlen heraus - ist ja klar. Aber eben auch nicht weniger falsch :frowning:

Danke und Gruß, kuahmelcher.

kuahmelcher:

 Serial.begin(9200);

Was passiert, wenn Du 9600 Baud einstellst?

Gruß

Gregor

Moin,

immerhin kommt überhaupt etwas...
Ich habe einen Volkszähler in Betrieb und lese zwei Stromzähler aus.
Um die IR Schnittstelle der Stromzähler dazu zu überreden etwas zu senden muss man diese erstmal dazu auffordern. Sprich du musst zuerst etwas senden um etwas lesen zu können.

Lieben Gruß,
Chris

gregorss:
Was passiert, wenn Du 9600 Baud einstellst?

Ähh, sorry - es IST 9600 eingestellt. Der Fehler “9200” kommt von einer bearbeitung und ist im Originalsketch nicht drinne. Ich habe es halt testhalber mal mit 19200 ausprobiert :slight_smile:

Danke und Gruß, kuahmelcher.

...die Schnittstelle bei meinen Itron ACE3000 type 360 Zählern läuft nur mit 300Baud und das kann auch nicht geändert werden. Was sagt denn das Datenblatt von deinem Zähler zur Baudrate?

Wenn du den Volkszähler kennst, dann schau doch mal da vorbei.
Da wird doch alles haarklein zu deinem Zähler erklärt:
https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/edl21-ehz

Viel Erfolg!

themanfrommoon:
Was sagt denn das Datenblatt von deinem Zähler zur Baudrate?

Ich habe gerade nachgeschaut: "Leider" 9600 Baud!

Danke und Gruß, kuahmelcher

themanfrommoon:
Da wird doch alles haarklein zu deinem Zähler erklärt:

Viel Erfolg!

Tja, leider hilft mir das gerade nicht so wirklich weiter. Da werden doch sehr viele Dinge anders gemacht. Ich hatte ja die Hoffnung, dass ich einfach nur eine IR-DIOde an einen Arduino dranhänge und schon mal die Rohdaten lesen kann - wie bei einer IR-Fernbedienung.

Den Kopf selbst kann ich da momentan auch nicht kaufen, die verkaufen gerade nix. Wahrscheinlich steht da auch die Lösung, ich erkenne sie nur nicht! :slight_smile:

Danke und Gruß, kuahmelcher

kuahmelcher:
Tja, leider hilft mir das gerade nicht so wirklich weiter.

Probier’s doch mit „klassischem Hacking“: lies einfach HIGH/LOW-Werte und lass Dir das zur Auswertung mit gnuplot o.ä. in eine Datei schreiben. Vielleicht mit millis()-Zeitstempel …

Ich meine … wozu hat man Spaß mit Arduino wenn nicht für’s Hacken?

Gruß

Gregor

gregorss:
lies einfach HIGH/LOW-Werte und lass Dir das zur Auswertung mit gnuplot o.ä. in eine Datei schreiben. Vielleicht mit millis()-Zeitstempel …

Ich meine … wozu hat man Spaß mit Arduino wenn nicht für’s Hacken?

Das hört sich sehr … interessant an. Ich verstehe es nur nicht. :slight_smile:

Meinst du damit folgendes:

  • IR-Diode analog anschließen
  • IR-Bibliothek rausnehmen
  • 10-Bit-Werte einlesen lassen (die sollten dann ja einigermaßen einheitliche hohe und niedrige Zahlen enthalten für HIGH und LOW bzw. 0 und 1)
  • überprüfen, ob ich aus dem “Bitstream” irgendwelche Bytes lesen kann, die eher an das SML-Protokoll erinnern
    Aber wozu Gnuplot? (habe ich noch nie benutzt, müsste aber auf meinem OSX drauf sein.)

Danke für einen Schubs in die richtige Richtung,
Gruß kuahmelcher.

Ja, so meine ich das. Gnuplot kannst Du dann benutzen, um mit den aufgezeichneten Daten eine Kurve zu zeichnen, die vielleicht Aufschluss über das zugrunde liegende Problem gibt - Du kannst z. B. Puls-Längen direkt ablesen und Rückschlüsse auf die richtige Datenrate ziehen.
MIDI hat z. B. einen total schrägen Wert, weil dort nicht die Übertragungsrate sondern die Pulslänge definiert ist.

Für einen kurzen Gnuplot-Eindruck: Guck hier.

Gruß

Gregor

PS: Beispiel: kodierscheibentest.pdf, Gnuplot-Beispiele: http://www.gnuplot.info/

gregorss:
Ja, so meine ich das. Gnuplot kannst Du dann benutzen, um mit den aufgezeichneten Daten eine Kurve zu zeichnen, die vielleicht Aufschluss über das zugrunde liegende Problem gibt - Du kannst z. B. Puls-Längen direkt ablesen und Rückschlüsse auf die richtige Datenrate ziehen.
MIDI hat z. B. einen total schrägen Wert, weil dort nicht die Übertragungsrate sondern die Pulslänge definiert ist.

Hallo Gregor,
ich habe mittlerweile einige "Messungen" durchgeführt.

Folgendes habe ich gemacht:

  • Photodiode nicht mehr an DigiPin, sondern an den Analogen A7. Außerdem an 5V und mit 2,2kOhm-Widerstand an GND
  • In den Keller galoppiert und vor meinen Zähler gehalten und mit 19200 Baud eingelesen(damit mir kein Bit durch die Lappen geht)
  • Ergebnis kopiert und mit OpenOffice geöffnet (GnuPlot sieht toll aus, ich scheitere allerdings momentan bereits an der Installation)

Messung über 34 Sekunden:

Ausschnitt des ersten Telegramms:

Anzahl der Bytes im ersten Telegramm:

Analyse der ersten vier Bytes des ersten Telegramms:

Dadurch weiß ich jetzt …

  • dass mein Zähler schön zyklisch ein "Telegramm" sendet, genauer gesagt knapp 2 Sekunden von erstem Bit zum ersten Bit des nächsten Telegramms
  • dass ein Telegramm 22 Bytes lang ist
  • dass ich mit meiner Messung nicht präzise zwischen 1 und 0 unterscheiden kann (einige Bits, die nicht eindeutig High oder Low sind)
  • dass die Analyse der Bytes zwar funktioniert, aber nur "manuell"
  • dass die ersten vier Bytes leider keinerlei Ähnlichkeit zum SML-Protokoll haben …

Langsam glaube ich, dsas mein Zähler einfach eine Fremdsprache spricht, die leider niemand verstehen kann und sich an keinerlei Konventionen hält. Er ist immerhin in deutsch beschriftet :confused: Es steht aber in der Anleitung: "Smart Message Language (SML); Sendung des Datensatzes lastabhängig alle 1...4 s"

Mache ich irgendeinen systematischen Fehler oder würde dir sonst noch etwas einfallen?

Danke und Gruß, kuahmelcher

Kann das Problem ein Aliasing Effekt sein?
Probiers mal mit mindestens 10x (besser noch mehr) höherer Baudrate.

themanfrommoon:
Probiers mal mit mindestens 10x (besser noch mehr) höherer Baudrate.

Jaaaa, gute Idee ... aber jetzt wird's kompliziert.

Hier erst mal zwei Bilder mit 115200 Baud:

Ein "Telegramm":

Einige Bytes des Telegramms:

Problem ist jetzt: Ich kriege mit meinem Laptop keine höhere Datenrate hin, weil er nur 1 MB RAM hat und der serial output den natürlich in sekundenschnelle vollballert! :slight_smile:

Die Kurven sehen schick aus, aber MIR sagen sie noch weniger als die vorherigen :frowning:

Danke und Gruß, kuahmelcher

Hmm, das sieht aber sehr komisch aus. Es gibt so Logik Analyser aus Fernost für 10 Euro oder so. Vielleicht hilft das weiter?!

Das sieht mir so aus, als wäre da ein Fremlicht überlagert oder eine Schwingung auf der Versorgungsspannung. Mach doch mal eine Paphülse um die Diode.
Du betreibst sie doch in Sperrichtung?

Gruß Tommy

Noch eine Idee: Hältst du die Fotodiode per Hand? Vielleicht erklärt das die Schwankungen. Das wäre wesentlich besser, wenn die Diode irgendwie mechanisch oder magnetisch befestigt wird und beim auslesen sich nicht mehr bewegen kann, auch keine zehntel Millimeter!

themanfrommoon:
Noch eine Idee: Hältst du die Fotodiode per Hand? Vielleicht erklärt das die Schwankungen.

Ja, habe sie einfach im Abstand von ca. 1 cm davor gehalten. Kann schon sein, dass die Schwankungen daher kommen. Aber wenn ich das richtig verstehe, dann sind die gar nicht dsa Problem. Eine Fernbedienung funktioniert ja auch zuverlässig unter sehr unterschiedlichen Bedingungen.

Ich glaube ich muss einfach mal ein bisschen Geld in die Hand nehmen und mir irgendwoher so einen "richtigen" IR-Kopf besorgen. Zu dumm, dass die vom VOlkszähler gerade nix verkaufen.

Ich halte es eigentlich für völlig ausgeschlossen, dass mein Stromzähler spinnt. Immerhin verlässt sich das EVU auch da drauf! :slight_smile:

Danke und Gruß, kuahmelcher

Tommy56:
Mach doch mal eine Paphülse um die Diode.
Du betreibst sie doch in Sperrichtung?

Tja, also ich glaube, dass ich die Messgenauigkeit schon noch verbessern könnte. Fremdlicht schließe ich allerdings aus, da DAS ja durchgängig zu messen sein müsste. Zwischen den Telegrammen ist allerdings absolute "Ruhe" - oder wie nennt man das bei Licht?

Richtung stimmt, andersherum kommt GAR kein vernünftiger Wert heraus, habe ich auch schon probiert. :slight_smile:

Danke und Gruß, kuahmelcher

Ich hab zwei Leseköpfe vom Volkszähler verbaut. Da is nu auch kein Hexenwerk drin. Den Schaltplan gibts da auch. Nimmst eben die TTL Variante