Forum: Mikrocontroller und Digitale Elektronik Wärmezähler über optische M-Bus-Schnittstelle 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 A.. P. (arnonym)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe in meiner Wohnung folgenden Wärmezähler der Firma Allmess GmbH 
(s. Bild). Dieser verfügt über eine optische Schnittstelle (M-Bus), die 
ich gerne verwenden würde, um darüber Daten über Verbrauch etc. 
auszulesen und weiterzuverarbeiten.

Ich habe mich im Netz und auch hier im Forum etwas schlau gemacht über 
diesen M-Bus und was ich bis jetzt verstanden habe, ist, dass die Geräte 
i.d.R. (immer?) über einen M-Bus-Master angesprochen werden. Der 
Standard EN60870-5 spezifiziert offensichtlich den Frame-Aufbau, das 
Format der Datenpakete und grundlegende Anwendungsfunktionen 
(Wikipedia).

Nun würde ich gerne zum einen wissen, ob ich meinem Wärmezähler einen 
M-Bus-Master vorgaukeln muss, um an seine Daten zu kommen und welche 
Spezifikationen für mich dabei relevant sind. Müsste ich mich also durch 
alle Teile des Standards durchwühlen oder baue ich über die optische 
Schnittstelle einfach eine serielle Kommunikation auf und tausche 
einfache Pakete mit dem Zähler aus und muss mich nur auf bestimmte Teile 
des Standards konzentrieren?

Ich habe hier im Forum bereits etwas von Pegelwandlung etc. gelesen, 
aber ich denke mal, dass ich damit nichts am Hut habe, da dies nur bei 
einer drahtgebundenen Kommunikation mit einem Master interessant ist.

Ich möchte also im einfachsten Fall eine IR-Diode an die Schnittstelle 
des Zählers hängen, seriell mit ihm kommunizieren und die Daten dann 
weiterverarbeiten.

Achja, interessieren würde mich natürlich noch, ob ich dabei auch etwas 
im Gerät zerstören könnte? Ich möchte keinesfalls irgendwas an dem Teil 
verändern, lediglich die Werte möchte ich gerne auslesen.

In die Standards kann ich leider im Moment nicht reinschauen, aber ich 
könnte nächste Woche in meiner Uni mal sehen, ob wir spezielle diesen 
Standard dort auch rumliegen haben.

Über Hilfe und sachdienliche Infos darüber bin ich sehr dankbar :)

Gurß

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
A.. P. schrieb:
> Nun würde ich gerne zum einen wissen, ob ich meinem Wärmezähler einen
> M-Bus-Master vorgaukeln muss, um an seine Daten zu kommen und welche
> Spezifikationen für mich dabei relevant sind. Müsste ich mich also durch
> alle Teile des Standards durchwühlen oder baue ich über die optische
> Schnittstelle einfach eine serielle Kommunikation auf und tausche
> einfache Pakete mit dem Zähler aus und muss mich nur auf bestimmte Teile
> des Standards konzentrieren?

Ein Gerät, das mit einem M-Bus-Gerät kommuniziert, ist ein M-Bus-Master. 
Das ergibt sich aus dem Prinzip, ist aber nicht weiter kompliziert.

Du musst nur über die serielle Schnittstelle dem Gerät mitteilen, daß es 
seine Daten senden soll. Dazu musst Du neben den eigentlichen 
Kommunikationsparametern (Baudrate, Parität, Stopbits) noch die 
Geräteadresse herausfinden.

Das geht, indem Du das Gerät mit der Adresse 254 (0xfe) ansprichst, es 
antwortet daraufhin mit seiner konfigurierten Adresse. Da Du keinen Bus 
im eigentlichen Sinne hast, sondern nur zwei Teilnehmer, kann es dabei 
auch nicht zu Kollisionen kommen.

Was der Master zu senden hat, ist recht einfach, die Geräteadresse und 
der Funktionscode für "liefere Deine Daten". Das Gerät (der Slave) 
antwortet dann mit einem Datentelegramm; passen nicht alle Daten in das 
Telegramm, wird im Telegramm signalisiert, daß noch weitere Telegramme 
verfügbar sind, die der Master separat anzufordern hat.

Aufwendiger wird es, das Telegramm zu decodieren, das der Slave sendet.

Aber dafür gibt es Sourcecode:

http://www.rscada.se/libmbus/

> In die Standards kann ich leider im Moment nicht reinschauen

Die findet man im Internet:

http://www.m-bus.com/

Das Dokument hier
http://www.m-bus.com/files/MBDOC48.PDF

genügt eigentlich schon, interessant sind für Dich die Informationen ab 
Seite 22. Die vorhergehenden Seiten beschreiben das elektrische 
Interface (das Du nicht nutzt) und nicht die optische Übertragung.

Wie die hardwaremäßig umzusetzen ist, entzieht sich meiner Kenntnis, da 
bist Du auf Dich selbst gestellt.

: Bearbeitet durch Moderator
von A.. P. (arnonym)


Bewertung
0 lesenswert
nicht lesenswert
Super, danke dir schon mal für die Quellen! Werde diese mal durchlesen 
und hoffe, dass ich daraus bereits alles entnehmen kann, was ich 
benötige. Den Hardwareteil kriege ich schon auf die Reihe :)

Besten Gruß

von Markus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung, ob das jetzt noch relevant ist, aber bei dem Thema MBus 
muss man immer ein wenig aufpassen:
Der eigentliche MBus, so wie er mal gedacht war, ist eine drahtgebundene 
Schnittstelle mit einer Mischung aus strom- und spannungsdefierter 
Übertragung. Das System ist sehr robust und wird so seit Jahrzehnten 
verwendet.
Aus diesem Standard hat sich dann auch der Wireless MBus entwickelt.
Die optische Schnittstelle der Wärmezähler gehört nicht zu dem 
MBus-Standard, verwendet aber gerne dessen Telegrammaufbau. Im Kern sind 
diese optischen Schnittstellen also lediglich UARTs über IR Dioden.
Wenn man also Baudrate, Byteformat und die Telegrammliste hat, ist der 
Rest wirklich einfache serielle Übertragung und erfordert keine tiefere 
Kenntnis den MBus.

Viel Erfolg und Grüße,
Markus

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde gerne auch den gleichen Wärmemengenzähler auslesen. Habe mir 
dazu eine IR Schnittstelle mit 860nm gebaut. Bei den diversen 
Stromzählern (SML) funktioniert diese auch ohne Probleme.

Leider kann ich keine Kommunikation mit dem Wärmemengenzähler aufbauen.



Zum Übermitteln des 0xFE Bytes nutze ich Lorus in der Freeware Version.

Vielleicht ist ja schon jemand weiter und kann mir einen Tipp geben.

