__load__.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. demeter load
  5. author:rabin
  6. """
  7. from demeter.web import *
  8. class Load(Base):
  9. KEYS = ('user', 'farm')
  10. def setting(self):
  11. self.user()
  12. def user(self):
  13. ajax = self.input('ajax')
  14. if ajax:
  15. self.data['ajax'] = True
  16. else:
  17. self.data['ajax'] = False
  18. self.data['auth'] = True
  19. if 'user' in self.data['setting'] and self.data['setting']['user'] > 0:
  20. self.data['setting']['userInfo'] = self.service('common').one('farm_user', id=self.data['setting']['user'])
  21. self.data['setting']['farm'] = self.data['setting']['userInfo']['farm_id']
  22. else:
  23. return
  24. if 'farm' in self.data['setting'] and self.data['setting']['farm'] > 0:
  25. self.data['setting']['farmInfo'] = self.service('common').one('farm', id=self.data['setting']['farm'])
  26. self.data['setting']['farmInfo']['gateways'] = ''
  27. if self.data['setting']['farmInfo']['gateway']:
  28. self.data['setting']['farmInfo']['gateways'] = tuple(eval(self.data['setting']['farmInfo']['gateway']))
  29. self.data['setting']['msgNum'] = len(self.service('common').list('msg', search={'status':False, "farm_id":self.data['setting']['farm']}, limit='0,100'))
  30. if self.data['setting']['msgNum'] > 99:
  31. self.data['setting']['msgNum'] = str(99) + '+'
  32. self.data['setting']['web'] = Demeter.config['web']['url']
  33. self.data['setting']['farmurl'] = Demeter.config['web']['farmurl']
  34. cur = 'main'
  35. if '/' in self.request.uri:
  36. temp = self.request.uri.split('/')
  37. slen = len(temp)
  38. if slen > 1 and temp[1]:
  39. cur = temp[1]
  40. self.data['setting']['cur'] = cur
  41. class Device(object):
  42. @staticmethod
  43. def init(self, search={}):
  44. type = self.input('type')
  45. id = self.input('id')
  46. if not id:
  47. self.view('404.html')
  48. return (None, type)
  49. if 'stat' in self.request.uri:
  50. self.data['device_cur'] = 'stat'
  51. elif 'log' in self.request.uri:
  52. self.data['device_cur'] = 'log'
  53. elif 'pic' in self.request.uri:
  54. self.data['device_cur'] = 'pic'
  55. else:
  56. self.data['device_cur'] = 'data'
  57. self.data['show'] = True
  58. self.data['url'] = Device.url('type='+type+'&id=' + id)
  59. if not search:
  60. search = {}
  61. self.data['info'] = {}
  62. self.data['device'] = []
  63. if type == 'gateway':
  64. self.data['info'] = self.service('common').one('device_gateway', id=id)
  65. if not self.data['info']:
  66. self.view('404.html')
  67. return (None, type)
  68. search['gateway_id'] = id
  69. self.data['device'] = Device.get(self, search=search)
  70. if self.data['device_cur'] in ('stat', 'log'):
  71. self.data['pic'] = Device.get(self, search={'gateway_id':id, 'hardware_type':6})
  72. elif type == 'page':
  73. self.data['info'] = self.service('common').one('device_page', id=id)
  74. if not self.data['info']:
  75. self.view('404.html')
  76. return (None, type)
  77. search['page_id'] = id
  78. self.data['group'] = self.service('common').list('device_group', search={'page_id':id}, order='inorder asc,cdate desc')
  79. if self.data['group']:
  80. Device.group(self, search)
  81. else:
  82. self.data['info'] = self.data['setting']['farmInfo']
  83. if not self.data['info']:
  84. self.view('404.html')
  85. return (None, type)
  86. self.data['device'] = Device.get(self, search=search)
  87. if not self.data['device'] or not self.data['info']:
  88. self.view('404.html')
  89. return (None, type)
  90. self.data['input'] = {}
  91. self.data['input']['type'] = type
  92. self.data['input']['id'] = id
  93. return (id, type)
  94. @staticmethod
  95. def set(self):
  96. if 'condition' in self.request.uri:
  97. self.data['set_cur'] = 'condition'
  98. elif 'timing' in self.request.uri:
  99. self.data['set_cur'] = 'timing'
  100. elif 'loop' in self.request.uri:
  101. self.data['set_cur'] = 'loop'
  102. else:
  103. self.data['set_cur'] = 'mul'
  104. self.data['url'] = Device.setUrl()
  105. @staticmethod
  106. def setCronOper(self):
  107. self.data['oper'] = ({'id':1, 'name':'打开'},{'id':2, 'name':'关闭'})
  108. self.data['looptype'] = ({'id':1, 'name':'按日周期', 'list':'每天'},{'id':2, 'name':'按周周期', 'list':'每周'}, {'id': 3, 'name': '按月周期', 'list':'每月'})
  109. self.data['opers'] = ({'id':1, 'name':'无操作'}, {'id':2, 'name':'打开'},{'id':3, 'name':'关闭'})
  110. self.data['week'] = ({'id':1, 'name':'周一'},{'id':2, 'name':'周二'}, {'id': 3, 'name': '周三'}, {'id': 4, 'name': '周四'}, {'id': 5, 'name': '周五'}, {'id': 6, 'name': '周六'}, {'id': 7, 'name': '周日'})
  111. self.data['condition'] = ({'id':1, 'name':'大于', 'exp':'>'}, {'id':2, 'name':'小于', 'exp':'<'},{'id':3, 'name':'等于','exp':'='})
  112. self.data['day'] = []
  113. for i in range(31):
  114. i = i + 1
  115. self.data['day'].append({'id':i, 'name':i})
  116. self.data['hour'] = []
  117. for i in range(24):
  118. i = i + 1
  119. self.data['hour'].append({'id':i, 'name':Demeter.hour(i)})
  120. self.data['minute'] = []
  121. for i in range(60):
  122. self.data['minute'].append({'id':i, 'name':Demeter.hour(i)})
  123. @staticmethod
  124. def get(self, search):
  125. if 'id--ins' in search and search['id--ins']:
  126. search['id--ins'] = tuple(eval(search['id--ins']))
  127. return self.service('common').list('device_info', state=True, search=search, order='type_id asc,udate asc,id asc')
  128. @staticmethod
  129. def getByGateway(self, search={}):
  130. device = Device.get(self, search=search)
  131. result = {}
  132. if device:
  133. for value in device:
  134. if value['gateway_id'] not in result:
  135. result[value['gateway_id']] = []
  136. result[value['gateway_id']].append(value)
  137. return result
  138. @staticmethod
  139. def data(self):
  140. id, type = Device.init(self)
  141. if not id:
  142. return
  143. method = type + '_data'
  144. if hasattr(Device, method):
  145. func = getattr(Device, method)
  146. data = func(self, id)
  147. else:
  148. self.view('404.html')
  149. return
  150. #self.data = dict(self.data, **data)
  151. @staticmethod
  152. def gateway_data(self, id):
  153. power = []
  154. sensor = []
  155. control = []
  156. self.data['stat'] = {}
  157. self.data['pic'] = []
  158. self.data['camera'] = []
  159. if self.data['device']:
  160. for value in self.data['device']:
  161. if value['type_id'] > 0:
  162. type_info = self.service('common').one('device_type', id=value['type_id'])
  163. value['unit'] = type_info['unit']
  164. value['typeName'] = type_info['name']
  165. # 获取网关状态
  166. if value['hardware_type'] == 5:
  167. power.append(value)
  168. # 获取电源设备
  169. if value['hardware_type'] == 4:
  170. #value['value'] = Demeter.exp(value['out_exp'], value['value'])
  171. power.append(value)
  172. """
  173. if not self.data['stat']:
  174. self.data['stat'] = value
  175. """
  176. # 获取采集设备
  177. if value['hardware_type'] == 2:
  178. #value['value'] = Demeter.exp(value['out_exp'], value['value'])
  179. sensor.append(value)
  180. if not self.data['stat']:
  181. self.data['stat'] = value
  182. # 获取控制设备
  183. if value['hardware_type'] == 3:
  184. control.append(value)
  185. # 获取摄像头
  186. if value['hardware_type'] == 6:
  187. value['value'] = value['value'] + '?' + Demeter.date(Demeter.time(), '%Y%m%d%H')
  188. self.data['pic'].append(value)
  189. # 获取摄像机
  190. if value['hardware_type'] == 7:
  191. self.data['camera'].append(value)
  192. """
  193. if power:
  194. power.reverse()
  195. """
  196. self.data['list'] = ({'name': '设备状态', 'device': power}, {'name': '数据采集', 'device': sensor}, {'name': '实时设备控制', 'device': control})
  197. @staticmethod
  198. def page_data(self, id):
  199. self.data['list'] = self.data['group']
  200. @staticmethod
  201. def group(self, search):
  202. self.data['show'] = False
  203. self.data['pic'] = []
  204. self.data['camera'] = []
  205. self.data['stat'] = {}
  206. for key, value in enumerate(self.data['group']):
  207. if value['devices']:
  208. search['id--ins'] = value['devices']
  209. if self.data['device_cur'] == 'stat':
  210. search['hardware_type--ins'].append(6)
  211. self.data['group'][key]['device'] = Device.get(self, search=search)
  212. if self.data['group'][key]['device']:
  213. for k, v in enumerate(self.data['group'][key]['device']):
  214. if v['hardware_type'] == 2 or v['hardware_type'] == 4:
  215. #v['value'] = Demeter.exp(v['out_exp'], v['value'])
  216. if v['hardware_type'] == 2 and self.data['info']['stat'] == True and not self.data['stat']:
  217. self.data['stat'] = v
  218. self.data['show'] = True
  219. if v['type_id'] > 0:
  220. type_info = self.service('common').one('device_type', id=v['type_id'])
  221. self.data['group'][key]['device'][k]['unit'] = type_info['unit']
  222. self.data['group'][key]['device'][k]['typeName'] = type_info['name']
  223. if self.data['device_cur'] == 'data':
  224. if v['hardware_type'] == 6:
  225. slen = len(self.data['group'][key]['device'])
  226. if slen < 2:
  227. del self.data['group'][key]['device']
  228. v['name'] = self.data['group'][key]['name']
  229. v['value'] = v['value'] + '?' + Demeter.date(Demeter.time(), '%Y%m%d%H')
  230. self.data['pic'].append(v)
  231. if v['hardware_type'] == 7:
  232. slen = len(self.data['group'][key]['device'])
  233. if slen < 2:
  234. del self.data['group'][key]['device']
  235. v['name'] = self.data['group'][key]['name']
  236. self.data['camera'].append(v)
  237. if self.data['device_cur'] == 'stat':
  238. if v['hardware_type'] == 6:
  239. self.data['pic'] = True
  240. else:
  241. self.data['device'].append(v)
  242. else:
  243. self.data['device'].append(v)
  244. @staticmethod
  245. def pic(self):
  246. id, type = Device.init(self, search={'hardware_type':6})
  247. if not id:
  248. return
  249. state = Device.get(self, search={'hardware_type--ins':(2,4)})
  250. if state:
  251. self.data['show'] = True
  252. device = self.input('device')
  253. if not device:
  254. #如果没有,就获取第一个
  255. self.data['deviceInfo'] = self.data['device'][0]
  256. else:
  257. self.data['deviceInfo'] = self.service('common').one('device_info', id=device)
  258. if not self.data['deviceInfo']:
  259. self.view('404.html')
  260. return
  261. self.data['pic'] = self.service('common').list('device_pic', search={'device_id':self.data['deviceInfo']['id']}, page={'num':12}, order='sdate desc')
  262. if self.data['pic']:
  263. for key, value in enumerate(self.data['pic']):
  264. self.data['pic'][key]['cdates'] = Demeter.date(value['sdate'])
  265. @staticmethod
  266. def statBase(self, deviceInfo={}):
  267. device = self.input('device')
  268. method = self.input('method', 'maxmin')
  269. if not device:
  270. #如果没有,就获取sensor的第一个
  271. self.data['deviceInfo'] = deviceInfo
  272. else:
  273. self.data['deviceInfo'] = self.service('common').one('device_info', id=device)
  274. if not self.data['deviceInfo']:
  275. self.view('404.html')
  276. return
  277. self.data['type'] = self.service('common').one('device_type', id=self.data['deviceInfo']['type_id'])
  278. model = Demeter.model('data', 'tsdb')
  279. self.data['group'] = model.dateConfig()
  280. search_group = self.input('group')
  281. search_start = self.input('start')
  282. search_end = self.input('end')
  283. search = {}
  284. search['device'] = self.data['deviceInfo']['id']
  285. if search_group:
  286. search['group'] = search_group
  287. else:
  288. search['group'] = '1'
  289. if search_start:
  290. search['start'] = search_start
  291. if search_end:
  292. search['end'] = search_end
  293. search['type'] = type
  294. search['id'] = id
  295. self.data['search'] = search
  296. self.data['statList'] = model.getData(method, search, self.data['deviceInfo'])
  297. @staticmethod
  298. def stat(self):
  299. id, type = Device.init(self, search={'hardware_type--ins':[2,4]})
  300. if not id:
  301. return
  302. Device.statBase(self, self.data['device'][0])
  303. self.data['url'] = Device.url('type='+type+'&id=' + id)
  304. @staticmethod
  305. def log(self):
  306. id, type = Device.init(self)
  307. if not id:
  308. return
  309. ids = []
  310. device_type = {}
  311. device_hard = {}
  312. device_list = []
  313. for value in self.data['device']:
  314. ids.append(value['id'])
  315. value['cdates'] = Demeter.date(value['udate'], '%Y.%m.%d')
  316. if value['type_id'] > 0:
  317. info = self.service('common').one('device_type', id=value['type_id'])
  318. if info['id'] not in device_type:
  319. device_type[info['id']] = {'name':info['name'], 'num':1, 'cdate':value['cdates']}
  320. else:
  321. num = device_type[info['id']]['num'] + 1
  322. device_type[info['id']] = {'name':info['name'], 'num':num, 'cdate':value['cdates']}
  323. elif '网关' in value['name']:
  324. value['name'] = '通讯网关'
  325. device_list.append({'name':value['name'], 'num':1, 'cdate':value['cdates']})
  326. elif value['hardware_type'] > 0:
  327. info = self.service('common').one('hardware_type', id=value['hardware_type'])
  328. if info['id'] not in device_hard:
  329. device_hard[info['id']] = {'name':info['name'], 'num':1, 'cdate':value['cdates']}
  330. else:
  331. num = device_hard[info['id']]['num'] + 1
  332. device_hard[info['id']] = {'name':info['name'], 'num':num, 'cdate':value['cdates']}
  333. if device_hard:
  334. for key, value in device_hard.items():
  335. device_list.append({'name':value['name'], 'num':value['num'], 'cdate':value['cdate']})
  336. if device_type:
  337. for key, value in device_type.items():
  338. device_list.append({'name':value['name'], 'num':value['num'], 'cdate':value['cdate']})
  339. self.data['list'] = device_list
  340. # 获取设备日志
  341. self.data['logs'] = self.service('common').list('msg', state=True, search={'device_id-input-ins':ids}, page={'num':6})
  342. if self.data['logs']:
  343. for key, value in enumerate(self.data['logs']):
  344. type_info = self.service('common').one('msg_type', id=value['type_id'])
  345. self.data['logs'][key]['type'] = type_info['name']
  346. self.data['logs'][key]['cdates'] = Demeter.date(value['cdate'])
  347. @staticmethod
  348. def url(param):
  349. config = {}
  350. config['data'] = '/device/data?' + param;
  351. config['stat'] = '/device/stat?' + param;
  352. config['log'] = '/device/log?' + param;
  353. config['pic'] = '/device/pic?' + param;
  354. return config
  355. @staticmethod
  356. def setUrl():
  357. config = {}
  358. config['mul'] = '/device/set_mul'
  359. config['timing'] = '/device/set_timing'
  360. config['loop'] = '/device/set_loop'
  361. config['condition'] = '/device/set_condition'
  362. return config