282 lines
10 KiB
Python
Executable File
282 lines
10 KiB
Python
Executable File
from time import time, strftime
|
|
from datetime import datetime
|
|
import os
|
|
|
|
entities = {}
|
|
"""
|
|
Entity 990001
|
|
Header AGRO 2015
|
|
"""
|
|
#NR, ART, ITEM, NAME, TYPE, LEN, RESOLUTION, UNIT, CODE
|
|
entities ['990001'] = [
|
|
(1, 'KEY', '00000000', 'DD-Typ', 'AN', 8, 0, '', 0),
|
|
(2, 'MAN', '00900002', 'DD ISO Version', 'AN', 8, 0, '', 0),
|
|
(3, 'MAN', '00900003', 'Erstelldatum', 'N', 8, 0, 'CCYYMMDD', 0),
|
|
(4, 'MAN', '00900004', 'Erstellzeit', 'N', 6, 0, 'hhmmss', 0),
|
|
(5, 'OPT', '00900005', 'Systemstatus', 'N', 1, 0, '', 0),
|
|
(6, 'MAN', '00900006', 'Absender', 'AN', 24, 0, '', 0),
|
|
(7, 'OPT', '00900007', 'Empfaenger', 'AN', 24, 0, '', 0),
|
|
(8, 'OPT', '00900008', 'Senderversion', 'AN', 8, 0, '', 0),
|
|
(9, 'MAN', '00900009', 'ADED-Nation.-Vers.', 'AN', 8, 0, '', 0),
|
|
(10, 'OPT', '00900010', 'Module 10 Checksumme', 'AN', 1, 0, '', 0),
|
|
(11, 'OPT', '00900011', 'Bez. Prozesscomputer', 'AN', 10, 0, '', 0),
|
|
(12, 'OPT', '00900012', 'ADED-Herstellerversion', 'AN', 10, 0, '', 0)
|
|
]
|
|
|
|
|
|
"""
|
|
Entity 880001
|
|
Betriebsdaten am Prueftag
|
|
"""
|
|
#NR, ART, ITEM, NAME, TYPE, LEN, RESOLUTION, UNIT, CODE
|
|
entities ['880001'] = [
|
|
(1, 'MAN', '00800004', 'Betrieb Nr', 'N', 15, 0, '', 0),
|
|
(2, 'OPT', '00800043', 'Betriebstaette (AE)', 'N', 2, 0, '', 0),
|
|
(3, 'KEY', '00900032', 'Pruefdatum', 'N', 8, 0, 'CCYYMMDD', 0),
|
|
(4, 'OPT', '00800136', 'Pruefmethode', 'AN', 1, 0, '', 0),
|
|
(5, 'OPT', '00800138', 'Pruefschema', 'AN', 1, 0, '', 0),
|
|
(6, 'OPT', '00800139', 'Pruefintervall', 'AN', 1, 0, '', 0),
|
|
(7, 'OPT', '00800140', 'Melkfrequenz', 'AN', 1, 0, '', 0),
|
|
(8, 'OPT', '00800025', 'Pruefbezirksnummer', 'N', 4, 0, '', 0),
|
|
(9, 'OPT', '00800027', 'Probenehmernummer', 'N', 15, 0, '', 0),
|
|
(10, 'OPT', '00800028', 'Personalnummer KA', 'N', 15, 0, '', 0),
|
|
(11, 'OPT', '00800704', 'Melkbeginnzeit abends', 'N', 14, 0, '', 0),
|
|
(12, 'OPT', '00800707', 'Melkendezeit abends', 'N', 14, 0, '', 0),
|
|
(13, 'OPT', '00800705', 'Melkbeginnzeit morgens', 'N', 14, 0, '', 0),
|
|
(14, 'OPT', '00800708', 'Melkendezeit morgens', 'N', 14, 0, '', 0),
|
|
(15, 'OPT', '00800706', 'Gemelk f. alternierende Probenentnahme', 'AN', 1, 0, '', 0),
|
|
(11, 'OPT', '00800001', 'Schluesselart Betrieb', 'N', 1, 0, '', 0)
|
|
]
|
|
|
|
|
|
"""
|
|
Entity 880022
|
|
Gemelkerfassung AGRO 2015
|
|
"""
|
|
#NR, ART, ITEM, NAME, TYPE, LEN, RESOLUTION, UNIT, CODE
|
|
entities ['880022'] = [
|
|
(1, 'KEY', '00900080', 'Rind-ID', 'N', 15, 0, '', 0),
|
|
(2, 'MAN', '00800004', 'Betrieb Nr', 'N', 15, 0, '', 0),
|
|
(3, 'MAN', '00800043', 'Betriebstaette (AE)', 'N', 2, 0, '', 0),
|
|
(4, 'OPT', '00900045', 'Name', 'AN', 24, 0, '', 0),
|
|
(5, 'KEY', '00900054', 'Datum (Melken)', 'N', 8, 0, 'CCYYMMDD', 0),
|
|
(6, 'KEY', '00900078', 'Startzeit (Melken)', 'N', 6, 0, 'hhmmss', 0),
|
|
(7, 'OPT', '00900042', 'Milchmenge im Gemelk', 'N', 3, 1, 'KG', 0),
|
|
(8, 'OPT', '00900024', 'Kastennummer', 'N', 6, 0, '', 0),
|
|
(9, 'OPT', '00900025', 'Flaschennummer', 'N', 4, 0, '', 0),
|
|
(10, 'OPT', '00800700', 'Barcode', 'N', 10, 0, '', 0),
|
|
(11, 'OPT', '00800701', 'gemolken', 'N', 1, 0, '', 8889),
|
|
(12, 'OPT', '00800703', 'Melkereignis', 'AN', 3, 0, '', 999),
|
|
(13, 'OPT', '00800702', 'Zwischenmelkzeit', 'N', 6, 0, '', 0),
|
|
(14, 'OPT', '00900070', 'Stallnummer', 'N', 15, 0, '', 0),
|
|
(15, 'OPT', '00804841', 'Bemerkungen', 'AN', 30, 0, '', 0),
|
|
(16, 'OPT', '00800134', 'RFID', 'AN', 20, 0, '', 0),
|
|
(17, 'OPT', '00900097', 'Herdenspez. Elektron. ID', 'AN', 16, 0, '', 0),
|
|
(18, 'OPT', '00800122', 'Melkplatz', 'AN', 3, 0, '', 0),
|
|
(19, 'OPT', '00800123', 'Milchflussdauer AMS', 'N', 4, 0, '', 0)
|
|
]
|
|
|
|
class ADIS:
|
|
def __init__ (self, loglevel):
|
|
self.loglevel = loglevel
|
|
#Optional Fields for an entity
|
|
self.entityfields = {'880001': [],
|
|
'880022': ['00900042', '00800123', '00900070'],
|
|
'990001': [ '00900007', '00900009']}
|
|
self.businessinfos = {}
|
|
|
|
|
|
def log (self, msg, _level = 3):
|
|
"""
|
|
Logfile
|
|
Loglevel 9 = print to console
|
|
"""
|
|
if self.loglevel == 9:
|
|
print (msg)
|
|
if _level <= self.loglevel:
|
|
file = open ("/var/log/lactor/LKV" + os.getcwd().split('/')[-1] + '.err', "a")
|
|
dt = datetime.now ()
|
|
file.write ("%4d-%02d-%02d %02d:%02d:%02d.%06d: " %(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond) + msg + "\n")
|
|
file.close ()
|
|
|
|
def updatebusinessinfos (self, businessinfos):
|
|
"""
|
|
Betriebsdaten
|
|
updaten
|
|
"""
|
|
self.businessinfos = businessinfos
|
|
if not 'businessid' in businessinfos or businessinfos ['businessid'] == "":
|
|
businessinfos ['businessid'] = 0
|
|
|
|
#Betriebsnummer in ADIS ID Aendern
|
|
businessinfos ['00800004'] = businessinfos ['businessid']
|
|
del businessinfos ['businessid']
|
|
|
|
|
|
|
|
def generated (self, entity):
|
|
#Generate Datadefiniton
|
|
l = 'DN' + entity
|
|
for nr, art, item, name, datatype, length, resolution, unit, code in entities [entity]:
|
|
if art in ['KEY', 'MAN'] or item in self.entityfields [entity]:
|
|
l += '%s%02d%01d' % (item, length, resolution)
|
|
return l
|
|
|
|
|
|
def createaheader (self):
|
|
"""
|
|
Header
|
|
"""
|
|
fields = entities ['990001']
|
|
|
|
data = {'00000000': 'DD'}
|
|
data ['00900002'] = 1996
|
|
data ['00900003'] = datetime.now().strftime ('%Y%m%d')
|
|
data ['00900004'] = datetime.now().strftime ('%H%M%S')
|
|
data ['00900006'] = 'Siliconform'
|
|
data ['00900007'] = 'LKV'
|
|
data ['00900008'] = '1.00'
|
|
data ['00900009'] = 'AGRO2015'
|
|
ds = "VH990001"
|
|
for nr, art, item, name, datatype, length, resolution, unit, code in fields:
|
|
if art in ['KEY', 'MAN'] or item in self.entityfields ['990001']:
|
|
self.log ("Item %s needed" % item, 9)
|
|
if item in data:
|
|
if datatype == 'AN':
|
|
_v = str (data[item]).rjust (int (length))
|
|
ds += _v [len (_v) - int (length):]
|
|
elif datatype == 'N':
|
|
_v = "%d" % (int (data[item] * (10**int (resolution))))
|
|
_v = _v.rjust (int (length))
|
|
ds += _v[len (_v) - int (length):]
|
|
else:
|
|
ds += '?' * length
|
|
self.log (ds, 9)
|
|
return ds
|
|
|
|
|
|
def createbusinessinfos (self):
|
|
"""
|
|
Betriebsdaten am Prueftag
|
|
"""
|
|
fields = entities ['880001']
|
|
data = self.businessinfos
|
|
data ['00900032'] = datetime.now().strftime ('%Y%m%d')
|
|
|
|
ds = "VN880001"
|
|
for nr, art, item, name, datatype, length, resolution, unit, code in fields:
|
|
if art in ['KEY', 'MAN'] or item in self.entityfields ['880001']:
|
|
self.log ("Item %s needed" % item, 9)
|
|
if item in data:
|
|
if datatype == 'AN':
|
|
_v = str (data[item]).rjust (int (length))
|
|
ds += _v [len (_v) - int (length):]
|
|
elif datatype == 'N':
|
|
_v = "%d" % (int (data[item] * (10**int (resolution))))
|
|
_v = _v.rjust (int (length))
|
|
ds += _v[len (_v) - int (length):]
|
|
else:
|
|
ds += '?' * length
|
|
self.log (ds, 9)
|
|
return ds
|
|
|
|
|
|
def createmilkdataset (self, animalinfo, milkdata):
|
|
"""
|
|
Creating entity for 880022
|
|
"""
|
|
animalnr, earmark, rfid, forbidmilk, tsforbidstart, tsforbidend, seperation = animalinfo
|
|
#Check milking forbidden
|
|
milkforbid = 0
|
|
if forbidmilk:
|
|
milkforbid = 1
|
|
#if forbidmilk and tsforbidstart:
|
|
# dttsforbidstart = datetime.strptime (tsforbidstart + ' 00:00:00', '%Y-%m-%d %H:%M:%S')
|
|
# if datetime.now () > dttsforbidstart:
|
|
# if tsforbidend:
|
|
# dttsforbidend = datetime.strptime (tsforbidend + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
|
|
# if datetime.now () <= dttsforbidend:
|
|
# milkforbid = 1
|
|
# else:
|
|
# milkforbid = 1
|
|
|
|
retval = ""
|
|
for ammount, time, mdate, starttime in milkdata:
|
|
data = {'00900070': animalnr}
|
|
data ['00800004'] = self.businessinfos ['00800004']
|
|
data ['00800043'] = '9'
|
|
data ['00900080'] = earmark
|
|
data ['00800143'] = rfid
|
|
data ['00900054'] = mdate.replace ("-", "")
|
|
data ['00900078'] = starttime.replace (":", "")
|
|
data ['00900042'] = float (ammount) / 1000.0 #0.1kg
|
|
data ['00800123'] = int (time)
|
|
#data ['00201860'] = milkplace
|
|
|
|
ds = "VN880022"
|
|
for nr, art, item, name, datatype, length, resolution, unit, code in entities ['880022']:
|
|
if art in ['KEY', 'MAN'] or item in self.entityfields ['880022']:
|
|
self.log ("Item %s needed" % item, 9)
|
|
if item in data:
|
|
if datatype == 'AN':
|
|
_v = str (data[item]).rjust (int (length))
|
|
ds += _v [len (_v) - int (length):]
|
|
elif datatype == 'N':
|
|
_v = "%d" % (int (data[item] * (10**int (resolution))))
|
|
_v = _v.rjust (int (length))
|
|
if unit == 'hhmmss':
|
|
_v = _v.replace (" ", "0")
|
|
ds += _v[len (_v) - int (length):]
|
|
|
|
self.log (ds, 9)
|
|
retval += ds + "\n"
|
|
return retval
|
|
|
|
|
|
|
|
def createlkv (businessinfos, animalinfos, milkdata):
|
|
"""
|
|
LKV Daten generieren
|
|
"""
|
|
adis = ADIS (loglevel = 0)
|
|
adis.updatebusinessinfos (businessinfos)
|
|
retval =""
|
|
#Datendefinition und Header generieren
|
|
dh = adis.generated ('990001').replace ('DN', 'DH')
|
|
retval += dh + "\n"
|
|
|
|
header = adis.createaheader ()
|
|
retval += header + "\n" + "TN\n"
|
|
|
|
#Datendefinition und Daten Betriebsdaten am Prueftag generieren
|
|
dd = adis.generated ('880001')
|
|
retval += dd + "\n"
|
|
|
|
ds = adis.createbusinessinfos ()
|
|
retval += ds + "\n"
|
|
|
|
#Datendefinition Melkungen generieren
|
|
dd = adis.generated ('880022')
|
|
retval += dd + "\n"
|
|
|
|
if animalinfos:
|
|
for animalnr, earmark, rfid, forbidmilk, tsforbidstart, tsforbidend, seperation in animalinfos:
|
|
if animalnr in milkdata:
|
|
ds = adis.createmilkdataset ((animalnr, earmark, rfid, forbidmilk, tsforbidstart, tsforbidend, seperation), milkdata[animalnr])
|
|
retval += ds
|
|
else:
|
|
return "help"
|
|
retval += "TN\n"
|
|
retval += "ZN\n"
|
|
return retval
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
businessinfos = {'businessid' : '123567'}
|
|
animalinfos = [(100, '2730000000000000', '', '1', '2019-09-11', '2019-09-20'), 'Normal']
|
|
milkdata = {100: [(3462, 177.6, '2019-08-11', '06:26:47'), (1235, 421.6, '2019-08-07', '18:06:43')]}
|
|
print (createlkv (businessinfos, animalinfos, milkdata))
|
|
|
|
|