von oroettger (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo,

ich würde gerne einen ähnlichen Zähler mit gleicher Schnittstelle 
auslesen.

Es ist der Integral-V UltraLite Art.Nr.: 561423000706 mit Optische 
Schnittstelle EN 60870-5 / M-BUS Protokoll.
Wie bekomme ich über die optische Schnittstelle ein Signal auf M-Bus 
Zweidraht?

Ich finde dazu keine Hardware. Oder gibt es andere Möglichkeiten?

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
oroettger schrieb:
> Ich finde dazu keine Hardware. Oder gibt es andere Möglichkeiten?

Eventuell hilft Dir unter wiki.volkszaehler.org ein IR-Schreib-Lesekopf 
mit dem ich eHZ Stromzähler auslese. Ich konnte seinerzeit den fertigen 
Kopf kaufen und mußte nicht selber basteln. Eigentlich müßte der 
M-Buszähler damit auch klar kommen.

https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-rs232-ausgang

Du mußt jedoch auch die Software für das Ansteuern und Auslesen des 
M-Buszähler haben.

Alexander S. schrieb:
> Zum Übermitteln des 0xFE Bytes nutze ich Lorus in der Freeware Version.

https://www.m-bus.de/lorusfree.html

Diese Software hatte mir anfangs sehr geholfen.
mfg Klaus

: Bearbeitet durch User
von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Eventuell hilft Dir unter wiki.volkszaehler.org ein IR-Schreib-Lesekopf
> mit dem ich eHZ Stromzähler auslese. Ich konnte seinerzeit den fertigen
> Kopf kaufen und mußte nicht selber basteln. Eigentlich müßte der
> M-Buszähler damit auch klar kommen.

Kann ich so direkt nicht bestätigen. Ich habe mir einen Kopf selbst 
gebaut, mit SFH4554 als Sendediode (850nm statt 880nm) und SFH 309 als 
Empfänger. Dieser funktioniert einwandfrei mit jedem bisher getesteten 
Stromzähler aber leider nicht mit oben genanntem Wärmemengenzähler. Ich 
habe es mit verschiedener Software und auch Ansteuersequenzen getestet 
und kann mir folgende Dinge vorstellen:

Spezielle Ansteuerungssequenz
Reedkontakt der die optische Schnittstelle aktiviert

Der Sendekopf wurde selbst entwickelt um den Haltenasen am WMZ zu 
entsprechen. Das Layout / Schaltpläne veröffentliche ich gerne.

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
Alexander S. schrieb:
> Der Sendekopf wurde selbst entwickelt um den Haltenasen am WMZ zu
> entsprechen. Das Layout / Schaltpläne veröffentliche ich gerne.

Würde mich interessieren.


Alexander S. schrieb:
> aber leider nicht mit oben genanntem Wärmemengenzähler. Ich
> habe es mit verschiedener Software und auch Ansteuersequenzen getestet
> und kann mir folgende Dinge vorstellen:
>
> Spezielle Ansteuerungssequenz
> Reedkontakt der die optische Schnittstelle aktiviert

Manche Hersteller sind da auskunftsfreudig.

mfg Klaus

von Alexander S. (alexanders)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

anbei die Dateien zum Lesekopf. Erstellt in KiCAD 5.0.

Bei dem Hersteller habe ich einmal angefragt, alternativ werde ich es 
noch mal mit der Initialisierungssequenz nach EN 62056-21 probieren.

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
Alexander S. schrieb:
> Initialisierungssequenz nach EN 62056-21

Die Schaltung sieht wirklich gut aus. Den FT-Baustein kannte ich noch 
nicht. Ich habe immer den FT232RL verwendet.

Hast Du einen Link zur "Initialisierungssequenz nach EN 62056-21"?
Mal schauen was dahintersteckt. Die ganze M-Bus Programmierung war 
damals ziemlich aufwändig.
mfg klaus

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Die Schaltung sieht wirklich gut aus. Den FT-Baustein kannte ich noch
> nicht. Ich habe immer den FT232RL verwendet.

Günstiger da z.B. ohne komplettes Handshakeinterface - außerdem war 
dieser gerade besser lieferbar.


Ich hätte die Norm, denke aber nicht das ich diese hier veröffentlichen 
darf.

Ich gebe es mal mit meinen eigenen Worten wieder:

Es gibt zwei Verfahren, die sich in der Dauer der Aufwachsequenz 
unterscheiden.

Bei dem langsameren Verfahren muss man einen String von Nullzeichen 
senden (0x00) mit einer Gesamtlänge zwischen 2,1 und 2.3 Sekunden. Es 
dürfen maximal 5 ms zwischen den Zeichen vergehen. Die Baudrate sollte 
bei 300 Baud liegen und es wird mit einem Startbit, sieben Datenbits 
einer geraden Parität und einem Stopbit gearbeitet. Nach dieser Sequenz 
soll das Auslesegerät 1,5 bis 1.7 Sekunden warten und dann die Request 
Message senden.

Eine solche Nachricht besteht auf folgernder Zeichenkombination 
"/?!CRLF"
Hier wurde eine Geräteadresse weggelassen (ansonsten zwischen ? und !), 
es sollte jedes Gerät antworten. CR/LF stehen für Carriage Return (0x0A) 
und Line Feed (0x0D).

Danach sollte das Gerät mit seinem Identifier antworten und eine 
Kommunikation kann beginnen.

Alternativ gibt es die schnellere Wakeupsequenz

Hier werden Blöcke mit Aufwachsequenzen verschickt und nach jedem Block 
auf eine Reaktion vom Gerät gewartet.
Eine Sequenz besteht aus dem Übermitteln von Nullzeichen (0x00) für 0,5 
- 0,6 Sekunden. Danach muss die Übertragungszeit von zwei Zeichen + 20 - 
40 ms auf ein ACK (0x06) gewartet werden. Dieser Block einer 
Aufwachsequenz soll mindestens für 4,5 Sekunden gesendet werden. Falls 
das Gerät mit einem ACK antwortet, soll die Übertragung abgebrochen 
werden, dies kann auch schon während der Nullsequenz sein.

Nach dem ACK soll der Master 200 ms warten, um danach oben beschriebene 
Request Message zu senden. Nach 1500ms nach dem ACK legt sich das Gerät 
wieder schlafen.

In beiden Fällen soll die Wartezeit zwischen zwei erfolglosen Versuchen 
1,5 Sekunden betragen. Erfolglos ist meiner Meinung nach, wenn ein NACK 
(0x15) statt einem ACK geantwortet wird. In der Norm wird das als 
Übertragungsfehler beschrieben.

von Herbert K. (avr-herbi)


Bewertung
0 lesenswert
nicht lesenswert
Danke an Alexander !
Einfach mal google befragen mit "Aufwachsequenz mbus"
Manchmal reicht ja so ein Wink mit dem Zaunpfahl  :-)

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
Danke an Alexander und Herbert,
ich muß mal gelegentlich meinen Source überprüfen. Vielleicht läßt sich 
noch etwas verbessern.
mfg Klaus

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Interessiere mich auch für die Auslesemöglichkeit des o.g. Wärmezählers 
(4 Stück).
Bei der Recherche bin ich auf das hier gestoßen, vielleicht hilfts:

http://www.sedelmaier.at/node/112

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin etwas weiter gekommen. Die Kommunikation muss nach folgendem 
Muster erfolgen:

1. Übertragung von Muster 0/1 für 3 Sekunden (2400Baud, 8N1 ohne 
Parität) - realisiert durch das Senden von 0x55
2. Wartezeit von 234ms (10 Zeichen Wartezeit? - Eigentlich schreibt 
EN1434-3 330 Bitperioden + 50ms vor)
3. Umstellen der Übertragung auf 8N1 mit gerader Parität
4. Übertragen eines Mbus Telegramms (SND_UD) mit CI von 0xA6 (unbekannt) 
an die Geräteadresse 0xFE (Broadcast) (0x68 (Start) 
0x03(Nachrichtenlänge - L Field) 0x03(Nachrichtenlänge - L Field, 
erneut) 0x68 (Start) 0x53 (SND_UD) 0xFE (Broadcast Addr. mit Antwort) 
0xA6 (unbekannt) 0xF7 (Prüfsumme, richtig) 0x16 (End)
5. Prüfen auf Antwort (0xE5), falls keine Antwort 3s Wartezeit - dann 
erneut bei 1 beginnen - maximal drei Wiederholungen
6. Falls drei Wiederholungen ohne Antwort => Umstellen der Baudrate auf 
9600 Baud und erneut drei Versuche.


Leider funktioniert die Kommunikation nach obigem Schema bei mir nicht. 
Vielleicht kann jemand anders es einmal mit einem anderen Kopf 
probieren.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Alexander S. schrieb:
> Umstellen der Übertragung auf 8N1 mit gerader Parität

Ich würde das 8E1 nennen. Das "N" in 8N1 steht für kein Parity-Bit.

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Ich würde das 8E1 nennen. Das "N" in 8N1 steht für kein Parity-Bit.

Wie gedankenlos von mir. Vielleicht kann ein Moderator den Beitrag 
#5872420 anpassen - mir ist das leider nicht mehr möglich.

von tnzs (Gast)


Bewertung
0 lesenswert
nicht lesenswert
M-Bus (also Zweidraht) und optische Schnittstelle sind zweierlei...
Die optische Schnittstelle arbeitet nach ZVIE und kommt aus dem 
Stromzählerbereich. Bei den Wärmezähler läuft darauf fast immer das 
M-Bus Protokoll.
Bei dem batteriebetriebenen Wärmezählern muss man die Schnittstelle 
erstmal aufwecken, weil die aus Energiespargründen immer aus ist. 1-2 
Sekunden 0x55 hinschicken. Dann mit 2400 8E1 ein SND_NKE oder ein 
REQ_UD2 Telegramm an Testadresse 254. Dann sollte was zurückommen (68 LL 
LL 68 usw).

Beim 62056/1107 Protokoll wird mit 300baud 7e1 angefragt und dann die 
Baudrate auf 2400/9600 gestell. Ja nachdem was der Zähler kann. Aber das 
ist eher notwenig bei den Stromzählern.

von tnzs (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
Manche Wärmezähler lassen sich nicht beliebig oft an der optischen 
Schnittstelle auslesen. Manchen lassen nur eine gewisse Anzahl an 
Kommunikatioen pro Tag zu, manche haben lustige Creditsystem und einige 
schalten ihre Schnittstelle zu bestimmten Zeiten (Nachts) komplett ab.

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hab mir jetzt eine Prototyp-Schnittstelle zusammengebastelt nach dem 
Schema von falk hier:
Beitrag "Re: Smartmeter - MT681 - Fehler beim IR-Lesen"

Ist über einen Max232 und rs232-usb Wandler an den Rechner angeschlossen 
(Hackintosh).

Senden und Empfangen geht einwandfrei, wenn ich z.B. einen Spiegel 
davorhalte.
Auf dem Wärmezähler montiert (gleicher Typ wie im ersten Bild ganz oben) 
schicke ich per Terminal (2400 baud, 8E1) ca. 2 sek. 0x55 rein, danach 
mehrere 0xFF und gleich die Sequenz 10 40 FE 3E 16 hinterher (SND_NKE).

Ab und zu bekomme ich darauf tatsächlich die Antwort 0xE5 :-)
Schreib mir nun ein C-Programm, um das weiter auszutesten.

Gute Informationen gibt es hier auf Seite 4/5:

https://docuthek.kromschroeder.com/documents/download.php?lang=de&doc=29514

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht, ob es gewünscht ist, aber ich habe für meine Versuche 
folgenden Code zusammengebastelt, vielleicht hilft es ja.
#include <stdint.h>
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/select.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>

static void sig_handler(int signo) {
  printf("Signal %d\r\n", signo);
}

int set_interface_attribs(int fd, int speed, int parity, int bits) {
  struct termios tty;
  memset(&tty, 0, sizeof tty);
  if (tcgetattr(fd, &tty) != 0) {
    printf("error %d from tcgetattr", errno);
    return -1;
  }

  cfsetospeed(&tty, speed);
  cfsetispeed(&tty, speed);

  tty.c_cflag &= ~CSIZE;
  tty.c_cflag &= ~CSTOPB;
  tty.c_cflag &= ~(PARENB | PARODD);
  tty.c_cflag |= (CLOCAL | CREAD);
  tty.c_cflag |= bits;
  tty.c_cflag |= parity;

  tty.c_iflag &= ~(IXON | IXOFF | IXANY);
  tty.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);

  tty.c_oflag = 0;
  tty.c_lflag = 0;

  tty.c_cc[VMIN] = 0;
  tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

  if (tcsetattr(fd, TCSANOW, &tty) != 0) {
    printf("error %d from tcsetattr", errno);
    return -1;
  }
  return 0;
}

