import sys import serial import mysql.connector import datetime module = "myLog" def doLog(message): thisDate = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) print thisDate + " " + message with open("mylog.log", "a") as myfile: myfile.write(thisDate + " " + message + "\n") def readP1(): # ISKRA P1 uitlezen # (c) 03-2017 - P.M.Bloemendaal, based on GJ - gratis te kopieren en te plakken versie = "1.0" # Set COM port config ser = serial.Serial() ser.baudrate = 115200 ser.bytesize = serial.SEVENBITS ser.parity = serial.PARITY_EVEN ser.stopbits = serial.STOPBITS_ONE ser.xonxoff = 0 ser.rtscts = 0 ser.timeout = 20 ser.port = "/dev/ttyUSB0" # Maak een lege dictionary aan ISKRA = {} # Variabelen voor de dictionary # T1_Used # T1_Produced # T2_Used # T2_Produced # Gas_Used # Rate # 1=dal en 2=piek # Cur_Used # Cur_Produced # Open COM port try: ser.open() except: doLog("Fout bij het openen van %s." % ser.name) sys.exit("Fout bij het openen van %s." % ser.name) # We kunnen nu starten met lezen van de P1 poort # Omdat we ergens midden in een telegram beginnen, wachten we op de meter identificatie blnMeterFound = False while not blnMeterFound: p1_line = '' # Read 1 line van de seriele poort try: p1_raw = ser.readline() except: sys.exit("Seriele poort %s kan niet gelezen worden." % ser.name) doLog("Seriele poort %s kan niet gelezen worden." % ser.name) p1_str = str(p1_raw) p1_line = p1_str.strip() if (p1_line[:5] == "/ISK5"): meter_id = p1_line meterFound = True break blnEnd = False while not blnEnd : p1_line = '' # Read 1 line van de seriele poort try: p1_raw = ser.readline() except: sys.exit("Seriele poort %s kan niet gelezen worden." % ser.name) doLog("Seriele poort %s kan niet gelezen worden." % ser.name) p1_line = str(p1_raw).strip() if p1_line <> "" : # Check een einde van een telegram if (p1_line[0]=="!"): blnEnd = True break # Haal de code en de informatie uit de regel p1_line code = p1_line[: p1_line.find("(")].strip() info = p1_line[p1_line.find("("):].strip() info = info[1:len(info)-1] # replace 0 characters in numbers info = info.replace(chr(0),"0") # print "----" # print p1_line # print "-" # print code # print "_" # print info # print "----" if code == "1-0:1.8.1": # totaal afgenomen dal ISKRA["T1_Used"] = float(info[:info.find("*")]) elif code == "1-0:1.8.2": # totaal afgenomen piek ISKRA["T2_Used"] = float(info[:info.find("*")]) elif code == "1-0:2.8.1": # totaal geleverd dal ISKRA["T1_Produced"] = float(info[:info.find("*")]) elif code == "1-0:2.8.2": # totaal geleverd dal ISKRA["T2_Produced"] = float(info[:info.find("*")]) elif code == "0-0:96.14.0": # Rate (1=dal en 2=piek) ISKRA["Rate"] = int(info[0:len(info)]) elif code == "1-0:1.7.0": # huidig gebruik afgenomen ISKRA["Cur_Used"] = float(info[:info.find("*")]) elif code == "1-0:2.7.0": # huidig gebruik geleverd ISKRA["Cur_Produced"] = float(info[:info.find("*")]) elif code == "0-1:24.2.1": # totaal geleverd gas ISKRA["Gas_Used"] = float(info[info.find("(") + 1:info.find("*")]) return ISKRA def storeISKRA(thisISKRA): # Maak een db koppeling # for i in thisISKRA: # print i, thisISKRA[i] conn = mysql.connector.connect(host="192.168.2.50", user="*****", passwd="*****", db="be") SQLinto = "" SQLvalues = "" for i in thisISKRA: if SQLinto == "": SQLinto = SQLinto + "datum, " + i else: SQLinto = SQLinto + ", " + i if SQLvalues == "": SQLvalues = SQLvalues + "now(), "+ str(thisISKRA[i]) else: SQLvalues = SQLvalues + ", " + str(thisISKRA[i]) SQL = "insert into meter (" + SQLinto + ") values (" + SQLvalues + ")" #print SQL curr = conn.cursor() ret = curr.execute(SQL) conn.commit() curr.close conn.close return ret doLog("Starting ISKRA") while True: thisISKRA = readP1() if len(thisISKRA) == 8 : storeISKRA(thisISKRA) else: print "Telegram incomplete: length: " + len(thisISKRA) doLog("Telegram incomplete: length: " + len(thisISKRA))