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))