void set_blocking(int fd, int should_block) {
  struct termios tty;
  memset(&tty, 0, sizeof tty);
  if (tcgetattr(fd, &tty) != 0) {
    printf("error %d from tggetattr", errno);
    return;
  }

  tty.c_cc[VMIN] = should_block ? 1 : 0;
  tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

  if (tcsetattr(fd, TCSANOW, &tty) != 0)
    printf("error %d setting term attributes", errno);
}

char* read_data(int fd) {
  char* data = malloc(255);
  int maxfd = fd + 1;
  struct timeval timeout = { 1, 0 };
  fd_set readSet;
  FD_ZERO(&readSet);
  FD_SET(fd, &readSet);
  if (select(maxfd, &readSet, NULL, NULL, &timeout) > 0) {
    if (FD_ISSET(fd, &readSet)) {
      int n = read(fd, data, 255);
      if (n < 0) {
        printf("error %d on reading data from serial device", errno);
        return NULL;
      }
    }
  }
  return data;
}

int init_en_62056_slow(int fd) {
  // Anforderung:
  // 300 Baud 7N1 even parity
  size_t ret_out;
  char init_seq[614];
  char *buf;
  set_interface_attribs(fd, B300, PARENB, CS7);
  set_blocking(fd, 1);    // set blocking
  memset(init_seq, 0x00, sizeof(init_seq));
  struct timespec sleep_1_7s = { .tv_sec = 1, .tv_nsec = 700000000 };

  uint32_t transmission_len = 0;

  transmission_len = 69;

  ret_out = write(fd, init_seq, transmission_len);  // sent wakeup
  if (ret_out != transmission_len)
    return -1;
  tcdrain(fd);
  //Warten von 1,7s

  if (nanosleep(&sleep_1_7s, NULL) != 0)  // sleep enough to transmit plus
    printf("Error in nanosleep: %d\r\n", errno);

  sprintf(init_seq, "/?!\r\n");
  ret_out = write(fd, init_seq, strlen(init_seq));
  tcdrain(fd);
  buf = read_data(fd);
  if (buf == NULL) {
    return -1;
  } else if (buf[0] == '/') {
    printf("Recieved '/'");
  }
  return -1;
}

int init_en_62056_fast(int fd) {
  // Anforderung:
  // 2400 Baud 7N1 even parity
  size_t ret_out;
  char init_seq[147];
  char *buf;
  struct timespec sleep_48_3ms = { .tv_sec = 0, .tv_nsec = 48300000 };

  set_interface_attribs(fd, B2400, PARENB, CS7);
  set_blocking(fd, 1);    // set blocking
  for (uint8_t i = 0; i < 10; i++) {
    memset(init_seq, 0x00, sizeof(init_seq));
    uint32_t transmission_len = 0;
    transmission_len = 140;
    ret_out = write(fd, init_seq, transmission_len);  // sent wakeup
    if (ret_out != transmission_len)
      return -1;
    tcdrain(fd);
    //Warten von zwei Zeichen + 40 ms
    if (nanosleep(&sleep_48_3ms, NULL) != 0)  // sleep enough to transmit plus
      printf("Error in nanosleep: %d\r\n", errno);
    buf = read_data(fd);
    if (buf == NULL) {
      return -1;
    } else if (buf[0] == 0x06) {
      printf("Recieved ACK");
      return 0;
    }
  }
  return -1;
}

int init_en_13757(int fd, int speed) {
  // Anforderung:
  // 300 oder 2400 Baud 8N1
  size_t ret_out;
  char init_seq[614];
  char *buf;
  set_interface_attribs(fd, speed, 0, CS8);
  set_blocking(fd, 1);    // set blocking
  memset(init_seq, 0x00, sizeof(init_seq));
  uint32_t transmission_len = 0;
  if (speed == B2400) {
    transmission_len = 552;
  } else if (speed == B300) {
    transmission_len = 69;
  } else {
    return -1;
  }
  ret_out = write(fd, init_seq, transmission_len);  // sent wakeup
  if (ret_out != transmission_len)
    return -1;
  tcdrain(fd);
  //Warten von 330 Bitzeiten
  struct timespec sleep_138ms = { .tv_sec = 0, .tv_nsec = 138000000 };
  struct timespec sleep_1_1s = { .tv_sec = 1, .tv_nsec =  100000000 };
  if (speed == B2400) {
    if (nanosleep(&sleep_138ms, NULL) != 0)  // sleep enough to transmit plus
      printf("Error in nanosleep: %d\r\n", errno);
  } else if (speed == B300) {
    if (nanosleep(&sleep_1_1s, NULL) != 0)  // sleep enough to transmit plus
      printf("Error in nanosleep: %d\r\n", errno);
  } else {
    return -1;
  }

  char snd_nke = 0x40;
  ret_out = write(fd, &snd_nke, 1);  // sent snd_nke
  tcdrain(fd);
  buf = read_data(fd);
  if (buf == NULL) {
    return -1;
  } else if (buf[0] == 0xE5) {
    printf("Recieved ACKN");
  }
  return -1;
}
int main(int argc, char *argv[]) {
  const char *filename = "/dev/ttyUSB1";
  struct sigaction sa;
  sa.sa_handler = sig_handler;
  int i;
  for (i = 1; i <= 64; i++) {
    sigaction(i, &sa, NULL);
  }
  int fd = open(filename, O_RDWR| O_SYNC);
  tcflush(fd, TCIFLUSH); /* Discards old data in the rx buffer            */
  int ret = init_en_13757(fd, B2400);
  struct timespec sleep_2s = { .tv_sec = 2, .tv_nsec = 0 };
  if (ret == 0) {
    printf("Kommunikation erfolgreich, 13757 mit 2400 Baud");
    return 0;
  }
  nanosleep(&sleep_2s, NULL);
  ret = init_en_13757(fd, B300);
  if (ret == 0) {
    printf("Kommunikation erfolgreich, 13757 mit 300 Baud");
    return 0;
  }
  nanosleep(&sleep_2s, NULL);
  ret = init_en_62056_slow(fd);
  if (ret == 0) {
    printf("Kommunikation erfolgreich, 62056_slow mit 300 Baud");
    return 0;
  }
  nanosleep(&sleep_2s, NULL);
  ret = init_en_62056_fast(fd);
  if (ret == 0) {
    printf("Kommunikation erfolgreich, 62056_fast mit 2400 Baud");
    return 0;
  }
  printf("Keine erfolgreiche Kommunikation\r\n");

  return 0;
}


: Bearbeitet durch User
von F. F. (foldi)


Bewertung
-1 lesenswert
nicht lesenswert
A.. P. schrieb:
> lediglich die Werte möchte ich gerne auslesen.

Wieso machst du dir das so kompliziert?
Meistens kann man direkt einen Zugang zu "den eigenen Werten" bekommen.
Schreibe doch die Firma an, die die Auswertung macht.

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
F. F. schrieb:
> A.. P. schrieb:
>> lediglich die Werte möchte ich gerne auslesen.
>
> Wieso machst du dir das so kompliziert?
> Meistens kann man direkt einen Zugang zu "den eigenen Werten" bekommen.
> Schreibe doch die Firma an, die die Auswertung macht.

Zum Beispiel zur Integration in eine Visualisierung/Hausautomatisierung. 
Der dargestellte WMZ kann die Werte der letzten x Monate per Display 
anzeigen - zeitlich feiner aufgelöste Werte wird die auswertende Firma 
wohl auch nicht anbieten. In meinem Fall erfolgt die Ablesung privat, 
per Display. Eine Einbindung per Bussystem des Herstellers ist sehr 
kostenintensiv, teilweise für Privatpersonen auch nicht möglich.

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Die Wärmezähler mit MBus-Ausgang sind um einiges teurer. Für die 
größeren Wärmezähler gibt es Einsteckplatinen, aber die sind auch teuer 
und braucht man nur bei größeren Anlagen.

Ich hab durch Zufall und langes rumprobieren jetzt eine Antwort auf die 
Zeichenfolge
10 5B FE 59 16 bekommen:

684D4D68 08007217 42521192 2617040B 1400000C 78174252 11040618 A700000C 
14614728 003B2D99 99993B3B 9999990A 5A14020A 5E16020B 61250000 046D2600 
7C290227 330B09FD 0E0609FD

