P1 poort slimme meter – Telegram uitlezen met Python
Er zijn talloze scripts op het internet te vinden om “eenvoudig” telegrammen uit te lezen afkomstig van de P1 poort, maar je stuit al gauw of de diversiteit van de DSMR versie, instellingen en inhooud, hieronder is mijn DSRM 2.x versie (zelf aan te passen naar 4.x)
Geef eenvoudig de telegrammen weer in de console:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#!/usr/bin/env python # Python script om P1 telegram weer te geven import re import serial # Seriele poort confguratie ser = serial.Serial() # DSMR 2.2 > 9600 7E1: ser.baudrate = 9600 ser.bytesize = serial.SEVENBITS ser.parity = serial.PARITY_EVEN ser.stopbits = serial.STOPBITS_ONE # DSMR 4.0/4.2 > 115200 8N1: #ser.baudrate = 115200 #ser.bytesize = serial.EIGHTBITS #ser.parity = serial.PARITY_NONE #ser.stopbits = serial.STOPBITS_ONE ser.xonxoff = 0 ser.rtscts = 0 ser.timeout = 12 ser.port = "/dev/ttyUSB0" ser.close() while True: ser.open() checksum_found = False while not checksum_found: telegram_line = ser.readline() # Lees een seriele lijn in. print(telegram_line.decode('ascii').strip()) # Check wanneer het uitroepteken ontvangen wordt (einde telegram) if re.match(b'(?=!)', telegram_line): checksum_found = True ser.close() |
Nu kunnen we met wat zoeken, knippen en plakken het huidig verbuik kW eruit distileren:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#!/usr/bin/env python # Python script om P1 telegram weer te geven import re import serial # Seriele poort confguratie ser = serial.Serial() # DSMR 2.2 > 9600 7E1: ser.baudrate = 9600 ser.bytesize = serial.SEVENBITS ser.parity = serial.PARITY_EVEN ser.stopbits = serial.STOPBITS_ONE # DSMR 4.0/4.2 > 115200 8N1: #ser.baudrate = 115200 #ser.bytesize = serial.EIGHTBITS #ser.parity = serial.PARITY_NONE #ser.stopbits = serial.STOPBITS_ONE ser.xonxoff = 0 ser.rtscts = 0 ser.timeout = 12 ser.port = "/dev/ttyUSB0" ser.close() while True: ser.open() checksum_found = False while not checksum_found: telegram_line = ser.readline() # Lees een seriele lijn in. telegram_line = telegram_line.decode('ascii').strip() # Strip spaties en blanke regels #print (telegram_line) #debug if re.match(b'(?=1-0:1.7.0)', telegram_line): #1-0:1.7.0 = Actueel verbruik in kW # 1-0:1.7.0(0000.54*kW) kw = telegram_line[10:-4] # Knip het kW gedeelte eruit (0000.54) watt = float(kw) * 1000 # vermengvuldig met 1000 voor conversie naar Watt (540.0) watt = int(watt) # rond float af naar heel getal (540) print watt # Check wanneer het uitroepteken ontavangen wordt (einde telegram) if re.match(b'(?=!)', telegram_line): checksum_found = True ser.close() |