11 Gedanken zu “Raspberry Pi Smartmeter Lesekopf für 1€ selbst bauen.

  1. Hi, Super Anleitung.

    Ist es auch möglich über node red an eine IR LED ein Signal zu schicken damit der Zähler zu senden beginnt?
    Ist bei meinem Iskra Zähler nötig…

  2. Funktioniert am MT681 in so einfach leider nicht. Es wird ein HEX-Protokoll ausgegeben, dieses ist leider in ioBroker mit dem smartmeter Adapter nicht auswertbar. Im Code ist die Startsequenz 1b1b1b1b nicht vorhanden.

    1. Hallo, mittlerweile habe ich auch einen MT681. Hier musste ich noch eine IR-LED für die TX-Verbindung anlöten (ich habe „IRL 81 A“ verwendet, mit einem 1kOhm vorwiederstand direkt an TX). Danach ging es mit dem nodered-smartmetermodul.

  3. Hallo,
    ich habe einen Holley DTS541 und bekomme es leider nicht hin.
    Die LED am Zähler leuchtet quasi dauerhaft und blinkt hin und wieder mal.
    Liegt es eventuell daran?

    1. Holley DTS541 braucht evtl. eine bidirektionale Verbindung. Google sagt er arbeitet evtl mit dem Protokoll IEC 62056-21. Was ich bei Wikipedia gefunden habe suggeriert dass man hier um mit dem Meter zu reden selbst auch senden muss. In dem Fall müsstest du noch eine ir LED ant TX deines seriellen Ports anschließen und vor dem Phototransistor des Lesers platzieren. Ich würde an deiner Stelle aber erstmal googlen ob jemand diesen Leser schon erfolgreich auslesen kann.

  4. Hallo,
    gibt es eine Möglichkeit zwei BPW40 anzuschließen um zwei Zähler auszulesen? Ich hab eine Photovoltaikanlage mit einem eigenen Zähler hier…

    Danke!
    Michael

    1. Hallo Michael,

      Jeder BPW40 braucht seine eigene Serielle Schnittstelle, der Raspi hat aber so weit ich weiß nur eine Hardware-Schnittstelle. Du kannst es für den zweiten BPW40 mit einem USB-Serial adapter probieren. Bei uns kommt auch bald eine Photovoltaikanlage aufs dach, evtl. steh ich dann vor dem gleichen Problem. Falls ich es löse werd ich es verblogen.

      Viele Grüße,
      Paul

    2. Der Raspberry Pi 4 hat zusätzliche serielle Schnittstellen. Lies mal hier: https://www.raspberrypi.org/forums/viewtopic.php?f=107&t=244827 Dort ist beschrieben, wie man diese aktiviert.
      Hier kann man nachlesen welche GPIOs sich zu seriellen Ports machen lassen: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711/rpi_DATA_2711_1p0_preliminary.pdf

      Auf dem Raspberry selbst findet man in der Datei /boot/overlays/README auch die Auflistung der GPIOs für uart2-uart5.
      Bei uart 2 ist TDX2 auf GPIO0 und RDX2 auf GPIO1. (auf GPIO 2 und 3 sind CTS2 und RTS2, wenn man sie benötigt und aktiviert)

  5. Hallo,

    ich versuche verzweifelt die Daten von unseren Easymeter Q3B zu bekommen (BPW40 am Raspberry). Es kommen Daten, aber nicht die ich erwarte. Irgendwie passt da was nicht.
    Mittels folgenden Kommando habe ich die Schnittstelle eingestellt: stty -F /dev/ttyAMA0 9600 cs8 -parenb -ixon -cstopb -echo
    Dann wird folgendes geliefert:

    hexdump -C /dev/ttyAMA0
    00000000 00 00 20 00 00 00 20 00 00 00 10 18 00 00 00 18 |.. … ………|
    00000010 00 00 00 00 00 00 18 00 00 00 18 00 00 00 18 00 |…………….|
    00000020 00 00 3f 00 18 00 00 00 3b 00 20 00 00 00 00 00 |..?…..;. …..|
    00000030 20 00 00 00 20 00 00 00 10 18 00 00 00 18 00 00 | … ………..|
    00000040 00 00 00 7f 00 18 00 00 00 18 00 00 00 18 00 00 |…………….|
    00000050 00 00 18 00 00 00 3b 00 20 00 00 00 00 20 00 00 |……;. …. ..|
    00000060 00 20 00 00 00 10 18 00 00 00 18 00 00 00 00 00 |. …………..|
    00000070 00 18 00 00 00 18 00 00 00 18 00 00 00 00 18 00 |…………….|
    00000080 00 3b 00 20 00 60 00 00 00 20 00 00 00 00 20 00 |.;. .`… …. .|
    00000090 00 00 10 18 00 00 00 18 00 00 00 00 00 10 00 18 |…………….|
    000000a0 00 00 00 18 00 00 00 18 00 00 00 00 18 00 00 00 |…………….|
    000000b0 3b 00 20 00 00 00 00 00 20 00 00 00 00 00 20 00 |;. ….. ….. .|
    000000c0 00 00 12 20 64 06 00 00 00 18 00 00 00 00 00 18 |… d………..|
    000000d0 00 00 00 18 00 00 00 18 00 00 00 18 00 00 00 33 |……………3|
    000000e0 00 20 00 00 00 00 00 20 00 00 00 20 00 00 00 10 |. ….. … ….|
    000000f0 18 00 00 00 18 00 00 00 00 00 18 00 00 00 18 00 |…………….|
    00000100 00 00 18 00 00 00 00 18 00 00 33 00 20 00 00 00 |……….3. …|
    00000110 00 20 00 00 08 00 00 20 00 00 00 10 18 00 00 00 |. ….. ……..|
    00000120 18 00 00 00 00 00 00 00 18 00 00 00 18 00 00 00 |…………….|
    00000130 18 00 00 00 00 18 00 00 00 33 00 20 00 3c 00 00 |………3. .<..|
    00000140 00 20 00 00 00 00 20 00 00 08 10 3b 06 00 00 00 |. …. ….;….|
    00000150 18 00 00 00 00 00 18 00 00 00 18 00 00 00 18 00 |…………….|
    00000160 00 00 00 18 00 00 00 32 00 20 00 00 00 20 00 00 |…….2. … ..|
    00000170 06 00 00 20 00 00 10 20 64 06 00 00 00 18 00 00 |… … d…….|
    00000180 00 00 00 02 00 18 00 00 00 18 00 00 00 18 00 00 |…………….|
    00000190 00 08 00 18 00 00 00 3b 00 20 00 12 00 00 00 00 |…….;. ……|
    000001a0 20 00 02 00 00 00 20 00 02 00 00 40 48 18 00 00 | ….. ….@H…|

    Was könnte hier falsch sein?

    Gruß und Danke
    Jörg

  6. Hallo Jörg,
    ich hatte ein ähnliches Problem. Ich habe mir so geholfen:
    (mit python 3)

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import serial, time, rrdtool
    kennung_zaehlerstand="0100010800ff"
    # weil nach dem OBIS-Kennung weitere Zeichen kommen, die aussortiert werden müssen:
    kennung2="ff56"
    string = ''
    teil = []
    zaehlerstand=''
    pos=''
    start=0
    dif=0
    letzter_wert=0

    if __name__ == "__main__":
    ser = serial.Serial("/dev/serial0", 9600, timeout=1)
    if (ser.isOpen() == False):
    ser.open()

    while True:
    # Puffer löschen, weil sonst „nicht aktuelle“ Werte eingelesen werden
    ser.flushInput()
    string = ser.readline().hex()
    print("|", string, "|")
    if kennung_zaehlerstand not in string:
    pass
    else:
    pos=string.find(kennung_zaehlerstand)
    teil=string.split(kennung_zaehlerstand)
    string = teil.pop(1)
    teil=[]
    teil=string.split(kennung2,2)
    string=teil.pop(1)
    # print(string)
    zaehlerstand=string[0:10]
    print(zaehlerstand)
    # zählerstand = mit einer Kommastelle, daher:
    zeige= (int(zaehlerstand,base=16))/10
    # für die rrd-db muss der wert ohne kommastelle gewählt werden
    i=(int(zaehlerstand,base=16))
    # Differenz ermitteln
    if start !=0:
    dif = i - letzter_wert
    letzter_wert=i
    else:
    start=1
    letzter_wert=i

    print("Messwert: ",zeige/1000, 'kWh Differenz:', dif/10, 'Wh',time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))

    time.sleep(60)
    ser.close()
    print("Ende")

  7. Gerade habe ich bei meinem Raspberry auch den BPW40 angeklemmt.
    Allerdings bekamm ich keine vernüftigen Daten.
    Ein (Pull Up) Widerstand mit 4,7k Ohm zwischen 3,3V und RX hat das Problem gelöst.

Kommentare geschlossen