Das lässt mich hoffen, daß es also irgendwie zu gehen scheint, nur das 
genaue Timing ist warscheinlich wichtig. Auf meinem gebraucht gekauftem 
Zähler zum Testen steht:
(Baujahr 2011)
opt. Schnittstelle: M-Bus/EN60870-5 2. 2
Auf den anderen vier wo ich das dann einbauen will steht:
(Baujahr 2017)
opt. Schnittstelle: M-Bus/EN60870-5 4.2
und
(Baujahr 2016)
opt. Schnittstelle: M-Bus/EN60870-5 6.2

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alexander S. schrieb:
> Ich weiß nicht, ob es gewünscht ist, aber ich habe für meine Versuche
> folgenden Code zusammengebastelt, vielleicht hilft es ja.

Da ist ein Fehler drin:

warning: comparison of constant 229 with expression of type 'char' is 
always false
      [-Wtautological-constant-out-of-range-compare]
    } else if (buf[0] == 0xE5) {

buf[] muss ein unsigned sein, damit das geht.

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
geronet schrieb:
> Das lässt mich hoffen, daß es also irgendwie zu gehen scheint, nur das
> genaue Timing ist warscheinlich wichtig. Auf meinem gebraucht gekauftem
> Zähler zum Testen steht:
> (Baujahr 2011)
> opt. Schnittstelle: M-Bus/EN60870-5 2. 2
> Auf den anderen vier wo ich das dann einbauen will steht:
> (Baujahr 2017)
> opt. Schnittstelle: M-Bus/EN60870-5 4.2
> und
> (Baujahr 2016)
> opt. Schnittstelle: M-Bus/EN60870-5 6.2

Sind das alles kaloUltramax MK Zähler? Ich habe hier einen Integral-V 
UltraLite Pro und konnte ihn mit der von dir geschilderten Abfolge nicht 
zu einer Antwort bewegen. Ich habe mir die Norm mal angeschaut, konnte 
aber keine Zuordnung der 2.2, 4.2 oder 6.2 Nummerierung erkennen.

Vielleicht kannst du hier deinen Code veröffentlichen, damit es andere 
auch probieren können.

Ansonsten scheinst du ja die richtige Antwort zu bekommen, 684D4D68 
sieht doch sehr gut aus.

> warning: comparison of constant 229 with expression of type 'char' is
> always false

Uhh, manchmal sollte man -Wextra anmachen.

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Im Moment ist es noch gar kein Code, sondern nur 0x55 und die 
entsprechende Zeichenfolge im Terminal (CoolTerm).
Es klappt aber recht selten daß eine Antwort kommt, aber immerhin.
Der Zähler ist gebraucht, ist ein Integral MK-UltraMaXX. Die neueren 
(sind Integral-V UltraLite) kann ich nicht testen, die sind ca. 5 km 
weg.

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@Alexander S.: Hast du mal geprüft, was du wirklich sendest?
Zum Beispiel Spiegel hinhalten und schauen was zurückkommt. Ich hab dein 
Programm übernommen und abgeändert: Thread eingebaut zum Empfangen. Im 
Moment kommt aber nicht das zurück, was ich senden will.
Warum probierst du es eigentlich nicht mit 0x55 als Initialisierung?

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Noch was: Im Datenblatt steht:

2.2 ZVEI
Die optische ZVEI Schnittstelle arbeitet mit folgenden Parametern:
• Physical Layer: ZVEI mit MUX LED; reduzierten optische Kenndaten
• Kontaktaufnahme: nach EN601107
*• Scan-Frequenz 0,5Hz*
• 2400 Baud
• 8 Datenbits
• even Parity
• 1 Stopbit
• Link-Layer: M-Bus EN1434-3
• Application Layer: M-Bus EN1434-3

Hast du Zugriff auf die EN601107?
Die Scan-Frequenz ist wohl ein Hinweis darauf, daß der WMZ nur alle 2 
Sekunden nach der Schnittstelle schaut, deshalb soll man mind. 2.2 
Sekunden 0x55 senden.

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir das Ganze mit dem LA (Abgriff Sendediode) angeschaut und 
dort passt alles.

Warum ich genau 0x00 sende weiß ich nicht mehr - habe das aber auch mal 
probeweise in 0x55 abgeändert. Ich habe mir damals die Standards (also 
z.B. DIN-EN 62056-21 in Version 2003-01, Anhang B) angeschaut und dort 
ist das Protokoll so beschrieben.

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
geronet schrieb:
> 2.2 ZVEI
> Die optische ZVEI Schnittstelle arbeitet mit folgenden Parametern:
> • Physical Layer: ZVEI mit MUX LED; reduzierten optische Kenndaten
> • Kontaktaufnahme: nach EN601107

Ich denke das ist ein Schreibfehler. Ich kann keine Norm unter diesem 
Namen finden. EN60107 ist "Meßverfahren für Empfänger von 
Fernseh-Rundfunksendungen" und EN60110 hat kein Kapitel 7 bzw. ist über 
"Leistungskondensatoren für induktive Erwärmungsanlagen. Beuth kennt 
diese Norm auch nicht.
"
> *• Scan-Frequenz 0,5Hz*
> • 2400 Baud
> • 8 Datenbits
> • even Parity
> • 1 Stopbit
> • Link-Layer: M-Bus EN1434-3
> • Application Layer: M-Bus EN1434-3
>
Dieser Ablauf entspricht IMHO dem von EN 13757-2. Nur das diese Norm 
eigentlich die kabelgebundene Schnittstelle beschreibt und somit nicht 
auf eine Aufwachsequenz eingeht.
In der EN 1434-3 im Anhang B findet man ein Ablaufbeispiel zur EN 
13757-2 mit Aufwachsequenz:
2,2 +-0,1s 0x55 senden oder auch > 330 Bitzeiten wobei danach zwischen 
33 und 330 Bitzeiten gewartet werden muss (bis zu nächsten 
Kommunikation)

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Man könnte sich auch einfach so ein Teil besorgen:
https://www.allmess.de/fileadmin/multimedia/alle_Dateien/DB/DB_P0409_EquaScan%20hMIU%20RF_TS0817.pdf
und dort die Sendediode untersuchen bzw. was "dazwischenschalten".. Hab 
ich irgendwo für 60 € gesehn.
Oder bei Itron direkt anfragen?

von geronet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Andere Frage: Könnte das auch eine IrDA Schnittstelle sein? Woran 
erkennt man das?

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
geronet schrieb:
> Man könnte sich auch einfach so ein Teil besorgen:
> 
https://www.allmess.de/fileadmin/multimedia/alle_Dateien/DB/DB_P0409_EquaScan%20hMIU%20RF_TS0817.pdf
> und dort die Sendediode untersuchen bzw. was "dazwischenschalten".. Hab
> ich irgendwo für 60 € gesehn.
> Oder bei Itron direkt anfragen?

Ich habe mal Allmess angefragt und dort hat man mir eine Software zum 
Auslesen der Zähler gegeben. Wenn du mir per PM deine E-Mail zukommen 
lässt schicke ich dir den Link. Damit hat es aber auch nicht 
funktioniert, so langsam zweifle ich an meinen Dioden (die aber mit den 
Schnittstellen in Stromzählern gehen...).

Andere Frage: Könnte das auch eine IrDA Schnittstelle sein? Woran
erkennt man das?
Ich kenne die IrDA Schnittstellen immer nur mit 9600Baud.

von minifloat (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alexander S. schrieb:
> malloc(255);

geronet schrieb:
> Da ist ein Fehler drin [...]

Da ist ein klassisches Speicherleck drin! Malloc() ohne Free(), jedesmal 
wenn read_data bemüht wird.

mfg mf

von Johannes R. (jomone)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich dachte ich lasse das Thema wieder aufleben.
Ich versuche meinen Zenner Zelsius Wärmezähler mithilfe eines 
IR-Lesekopfs und einem Raspberry Pi auszulesen. Leider klappt es noch 
nicht. Bisher bin ich wie folgt vorgegangen.
Zunächst habe ich mir von Zenner die MSS Software runtergeladen und eine 
Demolizenz eingerichtet.
Für meinen IR-Lesekopf (CP2104) habe ich hier den Treiber für Win10 
gefunden 
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
Dann habe ich die von Zenner angegebenen Einstellungen im Geräte-Manager 
eingegeben: 2400 8E1
In der Zenner Software (MSS) die Gruppe "Computer ports", Ableseart "USB 
port" mit entsprechendem Treiber, Gerätetyp
"C5 Standard", Profiltyp "IR ZVEI" ausgewählt und siehe da, der Zähler 
wurde ausgelesen.
WICHTIG: vorher muss man die Taste auf dem Zähler drücken, vermutlich um 
die Schnittstelle zu aktivieren.

Nun habe ich mit einem zweiten IR-Lesekopf den "output" der Zenner 
Software mitgeschnitten... das kam dabei raus

0000250: fe51 0f00 0000 06b7 1655 5555 5555 5555  .Q.......UUUUUUU
0000260: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000270: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000280: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000290: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002a0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002b0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002c0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002d0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002e0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002f0: 5568 0808 6853 fe51 0f00 0000 06b7 1655  Uh..hS.Q.......U
0000300: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000310: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000320: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000330: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000340: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000350: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000360: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000370: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000380: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000390: 5555 5555 5555 5568 0808 6853 fe51 0f00  UUUUUUUh..hS.Q..
00003a0: 0000 06b7 1655 5555 5555 5555 5555 5555  .....UUUUUUUUUUU
00003b0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00003c0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00003d0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00003e0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00003f0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000400: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000410: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000420: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000430: 5555 5555 5555 5555 5555 5555 5568 0808  UUUUUUUUUUUUUh..


...und weiter bin ich nicht.
wenn ich die entsprechenden parameter auf dem Raspberry Pi in minicom 
eingebe (2400 8E1) und den oberen Code eingebe passiert nichts.
Wenn ich mit der TV-Fernbedienung auf den IR-Kopf "schieße" bekomme ich 
in minicom einen Output. Von meinem Zähler jedoch nicht.

Kann mir jemand weiterhelfen?
Vielen Dank für eure Antworten!

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Johannes R. schrieb:
> Hallo zusammen,
Hallo,

>
> ...und weiter bin ich nicht.
> wenn ich die entsprechenden parameter auf dem Raspberry Pi in minicom
> eingebe (2400 8E1) und den oberen Code eingebe passiert nichts.

Welchen Code gibst du ein? Den Mitschnitt den du gepostet hast?

> Kann mir jemand weiterhelfen?

Das ist eine Anfrage:

5555 5555 5555  .Q.......UUUUUUU
0000260: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000270: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000280: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
0000290: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002a0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002b0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002c0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002d0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002e0: 5555 5555 5555 5555 5555 5555 5555 5555  UUUUUUUUUUUUUUUU
00002f0: 5568 0808 6853 fe51 0f00 0000 06b7 16

Beginnt mit der Aufwachsequenz 0x55 und dann folgt eine MBus Abfrage 
(Long Frame). Meistens wird die Aufwachsequenz mit 2400 8N1 gesendet, 
wichtig ist eine wechselnde 1/0 Folge mit einer Dauer von 2,1-2,2 
Sekunden.

Was bei der einfachen Wiedergabe der Aufzeichnung vermutlich verloren 
geht ist das Timing. Bei dem von mir genutzten Zähler ist z.B. nach der 
Aufwachsequenz eine Pause von 100ms und nach der ersten Anfrage muss der 
Zähler zwischen 11 und (330 + 50ms) Bitzeiten warten (ich glaube 
EN1434-3) bis er antwortet.

=> Mache eine erneute Aufnahme wo das Timing berücksichtigt wird 
(Achtung, oft sind Buffer, wie bei deinem silabs 576 Byte, im 
Übertragungsweg die jenes verfälschen) - oder probiere es mal mit den 
genannten Zeiten

von Johannes R. (jomone)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Alexander,
vielen Dank für deine Antwort!
Ich hab die "Aufzeichnung" mit dem Programm minicom gemacht... leider 
weiß ich nicht, ob man dabei das Timing aufzeichnen kann.
Kennst du ein Programm, mit dem das geht?
Leider übersteigt die Thematik etwas meine Fähigkeiten.
Ist die Nachricht, die ich oben gepostet habe in HEX ??
Wie kann man das von dir beschriebene timting programmieren?

Danke für jeden Hinweis!

von Alexander S. (alexanders)


Bewertung
1 lesenswert
nicht lesenswert
Bei CuteCom wird ein Zeitstempel angezeigt, es gibt aber auch die 
Einschränkung mit den Buffern.

Ich nutze dafür einen Logikanalyser.

Die Nachricht die du geposted hast ist folgendermaßen aufgebaut:
Offset von Beginn, Datenzeile in Hex, Datenzeile in ASCII.

Ich kann dir keine Antwort auf die Frage wie du das Programmieren kannst 
geben. Dazu wäre erst einmal Interessant welche Programmiersprachen du 
kannst.

Du kannst dir ja mal das C Beispiel weiter oben anschauen. Dort wird 
probiert mit verschiedenen Protokollen den Zähler anzusprechen.
(Achtung!: Das Beispiel ist nicht für den produktiven Einsatz gedacht, 
siehe z.B. memory leak)

: Bearbeitet durch User
Beitrag #6022928 wurde vom Autor gelöscht.
von Alexander S. (alexanders)


Bewertung
1 lesenswert
nicht lesenswert
Ich glaube du wirfst hier ein paar Zahlendarstellungen durcheinander. 
Minicom erwartet normalerweise ASCII Zeichen, das 55 ist aber wie schon 
genannte die HEX Spalte. Das 0x ist eine gängige Kennzeichnung das es 
sich um Hex handelt und nicht um z.B. Zahlen oder ASCII. Somit 
entspricht 0x55 dem ASCII Wert 'U' und dem Dezimalwert 85. Wenn du in 
Minicom nun eine 5 eingibst wird das nach ASCII Tabelle in 0x35 
gewandelt und dann als ein Byte übertragen. Somit findet hier schon eine 
komplett andere Übertragung statt.

Ich kann dir nur raten dich erst einmal mit den verschiedenen 
Zeichendarstellungen zu beschäftigen.

Ich kann mir nicht vorstellen das es möglich ist das Timing in Minicom 
zu erreichen. Wenn du Erfahrung in Python hast probiere doch mal darüber 
die erfassten Daten erneut über die serielle Schnittstelle auszusenden 
und lasse eine kurze Pause (ca.100ms) zwischen der Aufwachsequenz und 
der ersten Anfrage. Dann sollten du im Anschluss zumindest eine 
Bestätigung vom WMZ empfangen.

von Johannes R. (jomone)


Bewertung
0 lesenswert
nicht lesenswert
>Bei CuteCom wird ein Zeitstempel angezeigt, es gibt aber auch die >Einschränkung 
mit den Buffern.

Danke für den Tipp!
ich lade mir Linux Mint, damit ich CuteCom ausprobieren kann.

>Ich nutze dafür einen Logikanalyser

Das habe ich leider nicht.
Habe ich ohne einen Logikanalyser überhaupt eine Chance?

>Ich kann dir keine Antwort auf die Frage wie du das Programmieren kannst
>geben. Dazu wäre erst einmal Interessant welche Programmiersprachen du
>kannst.

Ich kann etwas python. Bisher habe ich kleine Programme zum Mitloggen 
von Temperaturdaten geschrieben.
Diese Maschinenkommunikation sind für mich aber böhmische Dörfer...

von Johannes R. (jomone)


Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich die "Zenner Anfrage" nochmal mit CuteCom mitgeloggt.
Das Ergebnis in ASCII:

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 
UUUUUUUUh\0x08\0x08hS\0xfeQ\0x0f\0x00\0x00\0x00\0x06\0xb7\0x16UUUUUUUUUU 
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUh\ 
0x08\0x08hS\0xfeQ\0x0f\0x00\0x00\0x00\0x06\0xb7\0x16UUUUUUUUUUUUUUUUUUUU 
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUh\0x08\0x08h 
S\0xfeQ\0x0f\0x00\0x00\0x00\0x06\0xb7\0x16

über das timing weiß ich leider auch nicht mehr.

Ist es richtig, wenn ich jetzt die UUUUUUUUUU... Folge in cutecom zeile 
einfüge und mit enter abschicke??? Oder muss ich das auf jeden Fall mit 
einem Programm machen?

von Reinhard N. (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
da ich mich auch mit dem Thema beschäftige, wollte ich hier mal meine 
Erfahrungen berichten.
Ich versuche einen Engelmann SensoStar2 Wärmemengenzähler zu lesen. Dazu 
benutze ich den Optokopf aus dem Volkszähler Projekt. Nach vielen 
Versuchen habe ich einsehen müssen, dass sich dieser Zähler nicht mit 
einer optischen Sequenz aufwecken ließ. Nach vielen erfolglosen 
Versuchen habe ich die SW LorusFree (Link in einem der vorherige Posts) 
genutzt und die Sequenz mit einem Logikanalyser mitgelesen. Die SW hat 
auch die Funktion des optischen Aufwachens, das funktioniert mit diesem 
Typ Zähler aber nicht.
Man muss die Taste am Zähler drücken und dann den Auslesevorgang 
starten. Das Ergebnis häng ich als Screenshot an.
Nach dem Logikanalyser läuft folgende MBus Sequenz
Lorus sendet: 10 40 fe 3e 16     (das ist ein Broadcast=Adresse FE)
Zähler antwortet nach ca. 50ms mit 5E   (das ist ein ACK)
nach 50ms Lorus sendet: 10 7b fe 79 16  (das ist ein Request for Class2 
Data)
Zähler antwortet nach 50ms (hier mitgelesen mit CuteCom):
00000000    68 93 93 68 08 00 72   75 40 48 10 c5 14 00 04   .h..h␈
00000016 24 27 00 00 04 78 6b f9   9f 00 04 6d 11 0e 63 2b   $'
00000032 04 15 e0 20 00 00 44 15   e0 20 00 00 84 01 15 e0   ␄␕.
00000048 20 00 00 04 06 a0 21 00   00 44 06 a0 21 00 00 84
00000064 01 06 a0 21 00 00 84 10   06 00 00 00 00 c4 10 06   ␁␆.!
00000080 00 00 00 00 84 11 06 00   00 00 00 42 6c 5f 2c 02
00000096 6c 7f 2c 04 3b 00 00 00   00 14 3b 08 01 00 00 04   l.,␄;
00000112 2b 00 00 00 00 14 2b 39   24 00 00 02 5b 17 00 02   +
00000128 5f 17 00 04 61 24 00 00   00 02 23 81 0c 01 fd 17   _␗
00000144 00 04 90 28 0b 00 00 00   40 16
Die gesamte Übertragung läuft mit 2400 8E1

Nachdem ich das soweit im Griff hatte, habe ich es dann mit libmbus 
versucht und nach einigen Versuchen auch den korrekten Aufruf gefunden, 
hier mit Adresse 0, da auf einen Scan hier eine Antwort kam:
mbus-serial-scan -d -b 2400 /dev/ttyUSB0
Scanning primary addresses:
0 [2019-11-03 14:50:29] SEND (005): 10 40 00 40 16
[2019-11-03 14:50:29] RECV (001): E5

Found a M-Bus device at address 0
Die gesamte Ausgabe auf den Request häng ich als txt File an

Mein Plan ist, die Antwort soweit zu kürzen, dass ich den Zählerstand 
per LoRaWAN über TTN senden kann. Jetzt werd ich mich wohl mit dem 
Payloadformat auseinandersetzen müssen.

von Alexander S. (alexanders)


Bewertung
0 lesenswert
nicht lesenswert
Reinhard N. schrieb:

Das Funkmodul FAW (https://www.engelmann.de/de/funkaufsatzmodul-faw/) 
ist somit nicht mit deinem Zähler kompatibel? Zumindest scheint es 
diesem ja möglich zu sein unabhängig vom Knopfdruck auszulesen.

> Nachdem ich das soweit im Griff hatte, habe ich es dann mit libmbus
> versucht und nach einigen Versuchen auch den korrekten Aufruf gefunden,
> hier mit Adresse 0, da auf einen Scan hier eine Antwort kam:

Ich hatte mal wo gelesen, das viele WMZ mit Adresse 0 ausgeliefert 
werden.

> Mein Plan ist, die Antwort soweit zu kürzen, dass ich den Zählerstand
> per LoRaWAN über TTN senden kann. Jetzt werd ich mich wohl mit dem
> Payloadformat auseinandersetzen müssen.
Ich prüfe das XML gegen ein XSD File und versende die Daten dann per 
MQTT an eine Hausautomatisierung.

von Reinhard N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alexander S. schrieb:
> Das Funkmodul FAW (https://www.engelmann.de/de/funkaufsatzmodul-faw/)
> ist somit nicht mit deinem Zähler kompatibel? Zumindest scheint es
> diesem ja möglich zu sein unabhängig vom Knopfdruck auszulesen.

Das nicht, es gäbe aber ein anderes passendes Modul. Bin mir nur nicht 
sicher, ob das nachrüstbar ist. Da der Zähler aber beim Vermieter hängt 
und der den wenn überhaupt dann vom Fachmann einbauen lassen will, wird 
das teuer.

Alexander S. schrieb:
> Ich prüfe das XML gegen ein XSD File und versende die Daten dann per
> MQTT an eine Hausautomatisierung.

würde ich auch so machen, aber ich habe am Zähler kein WLAN, dehalb 
LoRaWAN. Gateway ist vorhanden. Aber erst muss ich das Thema mit dem 
Drücken des Tasters lösen. Vielleicht mit einem Servo.

von Reinhard N. (rn-cologne)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Reinhard N. schrieb:
Aber erst muss ich das Thema mit dem
> Drücken des Tasters lösen. Vielleicht mit einem Servo.

check: drücken des Tasters gelöst

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
Reinhard N. schrieb:
> check: drücken des Tasters gelöst

Woher hast Du denn die Schale für den Servo und das Meßgerät? 3-D 
Drucker?
mfg klaus

von Reinhard N. (rn-cologne)


Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Woher hast Du denn die Schale für den Servo und das Meßgerät? 3-D

Den Zähler hab ich gebraucht von eBay. Die Halterung des Servos kommt 
aus dem  3D-Drucker. Bei Interesse kann ich die STL zur Verfügung 
stellen. Ich konnte leider noch nicht testen, ob das auch bei dem Zähler 
passt, den ich eigentlich messen will.
Hier zusätzlich als Info: ich habe diese SW gefunden, davon werde ich 
einiges übernehmen können.
https://github.com/btm/emonMbus

von Stefan B. (stefan_b278)


Angehängte Dateien:

Bewertung
3 lesenswert
nicht lesenswert
Ich hab mir optische Module zusammengebaut und erfolgreich getestet, die 
per RS-485 Bus mit 2 8P8C (RJ45) Steckern und normalen Netzwerkkabeln 
vernetzt werden können und auch die Stromversorgung darüber erhalten.

Die Module haben selbst keine Intelligenz sondern setzen den RS485 Bus 
direkt in Infrarotsignale zum WMZ um bzw. senden auf den Bus wenn sie 
etwas vom WMZ empfangen. Das funktioniert auch ohne Kollisionen wenn man 
die Zähler per primärer (vorher per Einzelanschluss zu vergeben) oder 
sekundärer Adressierung anspricht. Der MAX13487 macht das per 
AutoDirection möglich. Im Prinzip ist das wie ein drahtgebundener MBus, 
nur mit RS485 und vor der Zählerkommunikation muss man den/die Zähler 
mit 2400 Baud 8N1 2.2 Sekunden lang mit 0x55 aufwecken.

Die Gehäuse sitzen fest auf dem Wärmezähler nur mit den zwei Noppen, die 
genau in die Bohrungen im Gehäuse greifen.

Im Moment sind 4 Module und ein Zusatzmodul am Bus, das mir die 
TTL-UART-Signale mit einem MAX232 umwandelt und ein RS232-USB Stecker 
den Bus vom Rechner aus zugänglich macht. Ich baue mir aber noch ein 
Master-Gerät im Hutschienenformat das dann direkt die Daten täglich oder 
monatlich einsammelt und noch ein paar andere Funktionen hat (Gaszähler- 
und Wasserzählerimpulse, Stromzähler etc.)

von Stefan B. (stefan_b278)


Angehängte Dateien:

Bewertung
2 lesenswert
nicht lesenswert
Jetzt hab ich die 4 Module installiert und per Bus verbunden. 
Funktioniert einwandfrei ;)
Muss noch das Ausleseprogramm ein bisschen erweitern damit das 
Mbus-Protokoll richtig interpretiert wird.

Beispiel für Ausgabe:
-------------------------------------------------
primary_address:  0x01
customer_number:  17540027
manufacturer:    ITR
generation:    23
medium:      4   = Wärme
reading_counter:  115
error_code:    0
signature:    0
fabrication_number:  17540027
energy:      5889 kWh
volume:      1187229 l
power:      0 W
flow:      0 l/h
supply_temp:    29.8 °C
return_temp:    22.0 °C
temp_difference:  7.85 K
date:      04.01.2020
time:      18:10:00
operating_time:    1031
firmware_version:  7
software_version:  17
alarm_code:    0
-------------------------------------------------

von LoxWinner (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe heute mal meinen Itron WMZ UltraMax aufgeschraubt und an der 
rechten Seite gibt es ein Steckmodul hinter der runden Plastikabdeckung 
mit 4 Leitern / Polen.
Hat jemand eine Ahnung, ob das auch die M-Bus-Schnittstelle ist, welches 
werkseitig dann in der M-Bus-Variante mit dem 1,2m langem Kabel 
ausgeliefert wird?
Und welcher Pol / Anschluss wie zu verdrahten ist?
Dann würde man sich den Umweg über die optische Schnittstelle sparen.
Gruß

von Jan S. (john85)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab den folgenden Wärmezähler:
allmess Integral-MK UltraMaXX

Wenn die optische Schnittstelle funktioniert wäre es mir ja egal ob 
darüber oder per Kabel.

@ LoxWinner:
Kann man das Teil ungeschadet öffnen und wieder zusammenbekommen, oder 
ist eine Öffnung nachher nachvollziehbar? Könntest du vlt. mal ein Foto 
im geöffneten Zustand hochladen?


Leider hab ich es bisher nicht geschafft dem Gerät eine Antwort zu 
entlocken.

Setup
- Infrarotdiode(unbekannt) und -transistor(SFH309FA-4) bisher auf 
Lochrasterplatine (Dioden je an einem Transistor) (Daten werden durch 
Spiegel korrekt ins Terminal zurückgegeben)
- Anordnung wo Sende-Diode und Empfangs-Transistor auf dem Integral-MK 
hin müssen hab ich mal aus Stefan seinen Bildern entnommen:
links (näher am roten Taster) ist laut deiner Platine die D1, also der 
Sender vom Interface)
rechts ist T1, also die Empfängertransistor
Oder?
Das sieht so schon echt top aus in dem Gehäuse mit LAN-Kabel!

Probiert hab ich
- per hterm (Win) oder moserial (Ubuntu)  Kommunikation herzustellen 
(wie hier mal angegeben 2.400 baud, 8N1)
- jmbus v 3.2.1 auf Ubuntu 18.04.3
./jmbus-app.sh scan -cp /dev/ttyUSB0  -bd 2400 -t 1000  -v
- libmbus http://www.rscada.se/libmbus/ auf Ubuntu Laptop per
mbus-serial-scan -d -b 2400 /dev/ttyUSB0

- LorusFree Version 2018 auf dem Win10 Laptop
(- Tasmota mit SML Bibliothek gebaut und auf Wemos D1 Mini
https://tasmota.github.io/docs/#/peripherals/Smart-Meter-Interface
da ist aber das „Smart Meter Interface Descriptor“ Script noch nicht so 
ganz fertig.
Zumal ich mir auch nicht ganz sicher bin, ob ich das Counterflag mit 
oder ohne Pullup eingestellt sein muss.
>D

>B
=>sensor53 r

>M 1
+1,3,m,1,2400,MODBUS,1,1
1,xxxx0503xxxxxxxxxxxxxxuu@1,Heizung,kWh,Warmwater,3     #--->  to do ...
# 
)
- Hab mir jetzt ein Python Script geschrieben um genau die 2.2+-0.1 s 
lang  0x55 zu schicken. Laut Oszi passt das jetzt auch perfekt.
Werde mich wohl als nächstes doch mal mit dem M-BUS Telegrammen 
auseinandersetzten und diese in mein Script implementieren.
https://m-bus.de/telegramme.html bzw. das zur Unterstützung nehmen:
https://github.com/openenergymonitor/HeatpumpMonitor/blob/master/Firmware/Arduino/MBUS_Reader/mbus.ino

@ Stefan B. (stefan_b278)
Ich wäre wirklich froh, wenn Stefan uns seinen Code für die 
Kommunikation mit dem allmess Gerät zur Verfügung stellen würde, dann 
kann ich vlt. zumindest mal wissen ob es generell mit meinem Zähler und 
dem  provisorischen Interface funktioniert.
Komm mir langsam zu blöd vor!

Vielen Dank im Voraus!

Gruß,
Jan

von Stefan B. (stefan_b278)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
LoxWinner schrieb:
> Hallo zusammen,
>
> habe heute mal meinen Itron WMZ UltraMax aufgeschraubt und an der
> rechten Seite gibt es ein Steckmodul hinter der runden Plastikabdeckung
> mit 4 Leitern / Polen.
> Hat jemand eine Ahnung, ob das auch die M-Bus-Schnittstelle ist, welches
> werkseitig dann in der M-Bus-Variante mit dem 1,2m langem Kabel
> ausgeliefert wird?
> Und welcher Pol / Anschluss wie zu verdrahten ist?
> Dann würde man sich den Umweg über die optische Schnittstelle sparen.
> Gruß

Du meinst sicher den Stecker auf dem Foto links. Mit MBus hat das nichts 
zu tun, ich denke das wird der Programmierstecker sein um z.B. die 
Software draufzuladen und Kalibrierinformationen für die 2 Fühler zu 
übertragen.

Der Mbus-Chip wird wohl unten rechts aufgelötet, der Kabelanschluß ist 
jedenfalls schon vorhanden.

: Bearbeitet durch User
von Stefan B. (stefan_b278)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Jan S. schrieb:
> Kann man das Teil ungeschadet öffnen und wieder zusammenbekommen, oder
> ist eine Öffnung nachher nachvollziehbar? Könntest du vlt. mal ein Foto
> im geöffneten Zustand hochladen?

Hinten sind nur zwei Schrauben durch rote Kappen (Plomben) verdeckt, 
eine Öffnung sieht man nur wenn man die Plomben rauspult.

Links muss deine Diode senden, rechts sitzt der Phototransistor.
Sieht man auch gut auf dem Bild, rechts ist die weiße Infrarotled vom 
WMZ.

Jan S. schrieb:
> Ich wäre wirklich froh, wenn Stefan uns seinen Code für die
> Kommunikation mit dem allmess Gerät zur Verfügung stellen würde, dann
> kann ich vlt. zumindest mal wissen ob es generell mit meinem Zähler und
> dem  provisorischen Interface funktioniert.
> Komm mir langsam zu blöd vor!

Kam ich mir auch vor, von 4 WMZ konnte ich einen nie auslesen, alle 
anderen funktionierten. Dann hab ich die 4 Module gebaut, und mit einem 
Modul funktionierte auch dieser. Den Grund hab ich bis jetzt noch nicht 
herausfinden können, es liegt aber nicht an der Positionierung der Leds. 
Vielleicht eine leicht andere Wellenlänge?

Meine Software hab ich mal drangehängt.
Ist ein C-Programm und kompiliert mit OSX und Linux.
Bei 1) muss ein E5 zurückkommen.
Bei 3) die kompletten Informationen vom WMZ.

: Bearbeitet durch User
von Jan S. (john85)


Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert :-)
Vielen Dank dir!!

Da warst du ja mal richtig fleißig was die SW angeht!

Hab deine SW in Code::Blocks "gebuildet" und es lief direkt auf Ubuntu. 
Ich musste nur das vorzeitige Ende (return 0;) in der Zeile 579 
auskommentieren, damit ich bis zur While-Schleife mit den 
Abfragemöglichkeiten kam.

Hat dann auch direkt mit der ersten Aufwachsequenz funktioniert und mit 
3) kamen alle Daten:
-------------------------------------------------
primary_address:  0x00
customer_number:  18797981
manufacturer:    ITR
generation:    23
medium:      4   = Wärme
reading_counter:  14
error_code:    0
signature:    0
fabrication_number:  18797981
energy:      1985 kWh
volume:      194180 l
power:      7200 W
flow:      416 l/h
supply_temp:    51.7 °C
return_temp:    36.9 °C
temp_difference:  14.78 K
date:      12.01.2020
time:      08:56:00
operating_time:    436
firmware_version:  7
software_version:  17
alarm_code:    0
-------------------------------------------------

