device.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. # -*- coding: utf-8 -*-
  2. """
  3. demeter web page
  4. name:device.py 设备相关页面
  5. author:rabin
  6. """
  7. from .__load__ import *
  8. class gateway_path(Load):
  9. @Web.auth
  10. @Web.setting
  11. def get(self):
  12. self.set(
  13. name = u'网关'
  14. ,path = 'gateway'
  15. ,width = '600'
  16. ,height = '500'
  17. #,add = False
  18. #,edit = False
  19. ,search = (('label-1','cdate-time-start','cdate-time-end','farm_id-select-','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'选择农场',u'网关名称'))
  20. ,thead = (u'所属农场',u'网关名称', u'网关ID', u'所属产品', u'关联服务', u'网关连接状态', u'更新时间')
  21. ,tbody = ('farm','name', 'hardware_id', 'product', 'server', 'status', 'cdate')
  22. ,state = False
  23. )
  24. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  25. self.list('device_gateway', order='hardware_id asc')
  26. if self.data['list']:
  27. for key, value in enumerate(self.data['list']):
  28. farm = self.service('common').one('farm', id=value['farm_id'])
  29. self.data['list'][key]['farm'] = farm['name']
  30. device = self.service('common').list('device_info', search={'hardware_id':value['hardware_id']})
  31. self.data['list'][key]['status'] = '断开'
  32. self.data['list'][key]['product'] = '无'
  33. self.data['list'][key]['server'] = '无'
  34. if value['product_id']:
  35. product = self.service('common').one('setting_product', id=value['product_id'])
  36. self.data['list'][key]['product'] = product['name']
  37. if value['server_id']:
  38. server = self.service('common').one('setting_server', id=value['server_id'])
  39. self.data['list'][key]['server'] = server['name']
  40. if device:
  41. for v in device:
  42. if v['value']:
  43. v['value'] = float(v['value'])
  44. if v['hardware_type'] == 5 and v['value'] == 1:
  45. self.data['list'][key]['status'] = '连接'
  46. elif v['hardware_type'] == 4 and v['value']:
  47. self.data['list'][key]['power_status'] = '连接'
  48. self.data['list'][key]['power_num'] = v['value']
  49. self.show('list')
  50. class gateway_update_path(Load):
  51. @Web.auth
  52. @Web.setting
  53. def get(self):
  54. id = self.input('id')
  55. if id:
  56. #hardware_id = 'hardware_id-show-required'
  57. hardware_id = 'hardware_id-input-required'
  58. else:
  59. hardware_id = 'hardware_id-input-required'
  60. self.set(
  61. path = 'gateway'
  62. ,label = (u'所属农场', u'网关名称', u'网关ID', u'所属产品', u'关联服务', u'设备分布图纸')
  63. ,update = ('farm_id-select-required', 'name-input-required',hardware_id,'product_id-select-','server_id-select-', 'pic-pic-')
  64. ,update_product_id = self.service('common').list('setting_product')
  65. ,update_server_id = self.service('common').list('setting_server')
  66. ,update_farm_id = self.service('common').list('farm', search={'eros_status':2})
  67. )
  68. self.one('device_gateway')
  69. self.show('update')
  70. @Web.auth
  71. @Web.setting
  72. def post(self):
  73. id = self.update('device_gateway')
  74. self.device(id)
  75. @Web.auth
  76. @Web.setting
  77. def delete(self):
  78. self.drop('device_gateway')
  79. @Web.auth
  80. @Web.setting
  81. def device(self, id):
  82. info = self.service('common').one('device_gateway', id=id)
  83. self.service('device').addDeviceByGateway(info)
  84. class info_path(Load):
  85. @Web.auth
  86. @Web.setting
  87. def get(self):
  88. self.set(
  89. name = u'设备'
  90. ,path = 'info'
  91. ,width = '600'
  92. ,height = '400'
  93. ,button = ({'name':'添加摄像机','link':'/device/camera_update'},{'name':'添加摄像头','link':'/device/camera_pic_update'})
  94. ,add = False
  95. #,edit = False
  96. ,search = (('farm_id-select--gateway_id', 'hardware_type-select-','type_id-select-','name-input-mlike', 'status-hidden-'), (u'选择农场',u'硬件类型',u'设备类型',u'设备名称', '设备状态'))
  97. ,thead = (u'所属农场',u'设备名称', u'设备id', u'当前值', u'设备类型', u'网关',u'硬件类型')
  98. ,tbody = ('farm','name', 'hardware_id', 'value', 'type', 'gateway', 'hardware_type')
  99. ,state = True
  100. )
  101. self.data['common']['search_farm_id-select--gateway_id'] = Demeter.config['setting']['farmList']
  102. self.data['common']['search_type_id-select-'] = self.service('common').list('setting_device_type')
  103. self.data['common']['search_gateway_id-select---farm_id'] = self.service('common').list('device_gateway', order='hardware_id asc')
  104. self.data['common']['search_hardware_type-select-'] = self.service('common').list('hardware_type')
  105. """
  106. if self.data['common']['search_hardware_type-select-']:
  107. del self.data['common']['search_hardware_type-select-'][0]
  108. """
  109. status = self.input('search_status-hidden-', False)
  110. if status:
  111. self.data['search']['status'] = False
  112. self.list('device_info', order='inorder asc, type_id asc,udate asc,hardware_id asc')
  113. if self.data['list']:
  114. for key, value in enumerate(self.data['list']):
  115. farm = self.service('common').one('farm', id=value['farm_id'])
  116. self.data['list'][key]['farm'] = farm['name']
  117. self.data['list'][key]['type'] = '无'
  118. if value['type_id']:
  119. type_info = self.service('common').one('setting_device_type', id=value['type_id'])
  120. if type_info:
  121. self.data['list'][key]['type'] = type_info['name']
  122. info = self.service('common').one('device_gateway', id=value['gateway_id'])
  123. self.data['list'][key]['gateway'] = info['name']
  124. if value['status']:
  125. self.data['list'][key]['status'] = '已连接'
  126. else:
  127. self.data['list'][key]['status'] = '已断开'
  128. if not value['value']:
  129. value['value'] = ''
  130. self.data['list'][key]['value'] = '无'
  131. elif value['hardware_type'] == 2 or value['hardware_type'] == 4:
  132. if value['type_id'] and type_info:
  133. value['value'] = value['value'] + ' ' + type_info['unit']
  134. self.data['list'][key]['value'] = '<a href="/device/stat?id='+value['id']+'&search_date-select-=1&method=list">'+value['value'] + '</a><br />更新时间:' + Demeter.date(value['cdate']) + '<br /><a href="/device/stat?id='+value['id']+'&search_date-select-=1&method=avg">[平均值统计]</a> <a href="/device/stat?id='+value['id']+'&search_date-select-=1&method=maxmin">[高低值统计]</a>'
  135. elif value['hardware_type'] == 6:
  136. self.data['list'][key]['value'] = '<a href="/device/pic?id='+value['id']+'"><img src="'+value['value']+'" width="200px"/></a><br />更新时间:' + Demeter.date(value['cdate'])
  137. elif value['hardware_type'] == 3:
  138. if value['status']:
  139. status = ''
  140. else:
  141. status = 'disabled'
  142. url = '/device/info'
  143. import math
  144. value['value'] = math.ceil(float(value['value']))
  145. if value['value'] == 1:
  146. value['value'] = '开'
  147. else:
  148. value['value'] = '关'
  149. '''
  150. if value['value'] == 1:
  151. #disabled
  152. self.data['list'][key]['value'] = '<input type="checkbox" name="switch" lay-filter="switch" lay-skin="switch" checked '+status+' value="1" data-value="0" data-id="'+value['id']+'" data-url="'+url+'">'
  153. else:
  154. self.data['list'][key]['value'] = '<input type="checkbox" lay-filter="switch" name="switch" lay-skin="switch" '+status+' value="0" data-value="1" data-id="'+value['id']+'" data-url="'+url+'">'
  155. '''
  156. self.data['list'][key]['value'] = value['value']
  157. elif value['hardware_type'] == 5:
  158. if value['value'] == '1':
  159. self.data['list'][key]['value'] = '已连接'
  160. else:
  161. self.data['list'][key]['value'] = '已断开'
  162. hardware_type = self.service('common').one('hardware_type', id=value['hardware_type'])
  163. self.data['list'][key]['hardware_type'] = hardware_type['name']
  164. self.show('list')
  165. @Web.auth
  166. @Web.setting
  167. def post(self):
  168. id = self.input('id')
  169. value = self.input('value')
  170. if id:
  171. Demeter.service('device').switch(id, value)
  172. self.out('yes', {'state':id})
  173. else:
  174. self.out('no')
  175. class info_update_path(Load):
  176. @Web.auth
  177. @Web.setting
  178. def get(self):
  179. self.one('device_info')
  180. if self.data['info']['hardware_type'] == 7:
  181. self.set(
  182. path = 'camera'
  183. #,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'选择硬件类型', u'摄像机地址')
  184. #,update = ('name-input-required','hardware_id-show-','farm_id-select-required','gateway_id-select-required','hardware_type-select-required','value-text-required')
  185. ,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'摄像机地址', u'排序')
  186. ,update = ('name-input-required','hardware_id-show-','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required','inorder-input-')
  187. ,update_farm_id = self.service('common').list('farm', search={'eros_status':2})
  188. ,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
  189. #,update_hardware_type = self.service('common').list('hardware_type')
  190. )
  191. elif self.data['info']['hardware_type'] == 6:
  192. self.set(
  193. path = 'camera_pic'
  194. ,label = (u'摄像头名称', u'摄像头id', u'所属农场', u'选择网关', u'摄像头地址', u'排序')
  195. ,update = ('name-input-required','hardware_id-show-','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required','inorder-input-')
  196. ,update_farm_id = self.service('common').list('farm', search={'eros_status':2})
  197. ,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
  198. )
  199. elif self.data['info']['hardware_type'] in (2,4):
  200. self.set(
  201. path = 'info'
  202. #,label = (u'设备名称', u'设备id', u'计算公式', u'实时计算公式')
  203. #,update = ('name-input-required','hardware_id-show-',u'exp-text--{n}为当前数据,只处理最新数据',u'out_exp-text--处理所有数据,比较消耗服务器资源')
  204. ,label = (u'设备名称', u'设备id', u'计算公式', u'排序')
  205. ,update = ('name-input-required','hardware_id-show-',u'exp-input--{n}为当前数据,只处理最新数据','inorder-text-')
  206. )
  207. else:
  208. self.set(
  209. path = 'info'
  210. ,label = (u'设备名称', u'设备id', u'排序')
  211. ,update = ('name-input-required','hardware_id-show-','inorder-input-')
  212. )
  213. self.show('update')
  214. @Web.auth
  215. @Web.setting
  216. def post(self):
  217. self.update('device_info')
  218. @Web.auth
  219. @Web.setting
  220. def delete(self):
  221. self.drop('device_info')
  222. """
  223. self.one('device_info')
  224. if self.input('state') == 'True' or (self.data['info'] and 'hardware_type' in self.data['info'] and self.data['info']['hardware_type'] == 7):
  225. self.drop('device_info')
  226. else:
  227. #除摄像机之外,其余设备不允许删除
  228. self.out('no')
  229. """
  230. class camera_path(Load):
  231. @Web.auth
  232. @Web.setting
  233. def get(self):
  234. self.redirect('/device/info?search_hardware_type=7')
  235. class camera_update_path(Load):
  236. @Web.auth
  237. @Web.setting
  238. def get(self):
  239. self.set(
  240. path = 'camera'
  241. ,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'摄像机地址',u'排序')
  242. ,update = ('name-input-required','hardware_id-input-required','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required','inorder-text-')
  243. ,update_farm_id = self.service('common').list('farm', search={'eros_status':2})
  244. ,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
  245. )
  246. self.one('device_info')
  247. self.show('update')
  248. @Web.auth
  249. @Web.setting
  250. def post(self):
  251. self.data['update']['hardware_type'] = 7
  252. self.data['update']['type_id'] = 0
  253. self.update('device_info')
  254. @Web.auth
  255. @Web.setting
  256. def delete(self):
  257. self.drop('device_info')
  258. class camera_pic_path(Load):
  259. @Web.auth
  260. @Web.setting
  261. def get(self):
  262. self.redirect('/device/info?search_hardware_type=6')
  263. class camera_pic_update_path(Load):
  264. @Web.auth
  265. @Web.setting
  266. def get(self):
  267. self.set(
  268. path = 'camera_pic'
  269. ,label = (u'摄像头名称', u'摄像头id', u'所属农场', u'选择网关', u'摄像头地址',u'排序')
  270. ,update = ('name-input-required','hardware_id-input-required','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required','inorder-text-')
  271. ,update_farm_id = self.service('common').list('farm', search={'eros_status':2})
  272. ,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
  273. )
  274. self.one('device_info')
  275. self.show('update')
  276. @Web.auth
  277. @Web.setting
  278. def post(self):
  279. self.data['update']['hardware_type'] = 6
  280. self.data['update']['type_id'] = 0
  281. self.update('device_info')
  282. @Web.auth
  283. @Web.setting
  284. def delete(self):
  285. self.drop('device_info')
  286. class pic_path(Load):
  287. @Web.auth
  288. @Web.setting
  289. def get(self):
  290. self.set(
  291. name = u'摄像头图片'
  292. ,path = 'pic'
  293. ,width = '600'
  294. ,height = '300'
  295. ,add = False
  296. ,edit = False
  297. ,search = (('label-1','sdate-time-start','sdate-time-end'), (u'日期范围',u'开始时间',u'截止时间'))
  298. ,thead = (u'图片地址', u'更新时间')
  299. ,tbody = ('pic', 'sdate')
  300. ,state = False
  301. )
  302. self.list('device_pic', order='sdate desc')
  303. if self.data['list']:
  304. for key, value in enumerate(self.data['list']):
  305. self.data['list'][key]['pic'] = '<img src="'+value['pic']+'" width="200px" />'
  306. self.show('list')
  307. class stat_path(Load):
  308. @Web.auth
  309. @Web.setting
  310. def get(self):
  311. method = self.input('method', 'avg')
  312. id = self.input('id')
  313. self.set(
  314. name = u'设备统计'
  315. ,path = 'stat'
  316. ,search = (('label-1','cdate-time-start','cdate-time-end', 'date-select-'), (u'日期范围',u'开始时间',u'截止时间',u'周期选择'))
  317. )
  318. data = self.service('common').one('device_info', id=id)
  319. typeInfo = self.service('common').one('setting_device_type', id=data['type_id'])
  320. farm = self.service('common').one('farm', id=data['farm_id'])
  321. self.data['info'] = data
  322. self.data['type'] = typeInfo
  323. self.data['farm'] = farm
  324. self.data['method'] = method
  325. model = Demeter.model('data', 'tsdb')
  326. self.data['common']['search_date-select-'] = model.dateConfig()
  327. search = {}
  328. if 'cdate-time-start' in self.data['search']:
  329. search['start'] = self.data['search']['cdate-time-start']
  330. if 'cdate-time-end' in self.data['search']:
  331. search['end'] = self.data['search']['cdate-time-end']
  332. if 'date-select-' in self.data['search']:
  333. search['group'] = self.data['search']['date-select-']
  334. self.data['list'] = model.getData(method, search, data)
  335. self.show('stat')
  336. class printer_path(Load):
  337. @Web.auth
  338. @Web.setting
  339. def get(self):
  340. self.set(
  341. name = u'打印机'
  342. ,path = 'printer'
  343. ,width = '600'
  344. ,height = '400'
  345. ,search = (('farm_id-select-','name-input-mlike'), (u'选择农场',u'打印机名称'))
  346. ,thead = (u'所属农场', u'打印机名称', u'打印机地址', u'更新时间')
  347. ,tbody = ('farm','name', 'host', 'cdate')
  348. ,state = True
  349. )
  350. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  351. self.list('device_printer')
  352. if self.data['list']:
  353. for key, value in enumerate(self.data['list']):
  354. farm = self.service('common').one('farm', id=value['farm_id'])
  355. self.data['list'][key]['farm'] = farm['name']
  356. self.show('list')
  357. class printer_update_path(Load):
  358. @Web.auth
  359. @Web.setting
  360. def get(self):
  361. self.set(
  362. path = 'printer'
  363. ,label = (u'所属农场', u'打印机名称', u'打印机地址')
  364. ,update = ('farm_id-select-required', 'name-input-required','host-input-required')
  365. ,update_farm_id = self.service('common').list('farm', search={'eros_status':2})
  366. )
  367. self.one('device_printer')
  368. self.show('update')
  369. @Web.auth
  370. @Web.setting
  371. def post(self):
  372. self.update('device_printer')
  373. @Web.auth
  374. @Web.setting
  375. def delete(self):
  376. self.drop('device_printer')
  377. class notice_type_path(Load):
  378. @Web.auth
  379. @Web.setting
  380. def get(self):
  381. self.set(
  382. name = u'错误码设置'
  383. ,path = '/device/notice_type'
  384. ,width = '600'
  385. ,height = '300'
  386. ,search = (('name-input-mlike','key-input-mlike'), (u'错误码描述',u'错误码key'))
  387. ,thead = (u'ID', u'错误码描述',u'错误码key', u'更新时间')
  388. ,tbody = ('id', 'name', 'key', 'cdate')
  389. ,state = False
  390. )
  391. self.list('notice_type')
  392. self.show('list')
  393. class notice_type_update_path(Load):
  394. @Web.auth
  395. @Web.setting
  396. def get(self):
  397. self.set(
  398. path = '/device/notice_type'
  399. ,label = (u'错误码描述', u'错误码key')
  400. ,update = ('name-input-required', 'key-input-required')
  401. )
  402. self.one('notice_type')
  403. self.show('update')
  404. @Web.auth
  405. @Web.setting
  406. def post(self):
  407. self.update('notice_type')
  408. @Web.auth
  409. @Web.setting
  410. def delete(self):
  411. self.drop('notice_type')
  412. class log_path(Load):
  413. @Web.auth
  414. @Web.setting
  415. def get(self):
  416. self.set(
  417. name = u'网关日志'
  418. ,path = '/device/log'
  419. ,width = '600'
  420. ,height = '600'
  421. ,add = False
  422. ,edit = False
  423. ,search = (('farm_id-select-','content-input-mlike'), (u'选择农场', u'内容'))
  424. ,thead = (u'所属农场', u'所属网关', u'日志内容',u'发送时间')
  425. ,tbody = ('farm','gateway', 'content', 'cdate')
  426. ,state = False
  427. )
  428. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  429. self.list('log')
  430. if self.data['list']:
  431. for key, value in enumerate(self.data['list']):
  432. farm = self.service('common').one('farm', id=value['farm_id'])
  433. self.data['list'][key]['farm'] = farm['name']
  434. gateway = self.service('common').one('device_gateway', id=value['gateway_id'])
  435. self.data['list'][key]['gateway'] = gateway['name']
  436. self.show('list')