Files
sf_adis/ADIS_LKV.py

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