Ich bin begeistert!

Ich hatte erwartet, dass das Display durch die Aufwachsequenz angeht, 
aber das bleibt aus.

Meine HW war also definitiv okay, es lag an der SW.

Verblüffend ist, dass trotz aufwecken mit deiner SW direkt danach 
dennoch mit den anderen Programmen immer noch keine Kommunikation 
möglich ist.
Weder mit jmbus, libmbus oder Lorus erhalte ich irgend eine Antwort.
Dass die Programme irgendetwas senden sehe ich an der TX-LED meines 
IR-Interfaces, aber es kommt laut Terminal und RX-LED einfach überhaupt 
keine Reaktion vom Wärmemengenzähler.

Was auch immer du da gezaubert hast funktioniert auf jeden Fall mit 
meinem Zähler. :-)

: Bearbeitet durch User
von Stefan B. (stefan_b278)


Bewertung
0 lesenswert
nicht lesenswert
Jan S. schrieb:
> Ich musste nur das vorzeitige Ende (return 0;) in der Zeile 579
> auskommentieren, damit ich bis zur While-Schleife mit den
> Abfragemöglichkeiten kam.

Ja stimmt ich hatte da noch einen Testlauf drin, am besten alle Zeilen 
von 575-579 löschen.

Jan S. schrieb:
> Verblüffend ist, dass trotz aufwecken mit deiner SW direkt danach
> dennoch mit den anderen Programmen immer noch keine Kommunikation
> möglich ist.

