import calendar import datetime import json import shutil import time import notify_activity import sys_capabilities import status_mod from operator import itemgetter # When need main only set this to True if False: import sys sys.path.append("../modules/") import FileIface import Activity import WGDBus import FilePaths from xml.etree import ElementTree as ET import fsio import logConfig import channel_mod # Fake globals for syntax check if False: response = None request = None session = None db = None status_mod.sessionUserMgr.setLastVisit(session, request) if logConfig.chanSessFrgt: session.forget(response) json.encoder.FLOAT_REPR = lambda fv: format(fv, '.6f') @auth.requires(request.ajax==True, requires_login=True) def torque_unit_factors_choice(): return response.json(channel_mod.load_torque_unit_factors_choice()) #Note: When any name or group is edited or added, please create translation table new as in main below TABLE_DATA = [ # ---- Kanal {'id':1, 'name':'MNR', 'type': 'string', 'editable': False, 'max':13, 'group': 'Kanal'}, {'id':2, 'name':'Code', 'type': 'string', 'editable': False, 'group': 'Kanal'}, {'id':3, 'name':'SerienNr', 'type': 'string', 'editable': False, 'max':10, 'group': 'Kanal'}, {'id':4, 'name':'Kanalname', 'type': 'filename', 'editable': True, 'max': 40, 'group': 'Kanal'}, {'id':5, 'name':'KanalNr', 'type': 'integer', 'editable': True, 'directediting': True, 'allowBlank': False, 'min':1, 'max':99, 'group': 'Kanal'}, {'id':6, 'name':'ZellId', 'type': 'string', 'editable': True, 'max':4, 'group': 'Kanal'}, #CR10368 {'id':6, 'name':'Wirkungsgrad', 'type': 'double', 'editable': True, 'min': 0, 'max':1, 'group':'Kanal'}, #CR8773 use only Nm{'id':5, 'name':'Einheit', 'type': 'enum', 'editable': True, 'choice': 'Nm,Ftlb,Lnlb,kpm,kgfm,kgm', 'group':'Kanal'}, {'id':8, 'name':'Einheit', 'type': 'enum_array', 'editable': True, 'choice': channel_mod.load_torque_unit_factors_choice(), 'group': 'Kanal'}, {'id':9, 'name':'IdentNr', 'type': 'string', 'editable': True, 'max':20, 'group': 'Kanal'}, {'id':10, 'name':'Kommentar', 'type': 'string', 'editable': True, 'max':400, 'group': 'Kanal'}, # ---- Mfu {'id':101, 'name':'MfuFaktor', 'type': 'double', 'editable': True, 'allowBlank': False, 'min': 0.5, 'max':2.0, 'group':'Mfu'}, {'id':102, 'name':'Datum', 'type': 'date', 'editable': False, 'max':11, 'group': 'Mfu'}, # ---- Wartung {'id':151, 'name':'Aktiv', 'type': 'enum_array', 'editable': True, 'choice': [[True, 'Yes'], [False, 'No']], 'group': 'Wartung'}, {'id':152, 'name':'Zyklus', 'type': 'integer', 'editable': True, 'min':1, 'max':10000000, 'group': 'Wartung'}, {'id':153, 'name':'Datum', 'type': 'dateonly', 'editable': True, 'max':11, 'group': 'Wartung'}, # ---- Letze Wartung {'id':161, 'name':'Datum', 'type': 'dateonly', 'editable': True, 'max':11, 'group': 'LetzteWartung'}, {'id':162, 'name':'Zyklus', 'type': 'integer', 'editable': True, 'min':1, 'max':10000000, 'group': 'LetzteWartung'}, # ---- Getriebe (hidden) # ---- Abtrieb {'id':201, 'name':'MNR', 'type': 'string', 'editable': False, 'group':'Abtrieb'}, {'id':202, 'name':'SerienNr', 'type': 'string', 'editable': True, 'max': 10, 'group':'Abtrieb'}, {'id':203, 'name':'Wirkungsgrad', 'type': 'double', 'editable': True, 'allowBlank': False, 'min': 0.000001, 'max': 1, 'group':'Abtrieb'}, {'id':204, 'name':'Faktor', 'type': 'double', 'editable': True, 'allowBlank': False, 'min': 0.000001, 'max': 9999.9, 'group':'Abtrieb'}, # ---- Sonderabtrieb {'id':250, 'name':'MNR', 'type': 'string', 'editable': True, 'max': 10, 'group':'Sonderabtrieb'}, {'id':251, 'name':'SerienNr', 'type': 'string', 'editable': True, 'max': 10, 'group':'Sonderabtrieb'}, {'id':252, 'name':'Wirkungsgrad', 'type': 'double', 'editable': True, 'allowBlank': False, 'min': 0.000001, 'max': 1, 'group':'Sonderabtrieb'}, {'id':253, 'name':'Faktor', 'type': 'double', 'editable': True, 'allowBlank': False, 'min': 0.000001, 'max': 9999.9, 'group':'Sonderabtrieb'}, {'id':254, 'name':'Moment', 'type': 'string', 'editable': True, 'max': 10, 'group':'Sonderabtrieb', 'allowBlank': False}, # entry removed for CR 8916 {'id':253, 'name':'UmkehrDrehrichtung', 'type': 'bool', 'editable': True, 'group':'Sonderabtrieb'}, {'id':255, 'name':'UmkehrDrehrichtung', 'type': 'enum_array', 'editable': True, 'choice': [[False, 'No'], [True, 'Yes']], 'group':'Sonderabtrieb'}, #{'id':256, 'name':'Zyklus', 'type': 'integer', 'editable': True, 'min': 0, 'max': 1000000, 'group':'Sonderabtrieb'}, # ---- Motor (hidden) # ---- Welle (hidden) # ---- Grenzen # Ueberlast (CR 8920, CR 10370): {'id': 301, 'name': 'Ueberlast', 'type': 'torque', 'editable': False, 'group': 'Grenzen_V1200'}, {'id': 302, 'name': 'DrehzahlMin', 'type': 'integer', 'editable': False, 'group': 'Grenzen_V1200'}, {'id': 303, 'name': 'DrehzahlMax', 'type': 'integer', 'editable': False, 'group': 'Grenzen_V1200'}, {'id': 304, 'name': 'MomentMin', 'type': 'torque', 'editable': False, 'group': 'Grenzen_V1200'}, {'id': 305, 'name': 'MomentMax', 'type': 'torque', 'editable': False, 'group': 'Grenzen_V1200'}, # CR 18937 {'id': 306, 'name': 'DrehzahlMinReduziert', 'type': 'integer', 'editable': False, 'group': 'Grenzen_V1200'}, {'id': 307, 'name': 'MomentMaxReduziert', 'type': 'torque', 'editable': False, 'group': 'Grenzen_V1200'}, # ---- ToolLed {'id': 401, 'name':'Aktiv', 'type': 'enum_array', 'editable': True, 'choice': [[True, 'on'], [False, 'off']], 'group': 'ToolLed'}, {'id': 402, 'name':'Delay', 'type': 'integer', 'editable': True, 'directediting': False, 'unit': 's', 'min': 0, 'max': 5, 'group': 'ToolLed'} ] @auth.requires(request.ajax==True, requires_login=True) def hasScanner(): return response.json(sys_capabilities.hasScanner()) @auth.requires(request.ajax==True, requires_login=True) def read(): data = fsio.jsonload(FilePaths.CHAN_CONF_FILENAME) res = [] for template in TABLE_DATA: item = dict(template) if item['group'] == 'Kanal': if item['name'] == "Einheit": item['value'] = str(data['EinheitDrehmoment']['Aktiv']) elif data.has_key(item['name']): item['value'] = data[item['name']] #print ('#key', item['name'], 'is missing in cfg') else: if data.has_key(item['group']): if data[item['group']].has_key(item['name']): item['value'] = data[item['group']][item['name']] else: pass # print ('###key', item['name'], 'is missing in group', item['group']) else: pass # print ('group key', item['group'], 'is missing in cfg') res.append(item) return response.json(res) @auth.requires(request.ajax==True, requires_login=True) def limits(): maxSrbSteps = FileIface.getMaxSrbSteps() data = fsio.jsonload(FilePaths.CHAN_CONF_FILENAME) data['Grenzen_V1200']['maxsrbsteps'] = maxSrbSteps res = data['Grenzen_V1200'] return response.json(res) @auth.requires(request.ajax==True, requires_login=True) def kanalname(): res = {} data = fsio.jsonload(FilePaths.CHAN_CONF_FILENAME) res['Kanalname'] = data['Kanalname'] return response.json(res) @auth.requires(request.ajax==True, requires_login=True) def update(): ns = request.body.read() newdata = json.loads(ns) if not isinstance(newdata, list): newdata = [newdata] data = fsio.jsonload(FilePaths.CHAN_CONF_FILENAME) now = time.gmtime() kanalnr = None for item in newdata: value = item['value'] if item['id'] in [x['id'] for x in TABLE_DATA if x['group'] == 'Kanal']: if item['name'] == 'Einheit': data['EinheitDrehmoment']['Aktiv'] = item['value'] else: if item['name'] == 'KanalNr': kanalnr = item['value'] data[item['name']] = value elif item['group'] == 'Mfu': if item['id'] == 101: data[item['group']][item['name']] = value data[item['group']]['Datum'] = calendar.timegm(now) if item['id'] == 102: item['value'] = calendar.timegm(now) else: data[item['group']][item['name']] = value if 'Grenzen' not in data: data['Grenzen'] = {} for ue in data['Grenzen_V1200']['Ueberlast']: if ue['Id'] == 0: data['Grenzen']['Ueberlast'] = ue['Wert'] for ue in data['Grenzen_V1200']['MomentMin']: if ue['Id'] == 0: data['Grenzen']['MomentMin'] = ue['Wert'] for ue in data['Grenzen_V1200']['MomentMax']: if ue['Id'] == 0: data['Grenzen']['MomentMax'] = ue['Wert'] data['Grenzen']['DrehzahlMin'] = data['Grenzen_V1200']['DrehzahlMin'] data['Grenzen']['DrehzahlMax'] = data['Grenzen_V1200']['DrehzahlMax'] fsio.jsondump_sorted(FilePaths.CHAN_CONF_FILENAME, data) notify_activity.configChanged(FilePaths.CHAN_CONF_FILENAME, Activity.CHANNEL_CHANGED, session=session) if kanalnr: ressrvData = fsio.jsonload(FilePaths.RESSRV_FILENAME) cfg_path = [i for i in ressrvData['proc'] if i['name'].upper() == 'IPM'][0]['cfg_path'] tree = fsio.readXml(cfg_path) root = tree.getroot() for afo in root.findall('afolist/afo'): afo.attrib['chn'] = str(kanalnr) fsio.writeXml(cfg_path, tree) notify_activity.configChanged(cfg_path, Activity.AFOLIST_CHANGED, session=session) return response.json(newdata) @auth.requires(request.ajax==True, requires_login=True) def default_torque_unit(): channel = fsio.jsonload(FilePaths.CHAN_CONF_FILENAME) return channel.get('EinheitDrehmoment').get('Aktiv') @auth.requires(request.ajax==True, requires_login=True) def torque_unit_factors(): ed = channel_mod.get_torque_unit_factors() return response.json(ed) @auth.requires(request.ajax==True, requires_login=False) def torque_unit_only(): unit = "" ed = channel_mod.get_torque_unit_factors() for x in ed.get('Faktoren'): if int(x.get('Id')) == int(ed.get('Aktiv')): unit = x.get('Einheit') return response.json(unit) #Javascript call not working with requires... #def torque_unit_factors_var(): # response.headers['Content-Type'] = 'application/javascript' # return "var torque_unit_factors = %s" % torque_unit_factors_only() if __name__ == '__main__': #---------------- Get translation table ------------------ keyDict = {} for item in TABLE_DATA: keyDict['\"' + item['group'] + '\" : \"' + item['group'] + '\",'] = '-' for item in TABLE_DATA: keyDict['\"' + item['name'] + '\" : \"' + item['name'] + '\",'] = '-' text = '' keylist = keyDict.keys() keylist.sort() for key in keylist: text += key + '\n' fsio.write("channeldict.txt", text)