#!/usr/bin/python # Python code to read values from Smart Meter via SML (smart message language) # created: Alexander Kabza, Mar 1, 2016 # last mod: Alexander Kabza, 2017-10-25 # For documentation and further information see http://www.kabza.de/MyHome/SmartMeter.html import sys import serial import time def writexml(t, W, P): file = open('/var/www/html/SmartMeter.xml', 'w') file.write('') file.close() port = serial.Serial( port='/dev/ttyAMA0', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) #port.open(); start = '1b1b1b1b01010101' end = '1b1b1b1b1a' data = '' while True: char = port.read() data = data + char.encode('HEX') pos = data.find(start) if (pos <> -1): data = data[pos:len(data)] pos = data.find(end) if (pos <> -1): # print data + '\n' timestamp = (time.strftime("%Y-%m-%d ") + time.strftime("%H:%M:%S")) result = timestamp # search = '070100000000ff' # pos = data.find(search) # if (pos <> -1): # pos = pos + len(search) + 10 # value = data[pos:pos + 18] # print 'ID: ' + search + ' = ' + value + ' = ' + value.decode('HEX') search = '070100010800ff' pos = data.find(search) if (pos <> -1): pos = pos + len(search) + 14 value = data[pos:pos + 16] energy = int(value, 16) / 1e4 # print 'kWh: ' + search + ' = ' + value + ' = ' + str(energy) + ' kWh' result = result + ';' + str(energy) search = '070100010700ff' pos = data.find(search) if (pos <> -1): pos = pos + len(search) + 14 value = data[pos:pos + 8] power = int(value, 16) / 1e2 # print 'W: ' + search + ' = ' + value + ' = ' + str(power) + ' W' result = result + ';' + str(power) writexml(timestamp, energy, power) file = open('/home/pi/output.csv', 'a') file.write (result + '\n') file.close() # file = open('message.dat', 'w') # file.write (data) # file.close() data = ''