Der Zähler bleibt meines Wissens nach nur ca. 3 Sek. aufgeweckt. Da wird 
dir die Zeit nicht reichen zum umschalten.

Die Software ist in Zusammenarbeit mit Alexander S. entstanden. Habe 
aber teilweise bei libmbus abgeschaut für die Auswertung.

von Sven K. (satirebird)


Bewertung
0 lesenswert
nicht lesenswert
Hat jemand Erfahrung mit den Wärmemengenzählern von Ista. Bei mir ist 
ein sensonic II verbaut. Die haben auch alle eine optische 
Schnittstelle.

https://www.ista.com/de/technik/waerme-und-kaeltezaehler/

Verwenden die das gleiche Protokoll?

von Stefan B. (stefan_b278)


Bewertung
0 lesenswert
nicht lesenswert
Warscheinlich schon. Ausprobieren!

von Sven K. (satirebird)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte mal wieder Zeit und habe mir einen gebrauchten Zähler besorgt. 
Leider habe ich es bis jetzt nicht geschafft dem Zähler auch nur 
ansatzweise eine Antwort zu entlocken. Ich habe das Tool vom Stefan 
verwendet und am Timing noch etwas modifiziert, da es bei mir noch nicht 
ganz gepasst hatte.

Ich habe alles mit einem Logic-Analyzer mitgeschnitten. Neben der TXD 
und der RXD Leitung habe ich auch die Batteriespannung mitgeschnitten. 
Man kann daran erkennen, wenn der Controller im Zähler aufwacht. Den 
Messzyklus alle 60s kann man schön erkennen.

