Hi, vielen Dank an @nebuk.
Ich hab den BK-G4AT mit dem Protokoll AE.05:05.01:01.01.
Ich habs zuerst auch mit nem Wemos probiert, allerdings ESP8266 (D1 mini). Das hab ich mit Arduino irgendwie nicht zum laufen gekriegt und hab mich dann inspirieren lassen von @bv-iobroker. Ich hatte vorher eh einen Pi Zero mit Magnetsensor genutzt und hab den dann einfach mal geupdatet und mit dem USB TTL Adapter läuft es jetzt top. Kosten für den Adapter 2,20€ (Prolific PL2303HX bei Berrybase).
[image: 1769279842446-anschluss.jpg]
Angeschlossen sind wie schon beschrieben:
2 3
1 4
1 - grün - TX
2 - rot - 5V
3 - weiß - RX
4 - schwarz - GND
Das Python Script:
# ---------------------------- Bibliotheken -----------------------
import serial
import time
# ---------------------- Variablen und Inistialisierung -----------
# USB Wandler Seriell
PORT = "/dev/ttyUSB0"
# Poll-Frame um Zaehler anzufragen
# Start | Control | Address | Checksum | Stopb
POLL_FRAME = bytes([0x10, 0x5B, 0x00, 0x5B, 0x16])
# Serielle Schnittstelle
ser = serial.Serial(
port=PORT,
baudrate=2400,
bytesize=8,
parity=serial.PARITY_EVEN,
stopbits=1,
timeout=1
)
# ---------------------- Funktionen -------------------------------
#Rohdaten umwandeln
def parse_gas_volume_bcd(data):
# Sucht nach DIF=0x0C und VIF=0x13 und dekodiert die folgenden 4 BCD-Bytes.
for i in range(len(data) - 6):
if data[i] == 0x0C and data[i+1] == 0x13:
b0 = data[i+2]
b1 = data[i+3]
b2 = data[i+4]
b3 = data[i+5]
# BCD dekodieren
digits = []
for b in (b0, b1, b2, b3):
digits.append(b & 0x0F) # Low nibble
digits.append((b >> 4) & 0x0F) # High nibble
# Zahl zusammensetzen
value = 0
factor = 1
for d in digits:
value += d * factor
factor *= 10
# /1000 fuer m3
return value / 1000.0
return None
#Seriell abfragen
def read_mbus():
# Daten anfragen
ser.reset_input_buffer()
ser.write(POLL_FRAME)
ser.flush()
time.sleep(0.1)
data = ser.read(256)
return data
# ---------------------- Programmschleife -------------------------------
while True:
try:
data = read_mbus()
print("Rohdaten:", data)
if data:
volume = parse_gas_volume_bcd(data)
if volume is not None:
print("Gasverbrauch:", volume, "m3")
else:
print("Kein Volumenwert gefunden")
else:
print("Keine Antwort")
except Exception as e:
print("Except Fehler:", e)
time.sleep(15)