Unterschiedliche längen der Aufwachsequenz, andere M-Bus Adressen und 
Timing-Varianten habe ich schon durchprobiert. Der Zähler bleibt einfach 
stumm.

Im Internet sind die Zulassungsdokumente zugänglich:

http://legnet.metas.ch/legnet2/Eichstellen/Eichstellen_Waerme/Zulassungen/thermische_energie/t2_waermezaehler_und_komponenten_nach_en_1434/741-750/T2-750/Pub-CH-T2-13750-00.PDF

Darin wird unter 2.3.1 geschrieben, dass die optische Schnittstelle auf 
der Norm EN 1434 basiert. Ich denke es sollte doch möglich sein, mit dem 
Zähler zu kommunizieren. Anscheinend gibt es auch Schnittstellen dafür: 
Youtube-Video "Contador de energía Sensonic II"

Hat noch jemand eine Idee, wie man die optische Schnittstelle aktiviert 
bekommt? Hat jemand so einen Adapter zur Hand und könnte mal messen, was 
da gesendet wird?

von Stefan B. (stefan_b278)


Bewertung
0 lesenswert
nicht lesenswert
Werden die 0x55 mit 8N1 gesendet und die Init-Sequenz mit 8E1?
Schonmal mit 300 baud versucht?

https://www.ista.com/fileadmin/twt_customer/countries/content/Germany/Documents/Loesungen/Funk/M-Bus_System/Protokollbeschreibung_modul_mbus.pdf

Und probier mal die Init-Sequenz etwas später zu schicken, so nach ca. 
0,5s.

von Stefan B. (stefan_b278)


Bewertung
0 lesenswert
nicht lesenswert
Warum sind die Daten auf der TXD UND RXD Leitung sichtbar?

Eventuell kann auch die Positionierung der Leds wichtig sein. Hat der 
Deckel eine optische Linse eingebaut?
Ich hatte mir zum Testen eine Halterung gebaut, wo die Sendeled und 
Empfangsdiode direkt über denen vom WMZ liegt, um den Faktor 
auszuschließen.

von Sven K. (satirebird)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Tipp mit den 300 Baud war gut. Ich habe die Init-Sequenz mit 300 
Baud gesendet und parallel die Batteriespannung aufgezeichnet. Im Bild 
kann man schön erkennen wie der Controller aus dem Schlaf aufwacht. Bei 
einigen Versuchen brauchte der Controller max. ca. 400ms um aufzuwachen.

Allerdings ließ hat der Controller nicht mit 300Baud auslesen. Anhand 
der Spannungseinbrüche hat man aber schön gesehen, dass der Controller 
alle 4.4ms etwas macht. Das ist genau eine Byte bei 2400Baud.

Die Aufwachsequenz muss also mit 300Baud für 0.5s gesendet werden. 
Danach kann praktisch ohne Verzögerung auf 2400Baud umgeschaltet werden 
und man kann die Daten senden. Im Bild sieht man wie die Antwort 
gesendet wird: 0xE5

Meine Fotodiode ist für die LED allerdings sehr unempfindlich. Ich nehme 
an, dass die Wellenlänge nicht passt. Das Digitalisieren geht so noch 
nicht. Ich muss man noch andere Fotodioden probieren.

> Warum sind die Daten auf der TXD UND RXD Leitung sichtbar?

Das liegt an den Reflexionen. Das ist praktisch nur das Echo. Die 
Reflexionen sind praktisch stärker als das Nutzsignal. Ich werde jetzt 
schauen, dass ich den Adapter optimieren kann.

von Stefan B. (stefan_b278)


Bewertung
0 lesenswert
nicht lesenswert
Cool, probiers mal mit 950 nm.

von Heinz R. (heijz)


Bewertung
0 lesenswert
nicht lesenswert
Alexander S. schrieb:
> Ich habe mal Allmess angefragt und dort hat man mir eine Software zum
> Auslesen der Zähler gegeben. Wenn du mir per PM deine E-Mail zukommen
> lässt schicke ich dir den Link. Damit hat es aber auch nicht
> funktioniert, so langsam zweifle ich an meinen Dioden (die aber mit den
> Schnittstellen in Stromzählern gehen...).

Hat zufällig jemand diese Software und könnte sie mir zur Verfügung 
stellen?

Die ALlmess-Seite ist wohl komplett nicht erreichbar?

Spiele auch gerade aus Langeweile mit WMZ herum - meine eigenen sind 
über M-Bus, das funktioniert

Würde es jetzt gerne über Opto-M-Bus hinbekommen, bislang spricht nur 
ein Sensus Pollucom mit der Original-Software mit mir
Lorusfree geht bei diesem von 10 Versuchen 1 x

Kocht da echt jeder Hersteller seine eigene Suppe?

Viele Grüße

Heinz

von Sven K. (satirebird)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in der Zwischenzeit den Opto-Adapter mechanisch fixiert und die 
LED mit etwas Schrumpfschlauch optisch abgeschirmt. Damit funktioniert 
die Kommunikation sehr gut. Ich nutze ein normales FTDI-Kabel (3.3V) für 
die Verbindung zum Rechner. Meine Schaltung habe ich angehängt. Die ist 
sehr einfach und schnell auf einer Lochrasterplatine aufgebaut.

Auf der Softwareseite habe ich mich an der libmbus probiert:
https://github.com/rscada/libmbus
Das ganze dekodieren übernimmt die Bibliothek. Das macht die Software 
schön einfach. Ich habe ein kleines Beispiel zusammengestellt um mit der 
libmbus die Ista-Zähler auszulesen. Dafür muss die libmbus vorher 
installiert sein.
git clone https://github.com/rscada/libmbus.git
cd libmbus
./build.sh
sudo make install

Dann einfach
unzip ista.zip
make
./ista

Der Beispielcode gibt die Messdaten in XML-Form wieder aus. Das ganze 
sollte auch mit anderen Zählern funktionieren, wenn man die 
Wakeup-Funktion entsprechend anpasst.

von Sven K. (satirebird)


Bewertung
0 lesenswert
nicht lesenswert
Heinz R. schrieb:
> Kocht da echt jeder Hersteller seine eigene Suppe?

Ich würde sagen jain. Ich habe zwar nur den einen Zähler von Ista hier 
aber den Berichten zufolge würde ich denken, das Problem sind die 
unterschiedlichen Aufwach-Sequenzen. Beim Ista-MWZ sind es 0x55 mit 
300Baud 8N1 für 0.5s. Wenn man auch nur ein bisschen davon abweicht geht 
es nicht mehr. Ich hatte mal mit 300Baud 8E1 getestet, was im Signal nur 
einen minimalen unterschied ausmacht. Aber es hat schon nicht mehr 100% 
funktioniert.
Bei den Allmess-MWZ muss wieder eine andere Aufwach-Sequenz verwendet 
werden. Das eigentlichen MBus-Protokoll ist dann standardisiert und 
sollte für jeden Zähler gleich sein.

von Heinz R. (heijz)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Sven,

welcher Transistortyp ist Q1?

Ich habe zwar einen IR-Lesekopf hier, aber würde mal Deine Schaltung 
zusammen mit LEDs aus einem alten WMZ ausprobieren - vielleicht passt ja 
auch die Wellenlänge nicht

Du schreibst, Du hast die LED optisch abgeschirmt?  bei mir ist es bei 
allen WMZ so, das ich grundsätzlich das gesendete auch wieder empfange, 
wird wohl im Zählerinneren reflektiert
Ist das bei Dir auch so?

von Sven K. (satirebird)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Heinz R. schrieb:
> Hallo Sven,
>
> welcher Transistortyp ist Q1?

Da sollte nahezu jeder beliebige NPN-Transistor funktionieren. Ich habe 
aus meiner Fundkisten einen BC237 genommen. Auch für den 2N7000 sollte 
eigentlich fast jeder NChannel-FET als Ersatz funktionieren. Diese hatte 
ich nur gerade da.

>
> Ich habe zwar einen IR-Lesekopf hier, aber würde mal Deine Schaltung
> zusammen mit LEDs aus einem alten WMZ ausprobieren - vielleicht passt ja
> auch die Wellenlänge nicht
>
> Du schreibst, Du hast die LED optisch abgeschirmt?  bei mir ist es bei
> allen WMZ so, das ich grundsätzlich das gesendete auch wieder empfange,
> wird wohl im Zählerinneren reflektiert
> Ist das bei Dir auch so?

Nein. Die Reflexionen solltest du irgendwie unterdrücken. Sonst bringt 
das zumindest die Software durcheinander. Ich habe die Sendediode mit 
einem Stück Schrumpfschlauch "optimiert". Siehe Bilder. Damit waren das 
Echo komplett verschwunden. Im Gehäuse sind dann Lichtleiter die bis 
direkt zur Empfangs-/Sendediode gehen.

von Stefan B. (stefan_b278)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Hier gibt es den Schaltplan und Layout für die oben genannten 
"Busmodule":

Die Stecker sind 8p8c:
https://www.tme.eu/de/details/rjjs881401ejh136/rj-steckverbinder/encitech/rjjs-88-1401-ejh-136/

Gehäuse:
https://www.tme.eu/de/details/hm-1551gtbu/universal-gehause/hammond/1551gtbu/

Das Gehäuse muss man ziemlich ausfräsen, die Stege wegzwicken und die 
Löcher nach Plan durch den Boden bohren. Am besten erstmal kleiner damit 
das Gehäuse recht streng auf die Nippel vom WMZ passt, dann hält es von 
alleine.
Damit die Platine reinpasst und ganz am Boden aufliegt muss man auf der 
Lötseite die THT Überstände abschleifen.
Das könnte man bei der nächsten Version sicher verbessern, aber ich 
wollte kein größeres Gehäuse nehmen da man sonst entweder den WMZ nicht 
mehr ablesen kann oder das Teil übersteht.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.